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

2019年12月24日

Amazon EC2

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

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

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

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

目次

  1. 全体の概要を把握する
  2. 前提条件を確認する
  3. EC2 に IAM Role を付与する
  4. System Manager のフリートマネージャーに EC2 インスタンスが表示されていることを確認する
  5. SSM エージェントのバージョンを確認する
  6. クライアントの AWS CLI 向けの IAM ポリシーを設定する
  7. クライアントに Session Manager Plugin をインストール
  8. クライアントの ~/.ssh/config を設定
  9. 接続してみる
  10. 接続できない場合

全体の概要を把握する

まずは 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 を参考にします。

EC2 に IAM Role を付与する

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

AmazonSSMManagedInstanceCore IAM Role

EC2 インスタンスをインターネットと通信できるサブネットで起動する

今回はパブリックサブネットで起動をします。

プライベートサブネットで起動する場合は Nat Gateway を通してインターネットと通信できるサブネットで起動します。

未確認ですが、インターネットと通信できる環境がなくても、ステップ 6: (オプション) AWS PrivateLink を使用して Session Manager 用の VPC エンドポイントをセットアップする - AWS Systems Manager を参考に System Manager の API と通信することができるようです。

System Manager のフリートマネージャーに EC2 インスタンスが表示されていることを確認する

Amazon Linux 2 には SSM エージェントがデフォルトでインストールされているので、IAM Role が設定されていて、SSM エージェントが System Manager の API にアクセスできれば、AWS System Manager のフリートマネージャーのマネージドインスタンスのところに EC2 インスタンスが表示されます。

AWS System Manager Fleet Manager

マネージドインスタンスに EC2 インスタンスが表示されない場合は EC2 インスタンスが Systems Manager コンソールの [マネージドインスタンス] に表示されない理由のトラブルシューティング が参考になります。

条件が揃っていても 10 分くらい表示されないこともありましたので、少し時間をおいてから確認してみてください。

SSM エージェントのバージョンを確認する

SSM エージェントのバージョンは、上記の画像のように、System Manager のマネージドインスタンスのところから確認できます。

バージョンが 2.3.672.0 以上でない場合は、SSM エージェント への更新の自動化 - AWS Systems Manager もしくは Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする - AWS Systems Manager の方法で最新版に更新します。

クライアントの AWS CLI 向けの IAM ポリシーを設定する

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

クライアントに Session Manager Plugin をインストール

クライアントの AWS CLI 用の Session Manager Plugin をインストールします。インストール方法は (オプション) AWS CLI 用の Session Manager Plugin をインストールする - AWS Systems Manager を参照。

クライアントの ~/.ssh/config を設定

~/.ssh/config を変更して、SSH コマンドの裏側で AWS CLI を実行するように設定をします。詳しくは ステップ 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 エージェントのバージョンは最新か
  • SSM エージェント が System Manager の API にアクセスできる環境か(インターネットまたは Private Link を利用して)
  • SystemManager フリートマネージャーのマネージドインスタンスに対象のインスタンスが表示されているか
  • クライアントに Session Manager Plugin がインストールされているか

サーバ上で SystemManager エージェントが起動しているか

systemctl status amazon-ssm-agent.service

SystemManager エージェントのログ

journalctl -u amazon-ssm-agent.service

SystemManager のログも参考に

/var/log/amazon/ssm/amazon-ssm-agent.log
/var/log/amazon/ssm/errors.log

-技術ブログ
-