Session Manager 使えば踏み台サーバーが不要に
2019年7月、AWS Systems Manager セッションマネージャーを使用して、クライアントとサーバー間で SSH (Secure Shell) および SCP (Secure Copy) トラフィックをトンネリングすることができるようになった。
セッションマネージャーが SSH と SCP のトンネリングサポートを開始
何が嬉しいのかというと、一番大きいのは、
踏み台サーバーを使用せずに、 Session Manager 経由で対象のEC2に接続できる
ということではないだろうか。
実際にやってみた。
前提条件
SSM Agentのバージョン2.3.672.0以上ProxyCommandをサポートするSSHクライアントAWS CLIのバージョン1.16.12以上Session Manager Pluginのバージョン1.1.22.0以上
EC2側の設定
必要な SSM Agent のバージョンが 2.3.672.0 以上 なので、そうなっていない場合は、アップデートする。
SSM Agentのバージョンアップデート
AWSコンソールの AWS Systems Manager の Run Command から AWS-UpdateSSMAgent を実行する。

もしくは、 AWS CLI から、下記のコマンドを実行する。
aws ssm send-command --document-name "AWS-UpdateSSMAgent"
--instance-ids <インスタンスID> --region ap-northeast-1
EC2にロール付与
IAM インスタンスプロファイルロールを確認し、作成する。
AWS 管理ポリシー AmazonSSMManagedInstanceCore を含んだロールを付与する。

クライアント側
Session Manager の IAM エンドユーザーポリシーを作成
下記のドキュメントを参考に、ポリシーを作成、使用するIAMユーザーに付与する。
クイックスタート Session Manager のデフォルト IAM ポリシー - AWS Systems Manager
AWS CLI に Session Manager Plugin をインストールする
(オプション) AWS CLI 用の Session Manager Plugin をインストールする
上記のURLの手順の通り。
- バンドルされたインストーラをダウンロード
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
- インストールできたことを確認
session-manager-plugin --version
1.1.31.0
~/.ssh/config 設定
~/.ssh/config に下記のように設定する。
# SSH over Session Manager
host i-* mi-*
ProxyCommand bash -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
あとは通常のオペレーションと同じように、SSHをするだけ。
違うのは、パブリックIPではなくてインスタンスIDを指定する点。
$ ssh -i ./genedev ec2-user@i-0f0963977fbd1a5bb
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
[ec2-user@genedev ~]$
SCP もOK
$ scp -i ./genedev abc.txt ec2-user@i-0f0963977fbd1a5bb:/tmp/
abc.txt 100% 18 0.4KB/s 00:00
[ec2-user@genedev ~]$ ls -l /tmp/abc.txt
-rw-r--r-- 1 ec2-user ec2-user 18 Sep 16 01:34 /tmp/abc.txt
[ec2-user@genedev ~]$
※ セキュリティグループは、ご覧の通り、インバウンドは何も許可していない

Windowsもやってみた
Windowsの場合は、 AWS-StartPortForwardingSession を使用して、ポート転送を行う。
下記コマンドを実行する。
$ aws ssm start-session --target i-05bc3e1e3e92f1eed
--document-name AWS-StartPortForwardingSession
--parameters '{"portNumber":["3389"], "localPortNumber":["13389"]}'
Starting session with SessionId: eugene_sasaki-0f6e15b8de94ffd19
Port 13389 opened for sessionId eugene_sasaki-0f6e15b8de94ffd19.
セッションが開始されるので、リモートデスクトップクライアント側の設定。
ここでのポイントは、 localPortNumber で指定したポート13389を入れて、 localhost:13389 とすること。


無事接続できた。
今回のハマリポイント
SSM Agent のバージョンをしっかりと確認していなかった( 2.3.662.0 だった)ため、
「つながらないなー。何が悪いんだー」って無駄な調査時間を費やしてしまった……。
ちゃんとバージョンは確認しましょう。
SSM Agent のバージョンは、 AWS Systems Manager の Managed Instances から確認可能。

再度メリットとデメリットをおさらい
メリット
- VPC内のアプリケーション・サーバーにアクセスするためだけの踏み台サーバーが不要になる。 踏み台サーバーの使用料が不要。合わせて踏み台サーバーの運用コスト(脆弱性対応など)もかからない
- セキュリティグループでSSHポートを外に開放しなくていい
- IAMでの一元的なアクセス制御が可能
AWS CloudTrailでSession Manager APIの呼び出しをログ記録できる
デメリット?
- プラグインインストールなど、若干の手間が必要
- お客様が普段からSSH接続して運用しているケースが多い場合、通常のSSHではなくて、
AWS CLIを使って、Session Manager経由でSSHしてもらうことになるので、少しだけハードル高いかも?しれない。MMMのメンバーのみがオペレーションするような環境なら、問題なさそう
参考URL
- セッションマネージャーが SSH と SCP のトンネリングサポートを開始
- New – Port Forwarding Using AWS System Manager Session Manager | AWS News Blog
- AWS Systems Manager Session Manager
- (オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager
- ステップ 2: Session Manager アクセス権限を使用して、IAM インスタンスプロファイルロールを確認し、作成する - AWS Systems Manager
- セッションを開始する - AWS Systems Manager
- Session Manager で SSH/SCPをトンネリングしてEC2に接続する - Qiita
- セッションマネージャで踏み台いらず | BeeX Technical Blog
