はじめに
実務でEC2インスタンスを管理する際、踏み台サーバーの運用コストや、SSHキー(鍵ペア)の紛失・流出リスクに頭を悩ませていませんか?セキュリティグループでポート22をインターネットに公開することは、重大なセキュリティリスクを伴います。
これらの課題を根本的に解決するのが、AWS Systems Manager(SSM)の「セッションマネージャー」です。本記事では、踏み台サーバーを完全に廃止し、ポートを閉じたままEC2にセキュアに接続するための設定手順と、実務でよくある接続トラブルの解決策をわかりやすく解説します。
前提知識/必要な理由
セッションマネージャーとは?
AWS Systems Manager セッションマネージャーは、インバウンドポートを開放することなく、ブラウザやAWS CLIを介してEC2インスタンスを安全にリモート管理できるフルマネージドサービスです。
なぜ導入すべきなのか?(3つのメリット)
- ポート22の閉鎖: インバウンド通信を完全に遮断(あるいは制限)した状態でログインできるため、ブルートフォース攻撃を完全に防げます。
- 鍵管理からの解放: SSHキーの作成・配布・ローテーションが不要になります。アクセス権限はすべてIAMで一元管理できます。
- 監査ログの自動取得: 「誰が」「いつ」「どんなコマンドを実行したか」のログをAmazon S3やCloudWatch Logsに自動で記録できます。
具体的な設定手順・設計方法
今回は、最も実務で需要が高い「インターネットに直接ルートを持たないプライベートサブネット内のEC2インスタンス」への接続を想定した、セキュアな設計と設定手順を解説します。
ステップ1:EC2用のIAMロール(インスタンスプロフィール)の作成
EC2がSSMのAPIと通信できるようにするためのIAMロールを作成します。
- IAMコンソールを開き、「ロールの作成」をクリックします。
- 信頼されたエンティティタイプで「AWSのサービス」を選択し、ユースケースに「EC2」を指定します。
- 許可ポリシーで AmazonSSMManagedInstanceCore を検索し、チェックを入れます。
- ロール名(例:
EC2-SSM-Role)を入力して作成します。
ステップ2:EC2インスタンスの起動とIAMロールのアタッチ
EC2インスタンスを起動し、先ほど作成したIAMロールをアタッチします。
- インスタンス起動時に、OSとして「Amazon Linux 2023」または「Amazon Linux 2」を選択します。これらにはSSM Agentが最初からインストールされています。
- 「高度な詳細」セクションで、IAMインスタンスプロフィールに先ほど作成した
EC2-SSM-Roleを指定します。 - セキュリティグループのインバウンドルールは空(許可ルールなし)で問題ありません。
ステップ3:VPCエンドポイントの設定(プライベートサブネットの場合)
プライベートサブネット内のEC2からSSMサービスへ通信させるために、以下の3つのインターフェイス型VPCエンドポイント(AWS PrivateLink)を作成します。※パブリックサブネットでNATゲートウェイ等を経由してインターネットへ通信できる場合は本ステップは不要です。
com.amazonaws.[region].ssmcom.amazonaws.[region].ssmmessagescom.amazonaws.[region].ec2messages
注意点: VPCエンドポイントに紐付けるセキュリティグループでは、EC2インスタンスが属するサブネット(またはセキュリティグループ)からの HTTPS(ポート443)のインバウンド通信 を許可してください。また、VPCの「DNSホスト名」および「DNS解決」を有効にしておく必要があります。
ステップ4:ローカル端末の環境構築(AWS CLI接続用)
ブラウザだけでなく、開発メンバーがローカル端末のターミナルから aws ssm start-session コマンドを使って接続できるように設定します。
1. AWS CLIの導入
AWS CLIが未インストールの場合は、公式ドキュメントに従って導入してください。
2. Session Manager Pluginのインストール
AWS CLI経由でセッションを開始するには、標準外のプラグインの導入が必要です。各OSの導入手順は以下の通りです。
macOSの場合(Homebrewを使用):
brew install --cask session-manager-plugin
Windowsの場合(PowerShellで実行):
# インストーラーのダウンロード
Invoke-WebRequest "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows_amd64/SessionManagerPluginSetup.exe" -OutFile "SessionManagerPluginSetup.exe"
# インストールの実行
Start-Process sqlite3 -FilePath ".\SessionManagerPluginSetup.exe" -ArgumentList "/S" -Wait
ステップ5:接続テスト
設定完了後、ローカルのターミナルから以下のコマンドを実行して接続を確認します。
aws ssm start-session --target i-0123456789abcdef0
接続に成功すると、以下のようにEC2のシェルが立ち上がります。
Starting session with SessionId: botocore-session-1234567890
sh-5.2$ whoami
ssm-user
実務での注意点(トラブルシューティング)
セッションマネージャーが繋がらない場合、以下の4つのポイントを上から順に確認してください。ほぼすべての原因がこれらに該当します。
1. IAMロールの設定不備
EC2にアタッチしたIAMロールに AmazonSSMManagedInstanceCore ポリシーが正しくアタッチされているか確認してください。ロールを変更した場合、EC2側で反映されるまでに数分かかる場合があります。
2. VPCエンドポイント/ルートテーブルの確認
プライベートサブネットの場合、セキュリティグループでポート443のアウトバウンドが塞がれていないか確認します。また、VPCエンドポイントのセキュリティグループで、EC2からのポート443インバウンドが許可されているかを再確認してください。
3. SSM Agentの動作状況の確認
Amazon Linux以外のOS(UbuntuやRHELなど)を使用している場合、SSM Agentがインストールされていない、または起動していない可能性があります。手動で導入する場合は、以下のコマンド等でエージェントを有効化してください(Ubuntuの例)。
sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service
4. IMDSv2(インスタンスメタデータサービス)の影響
EC2でIMDSv2を「必須」に設定している場合、ホップ制限(Hop Limit)が「1」になっていると、コンテナや古いSSM Agentがメタデータを取得できず、SSMに登録されないケースがあります。ホップ制限を「2」以上に設定変更してください。
まとめ
SSMセッションマネージャーを導入することで、踏み台サーバーの構築・維持費を削減できるだけでなく、鍵管理の煩わしさやポート開放に伴うセキュリティリスクを完全にゼロにできます。
最初はVPCエンドポイントやセキュリティグループの設定で躓くことがありますが、本記事の手順に従えば、プライベート環境からでも強固で安全なインフラ運用体制を容易に構築できます。ぜひ実務に導入し、モダンで安全なAWS運用を実現してください。