はじめに
AWSのEC2インスタンスを運用する際、従来の「踏み台サーバー(Bastionホスト)」を立ててSSHポート(22番)を開放する運用には、セキュリティリスクやパッチ管理などの運用負荷が伴います。
AWS Systems Manager(SSM)の機能である「セッションマネージャー」を使用すれば、SSHポートを完全に閉じたまま、かつインターネットから隔離されたプライベートサブネット内のEC2インスタンスへ安全にCLI接続できます。本記事では、実務で今すぐ使える具体的な設定手順をステップバイステップで解説します。
前提知識/必要な理由
なぜ踏み台サーバーではなくセッションマネージャーなのか
従来のSSH接続では、踏み台サーバーのセキュリティグループで特定のIPアドレスからのアクセスを許可したり、鍵ファイルの管理を行ったりする必要がありました。これに対し、セッションマネージャーには以下のメリットがあります。
- ポートの開放が不要: EC2インスタンスのアウトバウンド通信のみを利用するため、インバウンドポート(22番など)をすべて閉鎖できます。
- 鍵管理が不要: IAM(AWS Identity and Access Management)による権限管理で接続を制御するため、SSH鍵の紛失や漏洩のリスクがありません。
- 監査ログの取得: 誰がいつ、どのような操作を行ったかのログをCloudWatch LogsやS3に自動で保存できます。
接続を確立するための前提条件
セッションマネージャーを利用するには、以下の条件を満たす必要があります。
- EC2インスタンスにSSM Agentがインストールされ、起動していること(Amazon Linux 2やAmazon Linux 2023にはデフォルトでインストールされています)。
- EC2インスタンスがSSMのエンドポイントと通信できること(パブリックIPを持つ、NAT Gatewayを経由する、またはVPCエンドポイントを使用する)。
具体的な設定手順・設計方法
ステップ1:EC2用のIAMロール(インスタンスプロファイル)の作成
EC2インスタンスがAWS Systems Managerサービスと安全に通信できるように、専用のIAMロールを作成してアタッチします。
- AWSマネジメントコンソールの「IAM」に移動し、「ロールの作成」をクリックします。
- 信頼されたエンティティタイプで「AWSのサービス」を選択し、ユースケースに「EC2」を選択します。
- 許可ポリシーの追加画面で、AWS管理ポリシーである
AmazonSSMManagedInstanceCoreを検索し、チェックを入れます。 - ロール名(例:
EC2-SSM-SessionManager-Role)を入力し、ロールを作成します。
ステップ2:EC2インスタンスへのIAMロールのアタッチ
作成したIAMロールを、接続対象のEC2インスタンスに割り当てます。
- EC2のコンソール画面を開き、対象のインスタンスを選択します。
- 「アクション」 > 「セキュリティ」 > 「IAM ロールを変更」 を選択します。
- 先ほど作成した
EC2-SSM-SessionManager-Roleを選択し、「IAM ロールの保存」をクリックします。
ステップ3:セキュリティグループの設定変更
SSMセッションマネージャーはアウトバウンド(HTTPS/443ポート)の通信を使用するため、インバウンドルールでSSH(22番)を許可する必要はありません。
対象EC2インスタンスのセキュリティグループのインバウンドルールから、SSH(ポート22)の許可ルールを削除(または最初から設定しない)してください。アウトバウンドルールはデフォルトの「すべてのトラフィックを許可」のままで問題ありません。
ステップ4:クライアント(ローカルPC)の準備
手元のPCからAWS CLIを使って接続する場合、AWS CLIに加えて「Session Manager Plugin」のインストールが必要です。以下に導入手順を記載します。
macOSの場合
以下のコマンドを実行して、プラグインをダウンロードおよびインストールします。
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
Windows (PowerShell) の場合
以下のコマンドでインストーラーをダウンロードし、実行します。
Invoke-WebRequest "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe" -OutFile "SessionManagerPluginSetup.exe"
Start-Process msiexec.exe -ArgumentList "/i SessionManagerPluginSetup.exe /qn" -Wait
ステップ5:接続テスト
設定が完了したら、実際に接続できるか確認します。
AWSコンソールから接続する場合
- EC2コンソールで対象インスタンスを選択し、画面上部の「接続」をクリックします。
- 「セッションマネージャー」タブを選択し、「接続」をクリックします。ブラウザ上でターミナルが起動すれば成功です。
ローカルPCのCLIから接続する場合
AWS CLIの認証情報(プロファイル)を設定した状態で、以下のコマンドを実行します(i-xxxxxx部分には対象のインスタンスIDを入力してください)。
aws ssm start-session --target i-0123456789abcdef0
以下のようにプロンプトが表示されれば、接続成功です。
Starting session with SessionId: botocore-session-12345
sh-4.2$
実務での注意点
- 完全なプライベートサブネット(インターネット出口なし)の場合:
NAT Gatewayすら配置しない完全閉域のサブネットで利用する場合、SSMと通信するために以下の3つの「VPCエンドポイント(Interface型)」をVPC内に作成する必要があります。これらを作成し、Private DNSを有効にしてください。com.amazonaws.[region].ssmcom.amazonaws.[region].ssmmessagescom.amazonaws.[region].ec2messages
- ログの保存と暗号化:
実務では、誰がどのような操作を行ったかを記録するため、AWS Systems Managerの「セッションマネージャーの「設定」から、操作ログをAmazon S3やCloudWatch Logsに自動送信するよう設定することを強く推奨します。その際、EC2のIAMロールにS3への書き込み権限(s3:PutObject)などを追加する必要があります。
まとめ
AWS Systems Manager セッションマネージャーを導入することで、踏み台サーバーという「管理対象のインフラ」を削減しつつ、セキュリティを劇的に向上させることができます。一度設定してしまえば、鍵管理の煩わしさからも解放されます。今後のインフラ構築における標準の設計パターンとして、ぜひ実務に取り入れてみてください。