🎮

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-ConfigureAWSPackageAmazonCloudWatch-ManageAgent を併用
  • ssm:StartSessionaws:MultiFactorAuthPresent 条件を付けると MFA 無し接続を遮断できる

まとめ

  1. 踏み台を持たない構成 が現在のベストプラクティス
  2. Session Manager=対話 + 監査、 EIC=SSH 自動化互換、 CloudShell=ローカルレス即席操作
  3. レガシー要因で Bastion が残っても 踏み台へのアクセスはマネージド化 し攻撃面を最小化
  4. コスト・セキュリティを定量比較するとマネージド側がほぼ一方的に有利

Discussion