🔐

Session Manager経由でSSH接続する方法

2022/03/04に公開

今回は Session Manager を使って EC2 に SSH 接続する方法をご紹介します。
対象の EC2 がパブリックサブネットにいる場合(Internet Gateway がある場合)と、プライベートサブネット上にいる場合の 2 種類の設定方法を記載します。

  • 構成図(まず左のパブリックサブネットからやってみて、その後プライベートサブネットでやってみます)
    image

パブリックサブネットでやってみる

  • IAM ロールを作っておく。
    • AmazonSSMManagedInstanceCoreのポリシーを含むロールを作成します。

image

  • 対象の EC2 を選択し、アクション -> セキュリティ -> IAMロールを変更をクリックして今作ったロールを割り当てます。

image

  • EC2 から SSM と通信できているか確認します。(以下は telnet で確認する例。)
EC2上のターミナル
telnet ssm.ap-northeast-1.amazonaws.com 443
telnet ec2messages.ap-northeast-1.amazonaws.com 443
telnet ssmmessages.ap-northeast-1.amazonaws.com 443

# 成功した接続の例)
root@111800186:~$ telnet ssm.us-east-1.amazonaws.com 443
Trying 52.46.141.158...
Connected to ssm.us-east-1.amazonaws.com.
Escape character is '^]'.
Telnet を終了するには、Ctrl キーを押しながら、] キーを押します。quit と入力し、Enter キーを押します。

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

  • ローカルマシンに Session Manager プラグインをインストールします(以下は MacOS での例)。
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"
sudo installer -pkg session-manager-plugin.pkg -target /
sudo ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin

参考:(オプション) AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager

  • ひとまず Session Manager で接続してみます。
% aws ssm start-session --target i-XXXXXXXXXXXXXXX

Starting session with SessionId: awscli-user-XXXXXXXXXXXXXXXXX
sh-4.2$
  • System Manager -> Session Managerの画面で以下のようにセッションができていたら OK

image

  • ssh を Session Manager 経由にするために、ローカルマシンの.ssh/configに以下を追記します。
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
  • ssh で接続してみます。接続するホスト名はインスタンス ID を指定します。
% ssh ec2-user@i-XXXXXXXXXXXXXXX -i .ssh/<your key>
The authenticity of host 'i-XXXXXXXXXXXXXXX (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:43: XXX.XXX.XXX.XXX
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'i-XXXXXXXXXXXXXXX' (ED25519) to the list of known hosts.
Last failed login: Wed Feb 23 13:47:13 UTC 2022 on pts/0
There was 1 failed login attempt since the last successful login.
Last login: Wed Feb 23 13:31:02 2022 from xxxxxxxx.xxxxxx.xx.xxxx.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-142 ~]$
  • 試しに Port:22 を閉じてみます。

image

  • 再度接続してみて、ちゃんと接続されることを確認。
% ssh ec2-user@i-XXXXXXXXXXXXXXX -i .ssh/<your key>
Last login: Wed Feb 23 13:49:33 2022 from localhost

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-142 ~]$

これでパブリックサブネットの場合は完了。

プライベートサブネットにしてみる

以下の公式ドキュメントにしたがって実施します。
ステップ 6: (オプション) AWS PrivateLink を使用して Session Manager の VPC エンドポイントを設定する - AWS Systems Manager

  • 先に VPC の DNS ホスト名有効化しておきます。

image

  • DNS ホスト名の有効化を行ったあと、プライベート VPC からのアクセスを確認するために EC2 を一旦停止して、VPC からインターネットゲートウェイをデタッチします。
  • EC2 のセキュリティグループのインバウンドルールでタイプ : HTTPSソース : カスタム -> VPCのCIDRを追加します。

image

  • 次にエンドポイントを 3 つ作成します。
    • まず ssm のエンドポイントに対して作成します。VPC -> エンドポイント -> エンドポイントを作成をクリックし、適当に名前をつけサービスカテゴリAWSのサービスにします。

image

  • サービス選択画面でcom.amazonaws.ap-northeast-1.ssmを選択します。(リージョンが異なる場合は該当のリージョンを選択)

image

  • EC2 が存在する VPC を選択し AZ を選択、サブネットを選択します。

image

  • セキュリティグループを選択し、エンドポイントを作成をクリックします。

image

  • 同様にしてあと 2 つ作成します。サービス:com.amazonaws.ap-northeast-1.ec2messages

image

  • サービス:com.amazonaws.ap-northeast-1.ssmmessages

image

  • 再度接続してみて、ちゃんと接続されることを確認します。
% ssh ec2-user@i-XXXXXXXXXXXXXXX -i .ssh/<your key>
Last login: Wed Feb 23 13:49:33 2022 from localhost

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-142 ~]$

これでプライベートサブネットからもアクセス可能となりました 🎉

参考

Systems Manager を使用したインターネットアクセスなしでのプライベート EC2 インスタンスの管理

Discussion