はじめに
AWSのセキュリティベストプラクティスにおいて、EC2インスタンスへのリモート接続(SSHやRDP)は常に重要なテーマです。従来は「踏み台サーバー(Bastion Host)」を設置して接続を中継する設計が主流でしたが、踏み台サーバー自体のパッチ管理、鍵の配布、踏み台用のIP制限といった運用負荷やセキュリティリスクが課題となっていました。
本記事では、踏み台サーバーを一切使わずに、プライベートサブネットにあるEC2に安全かつ簡単にブラウザやローカルPCから接続できる「AWS Systems Manager (SSM) Session Manager」の設計と具体的な設定手順を解説します。
前提知識/必要な理由
SSM Session Manager(以下、Session Manager)が必要とされる主な理由は、セキュリティの向上と管理コストの削減です。
- インバウンドポート「22」の解放が不要: EC2インスタンスのセキュリティグループでSSH用のインバウンドポートを開ける必要がありません。
- SSH鍵(Key Pair)の管理が不要: IAMポリシー(AWSアカウント)によってアクセス権限を制御するため、SSHの秘密鍵を配布・管理する手間と紛失リスクがゼロになります。
- 操作ログの集中管理: 実行したコマンド履歴を自動でAmazon CloudWatch LogsやS3に保存できるため、監査が容易です。
具体的な設定手順・設計方法
今回は、プライベートサブネットに配置された、インターネットへの直接ルートを持たないEC2(Amazon Linux 2023)に、Session Manager経由で接続する設計を想定します。VPCエンドポイントを使用し、AWSのSSMサービスとのプライベート通信を確立します。
ステップ1:EC2用のIAMロールの作成
EC2がSSMサービスと安全に通信するために、IAMロール(インスタンスプロフィール)を作成して適用します。
- IAMコンソールを開き、「ロールの作成」をクリックします。
- 信頼されたエンティティタイプで「AWSのサービス」を選択し、ユースケースに「EC2」を選びます。
- 許可ポリシーの検索窓で
AmazonSSMManagedInstanceCoreを検索し、チェックを入れます。 - 任意のロール名(例:
EC2SSMInstanceRole)を入力し、ロールを作成します。
ステップ2:EC2へのIAMロールのアタッチ
- EC2コンソールを開き、対象のインスタンスを選択します。
- 「アクション」 > 「セキュリティ」 > 「IAMロールを変更」の順に選択します。
- ステップ1で作成した
EC2SSMInstanceRoleを選択し、「IAMロールの更新」をクリックします。
ステップ3:VPCエンドポイントの設定(プライベート環境の場合)
EC2が配置されているプライベートサブネットから、インターネットを介さずにSSMと通信するために、以下の3つのインターフェイスVPCエンドポイント(AWS PrivateLink)を作成します。
com.amazonaws.[リージョン名].ssmcom.amazonaws.[リージョン名].ssmmessagescom.amazonaws.[リージョン名].ec2messages
設定時のポイント:
- サブネットの選択: EC2が配置されているサブネット(マルチAZ対応を考慮して複数)を選択します。
- プライベートDNS名: 「プライベートDNS名を有効にする」にチェックを入れます(VPCの設定で「DNS解決」と「DNSホスト名」が有効である必要があります)。
- セキュリティグループ: エンドポイントにアタッチするセキュリティグループでは、EC2から HTTPS (Port 443) のインバウンド通信を許可するルールを追加してください。
ステップ4:ローカルPCからAWS CLIでの接続準備
AWSマネジメントコンソール(ブラウザ)から直接接続することも可能ですが、ローカルPCのターミナルから接続する場合は、session-manager-plugin の導入が必要です。
session-manager-plugin のインストール手順
ローカルPCのOS環境に応じて以下のコマンドを実行し、プラグインを導入します。
■ macOSの場合(Homebrewを使用する場合)
# Homebrewを使用してプラグインをインストール
brew install --cask session-manager-plugin
# インストール確認
session-manager-plugin --version
■ Linux (Ubuntu / Debian系) の場合
# パッケージのダウンロード
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
# インストール実行
sudo dpkg -i session-manager-plugin.deb
# インストール確認
session-manager-plugin --version
ステップ5:接続テスト
準備が整ったら、以下のコマンドでローカルのターミナルからEC2へSSHのように直接接続します。[Instance-ID] には接続先のEC2のインスタンスIDを入力してください。
aws ssm start-session --target i-0123456789abcdef0
接続に成功すると、以下のようなプロンプトが表示され、EC2のコマンドライン操作が可能になります。
Starting session with SessionId: botocore-session-1234567890
sh-5.2$
実務での注意点
- SSM Agentの死活: Amazon Linux 2023などの最新OSイメージにはSSM Agentがプリインストールされていますが、Ubuntuや古いOS(RHEL等)を使用する場合は、事前にSSM Agentを手動でインストールし、サービスとして起動させておく必要があります。
- VPCエンドポイントのコスト: 3つのVPCエンドポイント(PrivateLink)を配置すると、時間あたりの起動料金と処理データ量に応じてコストが発生します。本番環境では必須ですが、検証環境ではコストとのトレードオフを検討してください。
- 最小権限のIAM設定: 実務では接続する開発者に対して、全てのインスタンスへのSSM接続を許可するのではなく、タグ(例:
Environment=Development)を用いて制限するポリシーを設計しましょう。
まとめ
SSM Session Managerを導入することで、インバウンドポートの閉鎖とSSH鍵管理の撤廃を実現し、セキュアなインフラ運用が可能になります。一度構築してしまえば、開発メンバーの参画・離脱時の鍵権限調整もIAMベースで一元管理できるため、効率的なDevOps運用に繋がります。ぜひご自身のプロジェクトでお試しください。