2019年9月の AWS Systems Manager のアップデートにより、セッションマネージャーを使用して、クライアントとサーバー間で SSH (Secure Shell) および SCP (Secure Copy) トラフィックをトンネリングすることができるようになりました。
セッションマネージャーが SSH と SCP のトンネリングサポートを開始
文字だけ見ると何ができるようになったかサッパリですが、このアップデートにより、EC2 に SSH するために 22 番ポートを開ける必要がなくなりました。プライベートサブネットにある、グローバル IP をもたない EC2 にも踏み台なしで SSH アクセスができるようになりました。さらば踏み台サーバー。
実際に設定してみると、細かい条件があったり、ドキュメントが散らばっていたりして結構手こずったので、参照したドキュメントや手順などをまとめておきます。設定方法は OS によって異なるのですが、この記事ではパブリックサブネットにある 22 番ポートを閉じた Amazon Linux 2 の EC2 インスタンスに、Mac のターミナルから SSH で接続するケースを紹介します。
目次
- 全体の概要を把握する
- 前提条件を確認する
- EC2 に IAM Role を付与する
- System Manager のフリートマネージャーに EC2 インスタンスが表示されていることを確認する
- SSM エージェントのバージョンを確認する
- クライアントの AWS CLI 向けの IAM ポリシーを設定する
- クライアントに Session Manager Plugin をインストール
- クライアントの ~/.ssh/config を設定
- 接続してみる
- 接続できない場合
全体の概要を把握する
まずは AWS System Manager Sessions Manager を使用した新しい機能 – Port Forwarding | Amazon Web Services ブログ をみて全体の概要を把握します。
次に Session Manager の使用開始 - AWS Systems Manager を参考に、自分の環境に当てはまる設定を行っていきます。
前提条件を確認する
ステップ 1: Session Manager 前提条件を完了させる - AWS Systems Manager を見ながら前提条件を確認していきます。
セッションマネージャーを使って SSH 接続する方法はいくつかあり、今回はトンネリングによる接続なので ステップ 7: (オプション) Session Managerを通して SSH 接続を有効にする - AWS Systems Manager を参考にします。
EC2 に IAM Role を付与する
ステップ 2: Session Manager アクセス権限を使用して、IAM インスタンスプロファイルロールを確認し、作成する - AWS Systems Manager を参考に EC2 に AmazonSSMManagedInstanceCore
ポリシーを含む IAM Role を設定します。
EC2 インスタンスをインターネットと通信できるサブネットで起動する
今回はパブリックサブネットで起動をします。
プライベートサブネットで起動する場合は Nat Gateway を通してインターネットと通信できるサブネットで起動します。
未確認ですが、インターネットと通信できる環境がなくても、ステップ 6: (オプション) AWS PrivateLink を使用して Session Manager 用の VPC エンドポイントをセットアップする - AWS Systems Manager を参考に System Manager の API と通信することができるようです。
System Manager のフリートマネージャーに EC2 インスタンスが表示されていることを確認する
Amazon Linux 2 には SSM エージェントがデフォルトでインストールされているので、IAM Role が設定されていて、SSM エージェントが System Manager の API にアクセスできれば、AWS System Manager のフリートマネージャーのマネージドインスタンスのところに EC2 インスタンスが表示されます。
マネージドインスタンスに EC2 インスタンスが表示されない場合は EC2 インスタンスが Systems Manager コンソールの [マネージドインスタンス] に表示されない理由のトラブルシューティング が参考になります。
条件が揃っていても 10 分くらい表示されないこともありましたので、少し時間をおいてから確認してみてください。
SSM エージェントのバージョンを確認する
SSM エージェントのバージョンは、上記の画像のように、System Manager のマネージドインスタンスのところから確認できます。
バージョンが 2.3.672.0 以上でない場合は、SSM エージェント への更新の自動化 - AWS Systems Manager もしくは Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする - AWS Systems Manager の方法で最新版に更新します。
クライアントの AWS CLI 向けの IAM ポリシーを設定する
クライアントの AWS CLI 用の IAM ポリシーを作成し、AWS CLI 用の IAM ユーザに設定します。詳しくは クイックスタート Session Manager のデフォルト IAM ポリシー - AWS Systems Manager を参照。
クライアントに Session Manager Plugin をインストール
クライアントの AWS CLI 用の Session Manager Plugin をインストールします。インストール方法は (オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager を参照。
クライアントの ~/.ssh/config を設定
~/.ssh/config
を変更して、SSH コマンドの裏側で AWS CLI を実行するように設定をします。詳しくは ステップ 7: (オプション) Session Managerを通して SSH 接続を有効にする - AWS Systems Manager を参照。
~/.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'"
接続してみる
以上で準備は完了です。ssh コマンドの引数にインスタンス ID を指定します。EC2 に設定された ssh の鍵も設定します。
ssh -i ~/.ssh/id_rsa ec2-user@i-xxxxxxxxxxxxxx
scp コマンドも使えます。
scp -i ~/.ssh/id_rsa example.txt ec2-user@i-xxxxxxxxxxxxxx:/home/ec2-user
接続できない場合
何度か試してみて接続できない場合は、以下を確認してみてください。
- EC2 の IAM Role は設定されているか
- EC2 の SSM エージェントのバージョンは最新か
- SSM エージェント が System Manager の API にアクセスできる環境か(インターネットまたは Private Link を利用して)
- SystemManager フリートマネージャーのマネージドインスタンスに対象のインスタンスが表示されているか
- クライアントに Session Manager Plugin がインストールされているか
サーバ上で SystemManager エージェントが起動しているか
systemctl status amazon-ssm-agent.service
SystemManager エージェントのログ
journalctl -u amazon-ssm-agent.service
SystemManager のログも参考に
/var/log/amazon/ssm/amazon-ssm-agent.log
/var/log/amazon/ssm/errors.log