SSMで踏み台サーバーを廃止!安全にEC2へ接続する構築手順

はじめに

AWSのセキュリティベストプラクティスにおいて、EC2インスタンスへの接続方法の最適化は常に重要な課題です。かつて主流だった「踏み台サーバー(Bastion Host)」を用いた接続は、踏み台自体の運用管理コストや、SSH鍵の厳重な管理、不要なポート(TCP/22)を開放するセキュリティリスクを伴います。

本記事では、これらの課題をすべて解決するAWS Systems Manager Session Manager(SSM Session Manager)を使用した、安全かつモダンなEC2接続環境の設計と設定手順をステップバイステップで解説します。

前提知識と必要な理由

SSM Session Managerは、IAMポリシーによる認証・認可を利用して、ブラウザまたはAWS CLIからEC2インスタンスに直接安全なシェル接続(セッション)を確立する機能です。この方法が推奨される理由は以下の通りです。

  • インバウンドポート(TCP/22など)の開放が不要:EC2からAWSのSSMエンドポイントへのアウトバウンド接続のみで通信を確立するため、セキュリティグループでインバウンドを完全に閉じた状態で接続できます。
  • SSH鍵の管理が不要:SSH鍵の紛失や漏洩のリスクがなくなり、アクセス権限はIAMで一元管理できます。
  • 監査ログの自動取得:実行されたコマンドや操作ログをAmazon CloudWatch LogsやAmazon S3に自動で保存できます。

具体的な設定手順・設計方法

プライベートサブネット内にあるAmazon Linux 2023インスタンスに対して、ローカルPCからSSM Session Manager経由で接続するための構築手順を説明します。

ステップ1:EC2用のIAMロール(インスタンスプロフィール)の作成

EC2インスタンスがSSMサービスと安全に通信するための権限を付与します。

  • IAMコンソールを開き、「ロールの作成」を選択します。
  • 信頼されたエンティティタイプとして「AWSサービス」、ユースケースに「EC2」を選択します。
  • 許可ポリシーとして、AWS管理ポリシーである「AmazonSSMManagedInstanceCore」を選択してアタッチします。
  • 任意のロール名(例: EC2-SSM-Access-Role)を入力してロールを作成します。

ステップ2:EC2インスタンスへのIAMロールの適用

対象のEC2インスタンスに、ステップ1で作成したIAMロールをアタッチします。既存のインスタンスの場合は、EC2コンソールの「アクション」 > 「セキュリティ」 > 「IAMロールを変更」から作成したロールを選択して保存します。

ステップ3:VPCエンドポイントの設定(プライベートサブネットの場合)

EC2インスタンスがパブリックインターネットに接続できない完全なプライベートサブネットに配置されている場合、VPC内からSSMサービスへ通信するための「インターフェイス型VPCエンドポイント(AWS PrivateLink)」を以下の3つ作成する必要があります。Security Groupは、EC2からのHTTPS(TCP/443)の入力を許可するものを設定してください。

  • com.amazonaws.[リージョン名].ssm
  • com.amazonaws.[リージョン名].ssmmessages
  • com.amazonaws.[リージョン名].ec2messages

ステップ4:ローカルPC(接続元)のクライアント環境準備

ローカルPCのターミナルからSession Managerを使用して接続するには、AWS CLIに加えて、AWS非標準(外部拡張)の「Session Manager Plugin」をインストールする必要があります。

【重要】Session Manager Pluginの導入手順

ご利用のOSに合わせて以下のコマンドを実行し、プラグインを導入してください。

macOSの場合(Homebrewを使用):

# Homebrewを使用してプラグインをインストール
brew install --cask session-manager-plugin

# インストール確認
session-manager-plugin --version

Windowsの場合(PowerShellを使用):

# インストーラーのダウンロード
Invoke-WebRequest "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe" -OutFile "SessionManagerPluginSetup.exe"

# サイレントインストールを実行
Start-Process -FilePath ".\SessionManagerPluginSetup.exe" -ArgumentList "/S" -Wait

# インストール確認
session-manager-plugin

ステップ5:接続テストの実行

ローカルPCのターミナルからAWS CLIを実行し、作成したEC2インスタンス(例: i-0123456789abcdef0)に接続を試みます。

# 接続コマンド
aws ssm start-session --target i-0123456789abcdef0

実行後、以下のようにシェルのプロンプトが表示されれば接続成功です。

Starting session with SessionId: botocore-session-1234567890
sh-5.2$

実務での注意点

  • SSM Agentの稼働確認:Amazon Linux 2やAmazon Linux 2023、Ubuntuの最新AMIにはSSM Agentがプリインストールされていますが、カスタムAMIや古いOSを使用する場合は、手動でSSM Agentをインストール・起動しておく必要があります。
  • 名前解決の有効化(Private DNS):VPCエンドポイントを使用する場合、VPCの設定で「DNS解決(enableDnsSupport)」と「DNSホスト名(enableDnsHostnames)」の両方が「有効(True)」になっていることを確認してください。無効の場合、SSM AgentがエンドポイントのIPアドレスを解決できず、接続に失敗します。
  • 権限の最小化:接続を実行するIAMユーザーまたはIAMロールには、必要なEC2インスタンスのみに接続を制限する「リソタグによる制限」などをIAMポリシーで定義し、過剰な権限を与えないように設計してください。

まとめ

SSM Session Managerを導入することで、従来の踏み台サーバーの管理負担やSSH鍵の漏洩リスクから完全に解放されます。また、コマンド実行履歴の監査ログ管理も一元化されるため、セキュリティ要件の厳しい商用環境でも必須となる設定です。本記事の手順をもとに、セキュアでモダンなAWSインフラの運用設計を進めてみてください。

上部へスクロール