はじめに
AWSの運用において、EC2インスタンスへのリモート接続は日常的な作業です。しかし、従来の「SSHポート(22)を開放する」「踏み台サーバー(Bastion)を構築・管理する」という手法は、セキュリティリスクや運用コスト、管理の複雑さを伴います。
本記事では、セキュリティを飛躍的に向上させ、運用コストを削減できる「AWS Systems Manager(SSM)セッションマネージャー」を利用した、安全なEC2接続手順をステップバイステップで解説します。
前提知識/必要な理由
SSMセッションマネージャーは、インバウンドポートを開放することなく、AWSコンソールやAWS CLI経由でEC2インスタンスに安全にシェル接続できるサービスです。実務で推奨される理由は以下の4点です。
- ポート22の閉鎖:インバウンドトラフィックをすべて遮断した状態(フルクローズ)で接続可能です。
- 踏み台サーバーの廃止:踏み台サーバーの構築、パッチ当て、鍵管理が不要になり、コストと管理負荷を削減できます。
- IAMによる一元管理:SSH鍵(PEMキー)の共有を廃止し、IAMポリシーで接続権限を細かく制御できます。
- 監査ログの取得:実行されたコマンド操作の履歴をS3やAmazon CloudWatch Logsに自動で記録できます。
具体的な設定手順・設計方法
EC2インスタンス(Amazon Linux 2023)に対して、SSMセッションマネージャー経由で接続するための設計と手順を解説します。
ステップ1:EC2用のIAMロール(インスタンスプロフィール)の作成
EC2インスタンスがSSMサービスと通信するための権限を定義したIAMロールを作成します。
- IAMコンソールを開き、信頼されたエンティティの種類として「AWSのサービス」、ユースケースに「EC2」を選択します。
- 許可ポリシーとして、AWS管理ポリシーである AmazonSSMManagedInstanceCore を検索し、アタッチします。
- ロール名(例:
EC2-SSM-Access-Role)を入力し、ロールを作成します。
ステップ2:EC2インスタンスの起動とロールのアタッチ
インスタンスを起動し、先ほど作成したIAMロールを紐付けます。起動するセキュリティーグループのインバウンドルールは「すべてのトラフィックを拒否(空)」で問題ありません。
- EC2インスタンスを新規作成、または既存のインスタンスを選択します。
- 「アクション」 > 「セキュリティ」 > 「IAM ロールを変更」の順に選択します。
- ステップ1で作成した
EC2-SSM-Access-Roleを選択し、保存します。
※Amazon Linux 2やAmazon Linux 2023には、SSM Agentが初期状態でプリインストールされています。その他のOSを使用する場合は、手動でSSM Agentをインストールする必要があります。
ステップ3:プライベートサブネットにおけるVPCエンドポイントの設定(推奨)
対象のEC2がパブリックIPを持たない完全なプライベートサブネットにある場合、SSMのAPIエンドポイントと通信するために、以下のVPCエンドポイント(AWS PrivateLink)を作成する必要があります。パブリックサブネット(インターネットへの通信経路がある環境)の場合は、このステップは不要です。
com.amazonaws.[region].ssmcom.amazonaws.[region].ec2messagescom.amazonaws.[region].ssmmessages
これらのエンドポイントを、EC2が所属するVPCおよびサブネットに関連付け、HTTPS(ポート443)の通信を許可するセキュリティグループをアタッチします。
ステップ4:ローカル端末からの接続準備(session-manager-pluginの導入)
AWSコンソールだけでなく、ローカルのターミナルからAWS CLIを使って接続する場合、標準のAWS CLIに加えて「Session Manager プラグイン」をローカル環境にインストールする必要があります。
macOS環境(Homebrewを使用する場合)での導入手順:
# Session Manager プラグインのインストール
brew install --cask session-manager-plugin
# インストール確認
session-manager-plugin --version
Windows環境(PowerShell)での導入手順:
# インストーラーのダウンロードと実行
Start-BitsTransfer -Source https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows_64bit/SessionManagerPluginSetup.exe -Destination $env:USERPROFILE\Downloads\SessionManagerPluginSetup.exe
Start-Process -FilePath $env:USERPROFILE\Downloads\SessionManagerPluginSetup.exe -ArgumentList "/S" -Wait
ステップ5:接続テスト
設定が完了したら、ローカルのターミナルから以下のAWS CLIコマンドを実行し、EC2へ接続します。
# AWS CLIを使用した接続コマンド(インスタンスIDを指定)
aws ssm start-session --target i-0123456789abcdef0
コマンド実行後、以下のようなプロンプトが表示されれば接続成功です。
Starting session with SessionId: botocore-session-1234567890
sh-5.2$
実務での注意点
- SSM Agentのステータス異常:接続できない場合、EC2インスタンス内部でSSM Agentが起動しているか確認してください。OS起動時に自動起動するように設定する必要があります。
- DNSホスト名の有効化:VPCエンドポイントを使用する際、VPCの設定で「DNS解決」と「DNSホスト名」の両方が「有効」になっていることを確認してください。無効の場合、SSM Agentがプライベートエンドポイントの名前解決に失敗します。
- セッションのタイムアウト:実務では放置されたセッションを自動切断するため、AWS Systems Managerの「セッションマネージャー」設定画面から、無操作状態でのタイムアウト時間を適切(例: 20分など)に設定しておくことを強く推奨します。
まとめ
SSMセッションマネージャーを導入することで、インフラエンジニアはセキュリティを最大化しつつ、面倒なSSH鍵の管理や踏み台サーバーの保守から解放されます。VPCエンドポイントを適切に設計することで、完全閉域網のセキュアな環境も容易に構築可能です。実務におけるEC2運用のスタンダードとして、ぜひ本手順を活用してください。