Session ManagerでSCPとかSSH Portforwardもできる！

## 何の話？
以前、うちのエンジニアの人たちに、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/)

これはもしや！

## セットアップ
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

```bash:
$ session-manager-plugin --version
1.1.23.0
```

#### SSH Config
`~/.ssh/config` に下記を追加します。

```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指定して接続できました。

```bash:
$ 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から接続されていることになってます。

``` :/var/log/secure
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してみる

```bash:
$ 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するためのアクセス許可は考えなくていいことになりそう！