はじめに
AWSの運用において、プライベートサブネット内に配置されたEC2インスタンスへのセキュアなアクセス経路の確保は、インフラエンジニアにとって常に重要な課題です。従来は「踏み台サーバー(Bastion Host)」をパブリックサブネットに構築してSSH接続する手法が一般的でしたが、メンテナンスコストやセキュリティリスクの観点から、現在はAWS Systems Manager(SSM)の「セッションマネージャー」を利用した踏み台レスな接続構成が強く推奨されています。
この記事では、初心者から中級者のインフラエンジニア向けに、SSMセッションマネージャーを使用してEC2インスタンスへ安全に接続するための設計と、具体的なステップバイステップの設定手順を詳しく解説します。
前提知識と踏み台レス接続が必要な理由
従来の踏み台サーバー(Bastion)の課題
従来の踏み台サーバーを利用した運用には、以下のような運用負荷とセキュリティ上のリスクが存在していました。
- SSHのポート(22番)をインターネットに解放する必要があり、ブルートフォース攻撃などの標的になりやすい。
- 踏み台サーバー自体のOSアップデートやパッチ適用、パブリックIPアドレス(Elastic IP)の維持といった管理コストが発生する。
- SSHキーペアの厳重な管理や、メンバーの追加・削除に伴う鍵の配布・回収の手間が煩雑。
SSM セッションマネージャーとは
SSM セッションマネージャーは、インバウンドポートを開放することなく、AWS管理コンソールやAWS CLI経由でEC2インスタンスにセキュアに接続できる機能です。すべての操作はHTTPS(ポート443)のアウトバウンド通信のみで行われ、IAMによる厳格なアクセス制御が可能です。さらに、実行されたコマンドの履歴をCloudWatch LogsやS3に保存して監査ログとして利用することも容易になります。
具体的な設定手順・設計方法
ここでは、VPC内のプライベートサブネットに配置されたEC2(Amazon Linux 2023)に対して、SSMセッションマネージャー経由で接続するための設定手順を解説します。
1. IAMロール(インスタンスプロフィール)の作成
EC2インスタンスがSSMサービスと安全に通信するために、IAMロールを作成して付帯させる必要があります。
- AWSマネジメントコンソールの「IAM」画面を開きます。
- 「ロールの作成」をクリックし、信頼されたエンティティタイプで「AWSサービス」、ユースケースで「EC2」を選択します。
- 許可ポリシーの検索画面で
AmazonSSMManagedInstanceCoreポリシーを検索し、チェックを入れます。 - ロール名(例:
EC2-SSM-Access-Role)を入力し、ロールを作成します。
2. EC2インスタンスへのIAMロールの割り当て
作成したIAMロールを対象のEC2インスタンスにアタッチします。
- EC2コンソールに移動し、接続対象のEC2インスタンスを選択します。
- 「アクション」 > 「セキュリティ」 > 「IAMロールを変更」の順に選択します。
- 先ほど作成した
EC2-SSM-Access-Roleを選択し、「IAMロールの更新」をクリックします。
3. SSM Agentの導入と確認
EC2インスタンス上で「SSM Agent」が動作している必要があります。Amazon Linux 2 や Amazon Linux 2023、Ubuntu 18.04以降の公式AMIには標準でプリインストールされていますが、もし導入されていないOSや古い環境の場合は、手動で導入する必要があります。
例えば、Ubuntu Serverに手動でSSM Agentを導入・起動するコマンドは以下の通りです。
# SSM Agentのダウンロードとインストール
mkdir /tmp/ssm
cd /tmp/ssm
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb
sudo dpkg -i amazon-ssm-agent.deb
# サービスの起動とステータス確認
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
sudo systemctl status amazon-ssm-agent
4. VPCエンドポイントの設定(プライベートサブネット用)
プライベートサブネットからインターネット(NATゲートウェイ経由など)に出られない完全閉域網の設計の場合、VPCエンドポイント(AWS PrivateLink)を作成する必要があります。以下の3つのインターフェイス型VPCエンドポイントを、EC2が所属するVPCに作成してください。
com.amazonaws.[リージョン名].ssmcom.amazonaws.[リージョン名].ssmmessagescom.amazonaws.[リージョン名].ec2messages
※セキュリティグループは、EC2インスタンスからの HTTPS (443) のインバウンド通信を許可するように構成してください。
5. クライアント環境(ローカルPC)の設定と接続確認
AWS CLIを使用してローカルPCのターミナルから接続する場合、AWS CLIに加えて「Session Manager Plugin」という外部プラグインをクライアントPCに導入する必要があります。
Session Manager Pluginのインストール(macOSの場合)
# Homebrewを使用する場合のインストールコマンド
brew install --cask session-manager-plugin
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
接続コマンドの実行
ローカルのターミナルから以下のAWS CLIコマンドを実行し、EC2へログインできるか確認します。
aws ssm start-session --target i-0123456789abcdef0
コマンド実行後、プロンプトが切り替わり、EC2上のシェル操作が可能になれば接続成功です。
実務での注意点
セキュリティグループの設計
セッションマネージャーでの接続において、EC2のインバウンドルールに「ポート22(SSH)」を開放する必要はありません。ただし、前述のVPCエンドポイント通信やSSMのパブリックエンドポイント通信を確立するために、EC2のセキュリティグループのアウトバウンドルールで「ポート443(HTTPS)」が許可されていることを必ず確認してください。
操作ログの記録と監査
セッションマネージャーで行われた作業ログは、改ざん防止のためにCloudWatch LogsまたはS3バケットに転送する設計にすることをお勧めします。Systems Managerのコンソールにある「セッションマネージャー」の「設定」タブから、ログの暗号化や転送先の設定が簡単に行えます。
セッションタイムアウトの管理
離席時などの意図しない接続維持を防ぐため、一定時間無操作状態が続いた場合に自動的にセッションを切断する「セッションタイムアウト」を設定しましょう。デフォルト値(通常20分)からプロジェクトのセキュリティポリシーに合わせた値にチューニングすることが推奨されます。
まとめ
AWS Systems Manager セッションマネージャーの導入により、セキュリティリスクの高い踏み台サーバーを完全に廃止し、セキュアでコストパフォーマンスに優れたリモート管理環境を構築できます。設定自体も、適切なIAM権限の付与とネットワーク接続性の確保だけでシンプルに完結するため、モダンなAWSインフラ設計には欠かせないプラクティスです。ぜひ本手順を参考に、実務環境のセキュリティ強化に取り組んでみてください。