はじめに
AWSの運用において、プライベートサブネット内にあるEC2インスタンスへのセキュリティ確保は常に重要な課題です。従来は「踏み台サーバー(Bastionホスト)」を経由してSSH接続する方法が一般的でしたが、鍵の管理や踏み台自体のメンテナンスコスト、ポート開放に伴うセキュリティリスクが伴いました。
本記事では、踏み台サーバーやSSHキーを使用せず、AWSのマネージドサービスである「AWS Systems Manager(SSM)セッションマネージャー」を利用して、プライベートEC2へセキュアに接続するための設計および設定手順をステップバイステップで解説します。
前提知識/必要な理由
なぜ踏み台サーバーを廃止すべきなのか?
従来のSSH接続による踏み台サーバーの運用には、以下のようなセキュリティおよび運用の懸念がありました。
- セキュリティグループの常時開放: SSH(ポート22)をインターネットに公開する必要があり、ブルートフォースアタックの標的になりやすい。
- SSH鍵の管理: 複数メンバーでの鍵の共有や、退職時の鍵回収・ローテーションなどの運用管理が煩雑。
- 運用コスト: 踏み台サーバー自体のOSパッチ適用や監視、不要なインスタンス費用の発生。
SSMセッションマネージャーのメリット
SSMセッションマネージャーを導入することで、以下のメリットを享受できます。
- インバウンドポートの開放不要: EC2インスタンスのアウトバウンド通信(HTTPS/443)のみで接続可能なため、インバウンドのポート22を完全に閉じることができます。
- IAMによるアクセス制御: AWS IAMポリシーを使用して、どのユーザーがどのインスタンスに接続できるかを一元管理できます。
- 監査ログの自動取得: 実行されたすべてのコマンド操作ログを、Amazon S3やAmazon CloudWatch Logsへ自動的に記録・保存できます。
具体的な設定手順・設計方法
ここでは、インターネットから完全に隔離された「完全プライベートサブネット」にあるEC2インスタンスへ、SSM経由で接続するための設定手順を解説します。
ステップ1:EC2用IAMロール(インスタンスプロファイル)の作成
EC2インスタンスがSSMサービスと通信するためのIAMロールを作成します。
- AWSマネジメントコンソールでIAMを開きます。
- [ロール] -> [ロールを作成] を選択します。
- 信頼されたエンティティタイプで AWSのサービス、ユースケースで EC2 を選択します。
- 許可ポリシーの検索窓で
AmazonSSMManagedInstanceCoreを検索し、チェックを入れます。 - ロール名(例:
EC2-SSM-Access-Role)を入力し、ロールを作成します。
ステップ2:VPCエンドポイントの作成
プライベートサブネットからインターネットを経由せずにSSMに接続するため、VPC内に以下の3つのVPCエンドポイント(インターフェイス型)を作成します。※パブリックIPやNATゲートウェイ経由でインターネットへ出られる環境の場合は、このステップは不要です。
以下のサービス名で、EC2が所属するVPCとサブネットを指定してエンドポイントを作成します。
com.amazonaws.[リージョン名].ssmcom.amazonaws.[リージョン名].ssmmessagescom.amazonaws.[リージョン名].ec2messages
※エンドポイント用のセキュリティグループには、VPC内部のCIDR(またはEC2のセキュリティグループ)からのHTTPS(ポート443)接続を許可するインバウンドルールを設定してください。
ステップ3:EC2インスタンスの起動と設定
対象となるEC2インスタンスを起動し、設定を適用します。
- EC2起動ウィザードにて、Amazon Linux 2023などの最新AMIを選択します(SSM Agentがプリインストールされています)。
- [高度な詳細] の [IAM インスタンスプロフィール] で、ステップ1で作成した
EC2-SSM-Access-Roleを選択します。 - セキュリティグループの設定で、インバウンドルールはすべて空(何も許可しない)にします。アウトバウンドはデフォルトのまま「すべてのトラフィック(またはHTTPS/443)」が許可されていることを確認します。
- インスタンスを起動します。
ステップ4:ローカルPCからの接続方法
ローカルのターミナルからAWS CLIを使用して接続するには、事前にAWS CLIと「Session Manager Plugin」をインストールしておく必要があります。
【補足】Session Manager Pluginの導入手順
ローカルPC(macOSの場合)にプラグインを導入するには、以下のコマンドを実行します。
# Session Manager Pluginのダウンロードとインストール
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"
sudo installer -pkg session-manager-plugin.pkg -target /
# インストールの確認
session-manager-plugin --version
※Windowsの場合は、AWS公式ドキュメントよりMSIインストーラをダウンロードして実行してください。
接続コマンドの実行
準備が整ったら、ローカルPCのターミナルから以下のコマンドを実行してEC2に接続します(対象のインスタンスIDを指定)。
aws ssm start-session --target i-0123456789abcdef0
成功すると、以下のようにプロンプトが表示され、SSHと同じ操作が可能になります。
Starting session with SessionId: botocore-session-1234567890
sh-5.2$ whoami
ssm-user
実務での注意点
- SSM Agentの死活とバージョン管理: SSM Agentが停止している、または古いバージョンのままだと接続できません。最新のAMIを使用するか、定期的にAgentの自動アップデートを設定してください。
- 名前解決(DNS)の有効化: VPCエンドポイントを使用する場合、VPCの「DNS解決」および「DNSホスト名」のオプションが
有効(true)になっている必要があります。ここが無効だとSSMのエンドポイントURLの名前解決ができず接続に失敗します。 - 接続タイムアウトの設定: 実務で利用する場合、セッションが繋ぎっぱなしになるのを防ぐため、Session Managerのコンソール設定から自動切断されるタイムアウト時間(デフォルトは20分)を適切に調整してください。
まとめ
SSMセッションマネージャーを採用することで、鍵管理のオーバーヘッドを削減し、強固なネットワークセキュリティを担保したサーバーアクセス管理が可能になります。本記事の手順に従うことで、インバウンド通信を完全に遮断した状態でのセキュアなプライベート接続環境が構築できます。実務のインフラ設計において、ぜひファーストチョイスとして導入を検討してください。