🎮
AWSにおけるSSH接続のモダンな設計パターン
はじめに
- 従来のよくある SSH 接続は ローカルマシン → 踏み台(Bastion)サーバ → 運用サーバ
- 2025 年現在は AWS マネージド機能で安全・低運用コストに置き換え可能。レガシー構成を脱却しよう
従来(Bastion)構成イメージ
従来パターンの課題
課題 | 詳細 |
---|---|
秘密鍵の分散 | 開発者ごとにローカルへ鍵を配置。退職・PC 交換時の鍵失効が煩雑 |
IP 制御の複雑化 | オフィス VPN/自宅回線の変動で踏み台 SG を更新し続ける必要 |
22/TCP の公開 | インターネット越しに開けざるを得ず、ブルートフォースや Port Scan の対象 |
監査証跡の欠落 | OS ログのみでは「誰がいつ接続したか」を集中管理しにくい |
シークレットキー流出 | 秘密鍵が端末ごとに散在し漏えいリスク高 |
MFA/SSO 非対応 | 踏み台では IAM / IdP を生かしづらい |
コスト&運用負荷 | パッチ適用、脆弱性対応、Auto-Scaling、冗長化を全て自前対応 |
AWS マネージドで実現するモダンパターン
1. AWS Systems Manager Session Manager
ヒトが対話的に作業するなら基本これ
- ポート不要 … 22/TCP を閉じたまま接続(アウトバウンド 443 のみ)
- 鍵レス … 一時的チャネル。秘密鍵をローカル保存しない
- IAM + MFA … IAM Identity Center と統合し一元アクセス制御
- 統合ログ … CloudTrail / CloudWatch Logs に接続ログとシェル録画
- クロスアカウント … AWS RAM 経由で複数アカウント EC2 へ横断接続
2. EC2 Instance Connect + EC2 Instance Connect Endpoint
SSH ネイティブな自動化ならこれ
-
短命公開鍵 …
send-ssh-public-key
で 60 秒限定キーを注入 - EIC Endpoint … Private Subnet 内のみで SSH 終端、IGW/NAT 不要
- 既存ツール互換 … OpenSSH クライアントや Ansible をそのまま利用可
3. AWS CloudShell + Session Manager/EIC
完全ローカルレス&ブラウザだけで完結
特徴 | 詳細 |
---|---|
ローカル環境不要 | ブラウザだけで Linux シェル。AWS CLI & SSM Plugin 事前インストール済み |
VPC 内通信 | CloudShell から Session Manager / EIC Endpoint へは AWS Backbone 経由 |
IAM 認証のみ | 鍵・認証情報ファイル不要。IAM 資格情報が自動注入 |
チーム共有が楽 | “Share” 機能で同権限メンバーへ一時セッション共有 |
コスト | 実行は無料。1 GB/月 までは永続ストレージも無料 |
💡 使い分け
- 急ぎ・環境ゼロ⇒ CloudShell
- IDE 連携・自動化⇒ EIC
- 監査重視・対話作業⇒ Session Manager
コスト / セキュリティ比較(us-east-1 目安)
コスト
構成 | 直接費 | 間接費・備考 |
---|---|---|
Bastion (t3.micro, 24/7) | $0.0104 × 720h ≒ $7.5/月+Elastic IP $3.6/月 | パッチ・監視・冗長化の人件費 |
Session Manager | 追加コストなし(SSM 自体は無料) | CloudWatch Logs 保存料 (例: 1 GB ≒ $0.50) |
EIC + Endpoint | 追加コストなし(Endpoint 無料) | AZ 跨ぎ接続時のみ Data Transfer |
CloudShell | 実行時間 & 1 GB ストレージまで無料 | 追加ストレージ $0.06/GB、アイドル長時間は自動停止 |
セキュリティ
項目 | Bastion | Session Manager | EIC + Endpoint | CloudShell |
---|---|---|---|---|
インバウンドポート | 22/TCP 公開 | 不要 | 不要(VPC 内のみ) | 不要 |
認証方式 | SSH 鍵 + OS | IAM + MFA / SSO | IAM 署名付き一時鍵 | IAM + コンソールログイン |
鍵管理 | 手動配布 | 鍵レス | 自動注入・期限切れ | 鍵レス |
監査証跡 | OS ログ | CloudTrail + シェル録画 | CloudTrail + VPC Flow | CloudTrail + CloudShell Action Logs |
ブルートフォース耐性 | 低 | 高(ポート閉鎖) | 高(ポート閉鎖) | 高 |
例外: 従来 Bastion を残すべきケース
ケース | 理由 |
---|---|
SSM Agent を導入できない OS/機器 | SSM 非対応、古いカーネルなど |
ブート直後のトラブルシュート | SSM Agent 起動前にコンソールが必要 |
ハードリアルタイム系アプライアンス | 遅延極小化のため直 SSH が必須 |
厳格なレガシー監査要件 | “SSH ログイン痕跡” を前提にした監査 |
短期プロフェッショナルサービス | 外部ベンダが標準 SSH しか前提にしない |
代替策
Bastion を残す場合でも、踏み台へは Session Manager で入り「踏み台以降だけ SSH」にする二段構えが推奨。
実装ステップ(Session Manager 最小構成)
# 1. IAM ロールを作成し EC2 に付与
aws iam create-role --role-name Ec2SsmRole \
--assume-role-policy-document file://trust.json
aws iam attach-role-policy --role-name Ec2SsmRole \
--policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
# 2. SSM Agent がインストール済み AMI を使用(Amazon Linux 2 等)
# 3. ローカル PC へ Session Manager Plugin をインストール
brew install --cask session-manager-plugin # macOS 例
# 4. 接続
aws ssm start-session --target i-xxxxxxxxxxxxxxxxx
補足
- シェル録画を CloudWatch Logs に残す場合は
AWS-ConfigureAWSPackage
とAmazonCloudWatch-ManageAgent
を併用ssm:StartSession
にaws:MultiFactorAuthPresent
条件を付けると MFA 無し接続を遮断できる
まとめ
- 踏み台を持たない構成 が現在のベストプラクティス
- Session Manager=対話 + 監査、 EIC=SSH 自動化互換、 CloudShell=ローカルレス即席操作
- レガシー要因で Bastion が残っても 踏み台へのアクセスはマネージド化 し攻撃面を最小化
- コスト・セキュリティを定量比較するとマネージド側がほぼ一方的に有利
Discussion