【AWS】セッションマネージャーを使ってプライベートインスタンスへアクセス!【EC2】

今回はこのような質問をいただきました。

プライベートサブネットに構築したEC2にアクセスしたい!
このような場合、踏み台サーバーを経由して接続することが多いですが、セッションマネージャーを利用することで踏み台サーバーが不要になります。
ポート開放も不要になるのでセキュリティも高まりますね!
そこで今回はこちらの質問について解説していきます!
IAMロールを用意する!
まずは構築するEC2インスタンスに付与するIAMロールを作成します。
ユースケースはEC2を選択。

ポリシーはAmazonSSMManagedInstanceCoreを選択します。

ロール名はec2-private-instance-roleとしました。
この設定でロールを作成します。
EC2インスタンスを構築する!
作成したIAMロールを付与してインスタンスを作成します。

SSHやSCPを行いたい場合は鍵ファイルを作成しておきましょう!
私はssm-test.pemという鍵ファイルを生成しておきました。
AWSコンソールからアクセス!
たったこれだけで、AWS System Managerのターゲットインスタンスに作成したEC2インスタンスが表示されます!

「セッションを開始する」からEC2インスタンスへアクセスすることができます。
PCからアクセス!
今度はPCからアクセスしてみましょう!
AWS CLI v2のインストール
https://awscli.amazonaws.com/AWSCLIV2.pkg
こちらのリンクからパッケージをダウンロードしてインストールします。
$ aws --version
aws-cli/2.1.36 Python/3.8.8 Darwin/20.4.0 exe/x86_64 prompt/off
Session Manager pluginのインストール
以下のようにコマンドを実行してインストールします。
$ cd /tmp
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
インストール後、以下のように表示されればOKです。
$ session-manager-plugin
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
~/.ssh/configの設定
次にSSHするための設定を~/.ssh/configに追記します。
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
鍵ファイルの設定
鍵ファイルのパーミッションを変更しておきます。
$ chmod 600 ~/.ssh/ssm-test.pem
IAMポリシーの作成
MacのAWS CLIで利用するIAMユーザーを作成するために、まずはポリシーを作成します。
以下のポリシーでSSHが可能になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ssm:StartSession",
"ssm:TerminateSession",
"ssm:ResumeSession",
"ssm:DescribeSessions",
"ssm:GetConnectionStatus"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
私はSessionManagerPolicyという名前で作成しました。
IAMユーザーの作成
上記のポリシーを付与したIAMユーザーを作成します。
プログラムによるアクセスを許可しておきます。

作成するとアクセスキーとシークレットアクセスキーが生成されるのでAWS CLIに設定します。
いざSSH!
これで設定完了です。
以下のコマンドでSSHしてみましょう!
$ ssh -i ~/.ssh/ssm-test.pem ec2-user@i-XXXXXXXXXXXXXXX
無事SSHできました!
$ ssh -i ~/.ssh/ssm-test.pem ec2-user@i-XXXXXXXXXXXXXXX
The authenticity of host 'i-XXXXXXXXXXXXXXX (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:UR9ZaszvdeL/zDWYbcGaiklGvFL9lMaJeeeAnsATcuDxc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'i-XXXXXXXXXXXXXXX' (ECDSA) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-XXX-XX-XX-XX ~]$
SCP(ファイル転送)も可能!
ファイルを転送したい場合は同様にSCPも可能です!
$ scp -i ~/.ssh/ssm-test.pem test.txt ec2-user@i-XXXXXXXXXXXXXXX:/home/ec2-user
あとがき
この方法ならプライベートな環境に構築されたEC2にもアクセス可能になります。
また、ポート開放やパブリック環境での構築が不要なのでセキュリティも非常に高いです。
設定さえしてしまえば普通にSSHするのとほとんど変わらないので積極的に利用していきたいですね!
参考
https://www.karakaram.com/aws-session-manager-tunneling-support-for-ssh/#attach-iam-role-to-ec2
https://dev.classmethod.jp/articles/ec2-login-with-session-manager/