何の話?
以前、うちのエンジニアの人たちに、EC2に接続するときはSSHやめて、セッションマネージャーすすめてみたんですが、SSHでのターミナルだけでなく、SCPでのファイルコピーとか、インスタンス内でサービス立ち上げてアクセスするためにPortforwardとか頻繁に使うってことであまりセッションマネージャーは使っていなかったんですが・・・
こんなアナウンスが。
[Session Manager launches tunneling support for SSH and SCP] (https://aws.amazon.com/jp/about-aws/whats-new/2019/07/session-manager-launches-tunneling-support-for-ssh-and-scp/)
これはもしや!
セットアップ
クライアント側
セッションマネージャープラグイン
1.1.22.0
が必要なのでアップデートしましょう。
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
$ session-manager-plugin --version
1.1.23.0
SSH Config
~/.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'"
i-*
はインスタンスIDを指定したとき、 mi-*
はオンプレのサーバをSSMで管理している場合に使うIDです。
つまり、インスタンスIDに対してSSHアクセスしたときには、ssmでトンネル張って、その中をSSH接続するということですね。
EC2インスタンス側
SSMエージェント
2.3.672.0
以上が必要ですのでRunCommandでアップデートしてください。
EIP
SSM使うので不要です。
セキュリティグループ
もちろん外部からのSSHへのアクセス許可は不要です。
SSH Key
前述のとおり、セッションマネージャーのトンネル内でSSH接続するので、keyの付与は必要になります。
ない場合、SSHの鍵が違う場合はこんな感じ。
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
なので、EC2にsshdは必要ってことですね。
接続
普通にSSH
普通にSSHコマンドでインスタンスID指定して接続できました。
$ ssh ec2-user@i-xxxxxxxxxxxxxxx -i ~/.ssh/id_rsa
ast login: Wed Jul 10 03:23:25 2019 from localhost
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 6 packages available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-104 ~]$
おお!
普通にOSのユーザーで使えますね。
トンネル張ってるので、ログ的にはlocalhostから接続されていることになってます。
Jul 10 03:08:19 ip-10-0-1-104 sshd[4173]: Accepted publickey for ec2-user from 127.0.0.1 port 49148 ssh2: RSA SHA256:aHEcVcQEixW0amxNSFVjabsst2Jglm7KDbYr+Tyb3Zjko
Jul 10 03:08:19 ip-10-0-1-104 sshd[4173]: pam_unix(sshd:session): session opened for user ec2-user by (uid=0)
Jul 10 03:08:38 ip-10-0-1-104 sshd[4207]: Received disconnect from 127.0.0.1 port 49148:11: disconnected by user
Jul 10 03:08:38 ip-10-0-1-104 sshd[4207]: Disconnected from 127.0.0.1 port 49148
Jul 10 03:08:38 ip-10-0-1-104 sshd[4173]: pam_unix(sshd:session): session closed for user ec2-user
Jul 10 03:14:29 ip-10-0-1-104 sshd[4253]: Accepted publickey for ec2-user from 127.0.0.1 port 49216 ssh2: RSA SHA256:aHEcVcQEixW0amxNSFVjJyt2Jglm7KDbYr+Tyb3Zjko
Jul 10 03:14:29 ip-10-0-1-104 sshd[4253]: pam_unix(sshd:session): session opened for user ec2-user by (uid=0)
Jul 10 03:14:35 ip-10-0-1-104 sudo: ec2-user : TTY=pts/0 ; PWD=/home/ec2-user ; USER=root ; COMMAND=/bin/tail /var/log/secure
SCPしてみる
$ scp test.txt ec2-user@i-xxxxxxxxxxxxxxx:test.txt
test.txt 100% 191 11.2KB/s 00:00
$ ssh ec2-user@i-xxxxxxxxxxxxxxx ls
test.txt
おおお!
SSH PortForwardしてみる
$ ssh ec2-user@i-xxxxxxxxxxxxxxx sudo yum -y install httpd
$ ssh ec2-user@i-xxxxxxxxxxxxxxx sudo systemctl start httpd
$ ssh -fNL 8080:localhost:80 ec2-user@i-xxxxxxxxxxxxxxx
$ curl -I localhost:8080
HTTP/1.1 403 Forbidden
Date: Wed, 10 Jul 2019 03:24:08 GMT
Server: Apache/2.4.39 ()
Upgrade: h2,h2c
Connection: Upgrade
Last-Modified: Thu, 04 Apr 2019 18:08:00 GMT
Accept-Ranges: bytes
Content-Length: 3630
Content-Type: text/html; charset=UTF-8
おおおお!!!
残念ながら・・・
セッションマネージャーには出力をS3や、CloudWatch Logsに送信する機能がありますが、この接続の場合は出力されないようです。
出力はSSHになるので当然かもしれないですが・・・
まとめ
今度こそSSHするためのアクセス許可は考えなくていいことになりそう!