さらば踏み台サーバ。Session Managerを使ってEC2に直接SSHする

AWS

2019年9月の AWS Systems Manager のアップデートにより、セッションマネージャーを使用して、クライアントとサーバー間で SSH (Secure Shell) および SCP (Secure Copy) トラフィックをトンネリングすることができるようになりました。

セッションマネージャーが SSH と SCP のトンネリングサポートを開始

文字だけ見ると何ができるようになったかサッパリですが、このアップデートにより、EC2 に SSH するために 22 番ポートを開ける必要がなくなりました。プライベートなサブネットにある EC2 にも直接アクセスができます。さらば踏み台サーバー。

実際に設定してみると、細かい条件があったり、ドキュメントが散らばっていたりして結構手こずったので、参照したドキュメントや手順などをまとめておきます。設定方法は OS によって異なるのですが、この記事ではパブリックサブネットにある 22 番ポートを閉じた Amazon Linux 2 の EC2 インスタンスに、Mac のターミナルから SSH で接続するケースを紹介します。

目次

  1. 全体の概要を把握する
  2. 前提条件を確認する
  3. EC2 に IAM Role を付与する
  4. EC2 に SSM エージェントの最新版をインストール
  5. Mac の AWS CLI 向けの IAM ポリシーを設定する
  6. Mac の AWS CLI 用の Session Manager Plugin をインストール
  7. Mac の ~/.ssh/config を設定
  8. 接続してみる
  9. 接続できない場合

全体の概要を把握する

まずは AWS System Manager Sessions Manager を使用した新しい機能 – Port Forwarding | Amazon Web Services ブログ をみて全体の概要を把握します。

次に Session Manager の使用開始 – AWS Systems Manager を参考に、自分の環境に当てはまる設定を行っていきます。

前提条件を確認する

ステップ 1: Session Manager 前提条件を完了させる – AWS Systems Manager を見ながら前提条件を確認していきます。

セッションマネージャーを使って SSH 接続する方法はいくつかあり、今回はトンネリングによる接続なので ステップ 7: (オプション) Session Managerを通して SSH 接続を有効にする – AWS Systems Manager を参考にします。

今回はサーバは AmazonLinux 2、クライアントは Mac のターミナルアプリなので、前提条件は以下のようになります。

  • サーバに SSM エージェント バージョン 2.3.672.0 以降をインストール
  • クライアントには、AWS CLI のバージョン 1.16.12 以降と Session Manager plugin をインストール

EC2 に IAM Role を付与する

ステップ 2: Session Manager アクセス権限を使用して、IAM インスタンスプロファイルロールを確認し、作成する – AWS Systems Manager を参考に EC2 に AmazonSSMManagedInstanceCore ポリシーを含む IAM Role を設定します。

IAM Role for System Manager

EC2 に SSM エージェントの最新版をインストール

Amazon Linux 2 には SSM エージェントがデフォルトでインストールされていますが、重要なのがバージョンです。SSM エージェントのバージョンは、EC2 に IAM Role を設定後、AWS System Manager の マネージドインスタンスのところから確認できます。バージョンが 2.3.672.0 以上でない場合は、この後紹介する方法でアップデートします。

System Manager Managed Instance

すべてのマネージドインスタンスの SSM エージェントの自動更新

System Manager のマネージドインスタンスのページで、「Agent auto update」ボタンをクリックします。詳しくは SSM エージェント への更新の自動化 – AWS Systems Manager を参照。

ユーザデータで最新版に更新

EC2 を起動するときにユーザデータで最新版に更新するには、ユーザデータに以下のように設定します。詳しくは Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする – AWS Systems Manager を参照。


#!/bin/bash
yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

Mac の AWS CLI 向けの IAM ポリシーを設定する

クライアントの AWS CLI 用の IAM ポリシーを作成し、AWS CLI 用の IAM ユーザに設定します。クイックスタート Session Manager のデフォルト IAM ポリシー – AWS Systems Manager を参照。

Mac の AWS CLI 用の Session Manager Plugin をインストール

(オプション) AWS CLI 用の Session Manager Plugin をインストールする – AWS Systems Manager

Mac の ~/.ssh/config を設定

ステップ 7: (オプション) Session Managerを通して SSH 接続を有効にする – AWS Systems Manager

~/.ssh/config


# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

接続してみる

以上で準備は完了です。ssh コマンドの引数にインスタンス ID を指定します。EC2 に設定された ssh の鍵も設定します。


ssh -i ~/.ssh/id_rsa ec2-user@i-xxxxxxxxxxxxxx

scp コマンドも使えます。


scp -i ~/.ssh/id_rsa example.txt ec2-user@i-xxxxxxxxxxxxxx:/home/ec2-user

接続できない場合

何度か試してみて接続できない場合は、以下を間違えやすいので確認してみてください。

  • EC2 の IAM Role
  • EC2 の SSM エージェントのバージョン