はじめに
AWS EC2環境への接続方法について、従来のような「踏み台サーバー」や「常時SSHポート開放」を行わずに、セキュアに接続するサービスについて整理しました。
主に以下の2つのサービスについて、特徴と設定方法をまとめます。
- EC2 Instance Connect (EIC)
- AWS Systems Manager Session Manager (SSM)
結論:どっちを使えばいい?
それぞれの特徴を比較しました。
| 特徴 | EC2 Instance Connect (EIC) | Session Manager (SSM) |
|---|---|---|
| 主な用途 | 手軽にSSHしたい、既存のSSH運用を変えたくない場合 | とにかくセキュアにしたい、ログを残したい、ポートを開けたくない場合 |
| ポート開放 (22) | 必要 (接続元IP または EICサービスIPから) | 不要 (インバウンド全拒否でもOK) |
| エージェント | 必要 | 必要 |
| IAM権限 | 接続用の一時鍵Push権限が必要 | SSM操作権限が必要 |
| プライベート接続 | EIC Endpoint を使えば可能 | 標準で対応 (VPCエンドポイント経由含む) |
| ログ・監査 | CloudTrail (API実行履歴のみ) | CloudTrail + S3/CloudWatch Logs (操作ログ) |
使い分けの指針
- Session Manager: セキュリティ要件が厳しい、ポート22を閉塞したい、操作ログを完全に取りたい場合(推奨)。
- EC2 Instance Connect: コストをかけず手軽に導入したい、単純なSSH接続だけで十分な場合。
1. EC2 Instance Connect (EIC)
IAMポリシーを使用して一時的なSSH公開鍵(60秒間有効)をインスタンスのメタデータにプッシュし、認証を行う方式です。
主な特徴
- キー管理不要: 一時的な鍵を使うため、恒久的なSSH鍵ペアの管理が不要。
- コスト: 基本機能は追加コストなし。
- クライアント: マネージドコンソール(ブラウザ)、AWS CLI、任意のSSHクライアントが利用可能。
- EIC Endpoint: パブリックIPを持たないインスタンスにも、EIC Endpoint経由で接続が可能(後述)。
接続までの流れ(標準的なパブリック接続)
1. EC2側の準備
まずはEC2にエージェントをインストールします。最近のAmazon Linux 2/2023やUbuntuなどのAMIであれば、デフォルトでインストールされています。
もし入っていない場合は、エージェントをインストールします。
参考: EC2 Instance Connect のセットアップ
2. IAMポリシーの設定
作業者のIAMユーザーまたはグループに、以下のポリシーをアタッチします。
Resource を絞ることで、接続可能なEC2を制限できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2-instance-connect:SendSSHPublicKey",
"Resource": "arn:aws:ec2:region:account-id:instance/i-xxxxxxxxx"
}
]
}
※ アクションは ec2-instance-connect:SendSSHPublicKey が最低限必要です。
3. セキュリティグループの設定
接続方法によって、EC2側で許可すべきインバウンド通信(ポート22)が異なります。
接続元 / 許可するトラフィック
-
EC2コンソール (ブラウザ)
AWSが公開している EC2 Instance Connect サービスのIP範囲 (リージョン別) -
CLI / SSHクライアント
自分のPCのグローバルIPアドレス
4. 接続実行
AWS CLIでの接続
以下のコマンド一発で接続できます。
# --os-user は ec2-user や ubuntu など環境に合わせて指定
aws ec2-instance-connect ssh --instance-id i-exampleId --os-user ubuntu
任意のSSHクライアントでの接続
裏側では「公開鍵の登録(API)」と「SSH接続」が行われているため、手動で分ければTera Term等でも接続可能です。
手順
- 鍵ペアを生成 (ssh-keygen)
- 公開鍵をAWSへ登録 (有効期限60秒)
- SSH接続
# 1. 鍵を生成
ssh-keygen -t rsa -f my_key
# 2. 生成した公開鍵をインスタンスメタデータに一時登録
aws ec2-instance-connect send-ssh-public-key --region ap-northeast-1 --availability-zone ap-northeast-1a --instance-id i-xxxxxxxx --instance-os-user ubuntu --ssh-public-key file://my_key.pub
# 3. 通常のsshコマンドで接続(60秒以内に実施)
ssh -o "IdentitiesOnly=yes" -i my_key ubuntu@<EC2-Public-IP>
ただしこちらの方法だと、ssh時のログインは CloudTrail に残らないみたいです。
EC2 Instance Connect Endpoint (EICE)
パブリックIPを持たないプライベートサブネットのEC2に対し、セキュアに接続する機能です。
-
仕組み:
VPC内に作成した「EIC Endpoint」を経由してインスタンスへ接続します。 -
SG設定:
EC2側のセキュリティグループで、「EIC EndpointのセキュリティグループID」からのポート22を許可します。 -
権限:
ec2-instance-connect:OpenTunnel権限が必要です。
2. SSM Session Manager
SSM AgentとTLS/WebSocketベースのセキュアな通信チャネルを通じて接続します。SSHプロトコルを使わないため、非常にセキュアです。
主な特徴
- ポート開放不要: インバウンドポート(22など)を一切開ける必要がありません。
- 対象範囲: EC2だけでなく、オンプレミスサーバーやVMも管理可能。
- 監査: 操作ログを S3 や CloudWatch Logs に出力可能。
利用までの手順
1. SSM Agentの確認
Amazon Linux系やUbuntuなどの主要AMIにはプリインストールされています。
参考:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent-get-version.html
2. ネットワーク要件
EC2からAWS Systems Managerのエンドポイントへ、アウトバウンドのHTTPS(443) 通信が必要です。
- パブリックサブネットの場合:IGW経由でアクセス
- プライベートサブネットの場合:NAT Gateway または VPCエンドポイント を利用
3. IAMロールの設定
EC2インスタンスプロファイル(IAMロール)に、適切なポリシーをアタッチします。
AmazonSSMManagedEC2InstanceDefaultPolicy の使用が推奨されています。
参考:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html
4. 接続実行
ブラウザのコンソール、または以下のコマンドで接続します。(CLI利用時は Session Manager Plugin のインストールが必要です)
aws ssm start-session --target i-xxxxxxxxx
ログイン時は ssm-user というユーザーになり、デフォルトでsudo権限を持っています。
Session Manager 経由での SSH / SCP
「ポート22は開けたくないが、使い慣れたSSHコマンドやSCPなどを使いたい」という場合に便利です。
設定方法
~/.ssh/config に以下を追記します。
# Linux/macOS の場合
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
使い方
# SSH接続 (鍵はEC2に登録されているものを指定)
ssh -i ~/.ssh/my-key.pem ubuntu@i-xxxxxxxxx
# SCP転送
scp -i ~/.ssh/my-key.pem local-file.txt ubuntu@i-xxxxxxxxx:/home/ubuntu/
メリット
セキュリティグループでSSHポートを開ける必要がない(SSMのトンネルを通るため)。
IAM認証(SSM接続許可)と SSH鍵認証の 二要素認証 のような構成になる。
その他
- WinSCPもSession Manager経由で利用可能です。
https://blog.seeds.ne.jp/aws-session-manager-winscp-connection-guide/
https://www.netassist.ne.jp/techblog/34523/ - Session Managerの
Run As設定で、ログイン時のOSユーザーをIAMユーザーごとに指定することも可能です。
https://techblog.techfirm.co.jp/entry/aws-ssm-ec2-access-with-specified-os-user
料金について
両サービスとも、基本機能は無料です。ただし、付随するネットワークリソースに料金が発生する場合があります。
まとめ
- EICは手軽に標準的なSSH接続の延長で使える。一時的な鍵配布により、鍵管理の手間を削減できる。ポート22の許可設定は必要。
- Session Manager はポート全閉塞が可能で最もセキュア。操作ログの記録が可能。SSH/SCPのトンネリングも可能なので、実運用上の不便も少ない。
基本的には Session Manager の利用を第一候補とし、要件に応じて EIC を検討するのが良さそうです。