SSH キー・踏み台サーバー・ポート開放なしで EC2 にセキュアに接続する
このハンズオンでは、AWS Systems Manager の Session Manager を使い、SSH キーペアや踏み台(bastion)サーバー、インバウンドポートの開放を一切せずに EC2 インスタンスへ接続します。IAM ロールと SSM エージェントだけで完結する、セキュアでモダンな接続方法を学びます。接続ログの記録やポートフォワードも体験します。
| 項目 | 内容 |
|---|---|
| 所要時間 | 30〜45 分 |
| 難易度 | 入門 |
| 主要サービス | Systems Manager(Session Manager)、EC2、IAM |
| 前提リソース | 稼働中の EC2 インスタンス(Amazon Linux 2023 推奨) |
| 課金目安 | Session Manager 自体は無料。EC2 の稼働料金のみ |
| 項目 | SSH 接続 | Session Manager |
|---|---|---|
| キーペア | 必要(.pem 管理) | 不要 |
| インバウンドポート 22 | 開放が必要 | 不要(閉じたまま) |
| 踏み台サーバー | プライベート接続に必要 | 不要 |
| 接続記録 | 別途設定が必要 | S3 / CloudWatch Logs に記録可能 |
| アクセス制御 | SSH キー + SG | IAM ポリシーで一元管理 |
EC2 内の SSM エージェントが Systems Manager に対してアウトバウンドで接続を確立します。管理者はその確立済みチャネル経由でセッションを張るため、インバウンドポートを開ける必要がありません。プライベートサブネットの EC2 にも(NAT または VPC エンドポイント経由で)接続できます。
Amazon Linux 2/2023、Ubuntu、Windows Server の AWS 公式 AMI には SSM エージェントがプリインストールされています。古い AMI やカスタム AMI では手動インストールが必要な場合があります。
EC2 が Systems Manager と通信するための IAM ロールを作成します。
AmazonSSMManagedInstanceCore を検索してチェック → 「次へ」handson-ec2-ssm-roleAWS マネージドポリシーで、EC2 が Systems Manager に登録され Session Manager・Run Command などのコア機能を使うために必要な最小権限がまとまっています。これ 1 つで Session Manager 接続が可能になります。
IAM ロールをアタッチしてから SSM エージェントが Systems Manager に登録されるまで 数分かかります。すぐに接続できない場合は 2〜3 分待ってください。なお、ロールのアタッチでインスタンスの再起動は不要です。
開いたターミナルで以下を実行して接続を確認します。
whoami
# → ssm-user
sudo cat /etc/os-release
# → OS 情報が表示される
curl -s http://169.254.169.254/latest/meta-data/instance-id
# → 接続中のインスタンス ID が表示される
whoami で ssm-user と表示され、コマンドが実行できれば接続成功です。SSH キーもポート開放もなしで EC2 のシェルが使えています。
ローカル PC に AWS CLI と Session Manager プラグインをインストールすれば、aws ssm start-session --target i-xxxx でターミナルから直接接続できます。
誰がいつ何のコマンドを実行したかを記録するため、セッションログを CloudWatch Logs に出力します。監査要件で重要です。
/handson/session-manager-logs/handson/session-manager-logs を選択ログ記録を有効化すると、EC2 の IAM ロール(handson-ec2-ssm-role)に CloudWatch Logs への書き込み権限が必要です。AmazonSSMManagedInstanceCore には基本的なログ権限が含まれますが、不足する場合は CloudWatchLogsFullAccess(検証用)を追加してください。
exit または「Terminate」)ログにセッション中のコマンド入力が記録されていれば、監査ログの設定完了です。本番環境では S3 への長期保管も併用すると安心です。
Session Manager のポートフォワード機能を使うと、踏み台なしでローカル PC から EC2 上のサービスにアクセスできます。例として EC2 上の Web サーバー(ポート 80)をローカルの 8080 に転送します。
この手順はローカル PC に AWS CLI + Session Manager プラグインがインストールされている必要があります。ブラウザのセッションでは実行できません。
aws ssm start-session \
--target i-xxxxxxxxxxxxxxxxx \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["80"],"localPortNumber":["8080"]}'
別のターミナルまたはブラウザで以下にアクセスします。
curl http://localhost:8080
# → EC2 上の Web サーバーのレスポンスが返る
AWS-StartPortForwardingSessionToRemoteHost で接続(踏み台不要の DB 接続)Session Manager 自体は無料のため、必須の削除はありません。検証用に作成したリソースを片付けます。
Session Manager は SSH より安全なため、本番環境でも積極的に使うことが推奨されます。その場合は IAM ロールと SSM 設定を残し、SSH 用のポート 22 のインバウンドルールをセキュリティグループから削除すると、より堅牢な構成になります。