🔐

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

2022/03/03に公開約5,800字

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

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

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

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

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

  • 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

  • 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を閉じてみます。

  • 再度接続してみて、ちゃんと接続されることを確認。
% 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ホスト名有効化しておきます。

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

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

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

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

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

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

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

  • 再度接続してみて、ちゃんと接続されることを確認します。
% 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

ログインするとコメントできます