はじめに
AWSの運用において、EC2インスタンスへのセキュアなアクセス経路の確保は重要な課題です。従来の踏み台サーバー(Bastionホスト)を経由したSSH接続は、SSHキーの管理や、インバウンドポート(22番)をインターネットに公開するリスク、そして踏み台サーバー自体の維持コストといった課題を抱えていました。
本記事では、これらの課題をすべて解決する「AWS Systems Manager(SSM)セッションマネージャー」を使用し、踏み台サーバーなしでプライベートサブネット内のEC2に安全に接続するための具体的な設計・設定手順をステップバイステップで解説します。
前提知識/必要な理由
SSMセッションマネージャーとは、AWS Systems Managerの機能の一つであり、SSHキーの管理やインバウンドポートの開放を行うことなく、ブラウザやAWS CLI経由でEC2インスタンスに安全に接続できるサービスです。この方法を導入すべき主な理由は以下の3点です。
- セキュリティの向上:ターゲットとなるEC2のセキュリティグループでインバウンドポート(TCP/22など)を開放する必要がありません。
- 鍵管理からの解放:個人用のSSH秘密鍵を発行・管理・更新する手間が不要になります。
- アクセス制御と監査:接続権限はIAMポリシーで一元管理され、実行されたコマンド履歴はAmazon S3やCloudWatch Logsにログとして記録可能です。
具体的な設定手順・設計方法
プライベートサブネット内に配置されたLinux(Amazon Linux 2023想定)のEC2インスタンスへ、SSMセッションマネージャーを使って接続するための手順を解説します。
ステップ1:EC2用のIAMロール(インスタンスプロフィール)の作成
EC2がSSMサービスと通信できるように、適切な権限を持つIAMロールを作成します。
まず、以下の信頼ポリシーを持つIAMロールを作成し、AWS管理ポリシーの AmazonSSMManagedInstanceCore をアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ステップ2:EC2インスタンスの作成とロールの割り当て
EC2インスタンスを作成、または既存のインスタンスに対して、ステップ1で作成したIAMロールをアタッチします。セキュリティグループのインバウンドルールは、一時的な疎通確認も含めて「すべて空(インバウンドなし)」で問題ありません。アウトバウンドのみ、HTTPS(ポート443)が解放されていることを確認してください。
ステップ3:VPCエンドポイントの設定(インターネットゲートウェイがない場合)
対象のEC2がパブリックIPを持たず、NATゲートウェイ経由のインターネット接続もない完全なプライベートサブネットにある場合は、SSMと通信するための「VPCエンドポイント(Interface型)」を3つ作成する必要があります。以下のエンドポイントを、EC2が所属するVPCに作成してください。
com.amazonaws.[リージョン名].ssmcom.amazonaws.[リージョン名].ssmmessagescom.amazonaws.[リージョン名].ec2messages
※VPCエンドポイントに関連付けるセキュリティグループは、EC2インスタンスからの「HTTPS(443番)」通信を許可するように設計してください。
ステップ4:クライアント(ローカルPC)の準備
ローカルPCの端末(ターミナル)からセッションマネージャーを使用して接続するには、AWS CLIに加えてSession Managerプラグインをインストールする必要があります。
macOS(Homebrewを使用する場合)の導入手順:
# Session Manager プラグインのインストール
brew install --cask session-manager-plugin
# インストールの確認
session-manager-plugin --version
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
# インストールの確認
session-manager-plugin
ステップ5:接続確認
設定が完了したら、ローカルPCのターミナルからAWS CLIを使用して、以下のコマンドでEC2インスタンスに接続します。AWSの認証情報(アクセスキー等)が設定されていることを確認してください。
aws ssm start-session --target i-0123456789abcdef0
コマンド実行後、プロンプトが切り替わり、EC2内のシェルが起動すれば接続成功です。
実務での注意点
- SSM Agentのステータス:Amazon Linux 2やAmazon Linux 2023にはSSM Agentがプリインストールされていますが、RHELやUbuntuなど他のディストリビューションを使用する場合は、手動でのSSM Agentのインストールおよび起動設定が必要になります。
- VPCエンドポイントのDNS設定:VPCエンドポイントを作成する際、VPCの「DNS解決」および「DNSホスト名」を有効にし、エンドポイントの「プライベートDNS名を有効にする」にチェックを忘れないようにしてください。これを忘れるとEC2がエンドポイントの名前解決を正しく行えません。
- 操作ログの保管:本番環境では、実務での監査要件を満たすために、SSMの設定画面から「セッション出力をS3またはCloudWatch Logsに送信する」設定を有効化することを強く推奨します。
まとめ
SSMセッションマネージャーを導入することで、インフラエンジニアは面倒なSSHキーの管理や、踏み台サーバーのパッチ当て・維持コストから解放されます。セキュリティグループを完全に閉じた状態でも、IAMの強力な権限管理のもとで安全にサーバー運用が可能となるため、現代のAWS設計において必須のプラクティスと言えます。ぜひ設計の標準パターンとして取り入れてみてください。