はじめに
AWSのインフラ設計において、プライベートサブネット内に配置されたEC2インスタンスへのセキュアなアクセス経路の確保は、常に重要な課題です。かつては「踏み台サーバー(Bastion Host)」をパブリックサブネットに配置する手法が一般的でしたが、現在では運用負荷やセキュリティリスクの観点から、AWS Systems Manager(SSM)の「Session Manager」を使用した接続が推奨されています。本記事では、踏み台サーバーを完全に不要にするセキュアなEC2接続手順について、ステップバイステップで解説します。
前提知識/必要な理由
Session Managerを採用する最大の理由は、セキュリティの向上と運用コストの削減です。従来の踏み台サーバー方式と比べ、以下のようなメリットがあります。
- インバウンドポート(SSH: 22)の完全閉鎖:EC2への直接のインバウンド通信を許可する必要がなくなります。
- 鍵管理が不要:SSHキーペアを作成・管理・配布する手間から解放されます。
- 詳細なアクセス監査:「誰が、いつ、どのインスタンスで、何のコマンドを実行したか」がCloudWatch LogsやS3に自動的に記録されます。
- コスト削減:踏み台サーバー自体が不要になるため、EC2やElastic IPの維持費が削減されます。
具体的な設定手順・設計方法
完全なプライベートサブネット(インターネットゲートウェイやNATゲートウェイがない環境)にあるEC2インスタンスに、Session Manager経由で接続するための設定手順を説明します。
1. EC2用のIAMロール(SSMインスタンスプロファイル)の作成
EC2インスタンスがSSMサービスと安全に通信できるように、適切な権限を付与したIAMロールを作成します。
IAMコンソールに移動し、信頼されたエンティティとして「EC2」を選択して新しいロールを作成します。許可ポリシーには、AWSのマネージドポリシーである以下のポリシーをアタッチします。
AmazonSSMManagedInstanceCore
ロール名を「EC2-SSM-Role」などのわかりやすい名前で保存します。
2. プライベートVPC内のVPCエンドポイント設定
インターネットへのアウトバウンド通信がない完全プライベートなVPC環境では、SSMのAPIエンドポイントにアクセスするために、以下の3つのVPCエンドポイント(AWS PrivateLink)を作成する必要があります。
- com.amazonaws.[region].ssm(SSMサービスへの接続用)
- com.amazonaws.[region].ssmmessages(セキュアチャネルでのセッション接続用)
- com.amazonaws.[region].ec2messages(システム管理やポリシー連携用)
※[region] には、利用しているリージョンコード(例: ap-northeast-1)が入ります。
これらのインターフェイス型エンドポイントを作成し、EC2が所属するサブネットを選択します。また、セキュリティグループの設定で、EC2が所属するセキュリティグループからのHTTPS(TCP/443)インバウンド通信を許可してください。
3. EC2インスタンスの起動とロール適用
接続対象となるEC2インスタンス(Linuxを想定)をプライベートサブネットに起動します。起動時の詳細設定で、手順1で作成した「EC2-SSM-Role」を「IAM インスタンスプロフィール」として指定します。
なお、現在主流の「Amazon Linux 2」や「Amazon Linux 2023」には、最初からSSMエージェントがインストールされているため、エージェントの手動インストール作業は不要です。
4. クライアント端末(ローカル環境)の準備
手元のPCからAWS CLIを使ってSSMセッションを開始するには、AWS CLIに加え、AWS公式の「Session Manager Plugin」という拡張ツールの導入が必要です。
お使いのOSに合わせて、以下のコマンド等で導入してください。
macOS(Homebrewを使用する場合):
brew install --cask session-manager-plugin
Windows(PowerShellでインストールする場合):
# インストーラのダウンロードと実行
Invoke-WebRequest "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows_64bit/SessionManagerPluginSetup.exe" -OutFile "SessionManagerPluginSetup.exe"
Start-Process -FilePath ".\SessionManagerPluginSetup.exe" -ArgumentList "/S" -Wait
Remove-Item ".\SessionManagerPluginSetup.exe"
5. 接続テストの実行
クライアント端末でAWS CLIの設定(aws configure)を行い、接続に必要なIAM権限(ssm:StartSessionなど)を持つ認証情報が設定されていることを確認した上で、以下のコマンドを実行します。
aws ssm start-session --target i-0123456789abcdef0
※「i-0123456789abcdef0」は作成したEC2インスタンスのIDに置き換えてください。接続に成功すると、ターミナルに以下のようなメッセージが表示され、EC2のシェル操作が可能になります。
Starting session with SessionId: botocore-session-1234567890
sh-4.2$
実務での注意点
- SSM Agentの最新化:OSイメージが古い場合、SSM Agentが自動更新されず、セッションが突然切断されるなどのトラブルが発生することがあります。SSMの「State Manager」などを用いて定期的な自動アップデートを設定しておくのがベストプラクティスです。
- IAMポリシーによるアクセス制限:開発者ごとに接続できるEC2インスタンスを制限したい場合は、IAMユーザーやロールのポリシーで、接続先EC2のタグ(Tag)条件を指定した「ssm:StartSession」アクションを定義します。
- 接続できない場合のトラブルシューティング:接続に失敗する場合の主な原因は「EC2インスタンスへのIAMロールのアタッチ漏れ」「VPCエンドポイントのセキュリティグループの設定ミス(HTTPS/443が通らない)」「インスタンスがDNS解決できていない」の3点です。これらをはじめに確認してください。
まとめ
AWS Systems Manager Session Managerを導入することで、運用負荷が高くセキュリティホールになりがちな踏み台サーバーを排除し、安全でクリーンなインフラを構築することができます。設定自体も、IAMロールの付与とVPCエンドポイントの作成だけで完結するため、非常に簡単です。実務におけるAWSのセキュリティベストプラクティスとして、ぜひ標準設計に取り入れてみてください。