🔐
Session Manager経由でSSH接続する方法
今回は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のサービス
にします。
- まずssmのエンドポイントに対して作成します。
- サービス選択画面で
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 ~]$
これでプライベートサブネットからもアクセス可能となりました🎉
Discussion