Session Manager で SSH/SCPをトンネリングしてEC2に接続する

## はじめに
2019/7/9 に AWS Systems Manager Session Manager が SSHおよびSCP接続の
トンネリングをサポートしました。
これにより、踏み台サーバー等を使用せずに、Session Manager を介して対象のEC2や
マネージドインスタンスに接続することが可能になります。

**Session Manager launches tunneling support for SSH and SCP**
https://aws.amazon.com/about-aws/whats-new/2019/07/session-manager-launches-tunneling-support-for-ssh-and-scp/

## やってみる
AWS Systems Manager 自体の説明は割愛させていただきます。

### サーバー側の要件
SSM Agentのバージョンが **2.3.672.0** 以上である必要があります。
バージョンが古い場合は、Systems Managerの Run Command を使用して
最新版にアップデートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f58c8101-3365-a0c1-cc9b-8a7a018e89b4.png)

コマンドの履歴でアップデートが正常終了していることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/90845eea-6e88-ce5a-99f2-2d2862e7cdaf.png)

### クライアント側の要件
AWS CLI のバージョンが **1.16.12** 以上である必要があります
その他に Session Manager Plugin のバージョンが **1.1.22.0** 以上である必要があります

```shell-session
$ aws --version
aws-cli/1.16.195 Python/3.6.0 Windows/10 botocore/1.12.185

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

バージョンが古い場合は以下のドキュメントに沿って最新版をインストールします。

**(Optional) Install the Session Manager Plugin for the AWS CLI**
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

また使用するSSHクライアントが ProxyCommand をサポートしている必要があります。
私の環境はWindowsでしたので、OpenSSH + Git Bash を使用しました。
SSH の設定ファイル(~/.ssh/config)に以下の内容を追記します。
SSHコマンドで接続先ホスト名が i-(EC2インスタンス) または mi-(マネージドインスタンス)で
はじまる場合は aws ssm start-session コマンドを実行するという内容になっています。

```shell
# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

### IAM ユーザーの要件
最低限、以下のドキュメントで紹介されているポリシーに記載された権限が必要となります。

**Quickstart Default IAM Policies for Session Manager**
https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html

### 接続する
SSHコマンドを実行する際にホスト名にインスタンスIDを指定すると以下のようにSSHで接続できます。

```shell-session
$ ssh -i ./my-key.pem ec2-user@i-0123456789abcdefg
Last login: Wed Jul 10 02:56:56 2019 from localhost

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

https://aws.amazon.com/amazon-linux-2/

[ec2-user@ip-172-31-20-75 ~]$
```

Session Manger と SSM Agent を介して接続しているためだと思われますが、
接続元はlocalhost(127.0.0.1)になっています。

```shell-session
[ec2-user@ip-172-31-20-75 ~]$ sudo tail -3 /var/log/secure
Jul 10 04:26:20 ip-172-31-20-75 sshd[9269]: Accepted publickey for ec2-user from 127.0.0.1 port 41360 ssh2: RSA SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxx
Jul 10 04:26:20 ip-172-31-20-75 sshd[9269]: pam_unix(sshd:session): session opened for user ec2-user by (uid=0)
Jul 10 04:31:50 ip-172-31-20-75 sudo: ec2-user : TTY=pts/0 ; PWD=/home/ec2-user ; USER=root ; COMMAND=/bin/tail -3 /var/log/secure

```

## メリット
### セキュリティグループでSSHを許可する必要がない
SSM Agent を介して通信するため、EC2としてはアウトバウンド通信でSSMのエンドポイントと
通信できればよいです。そのためセキュリティグループのインバウンドルールで
SSHのポートを開けておく必要がありません。
最近利用可能になった EC2 Instance Connect では EC2 Instance Connect が利用する
IPアドレス範囲 をセキュリティグループに明示的に追加する必要があります。

### SCPも利用できる
Systems Manager のシェルセッションでは仕組み上、SCPの転送には対応できていませんでした。
この機能を使うとSCPによるファイル転送を行うことができます。

```shell-session
$ scp -i ./my-key.pem ./test.txt ec2-user@i-0123456789abcdefg:/tmp/test.txt
test.txt                                                                  100%  769    38.0KB/s   00:00
```

### 対応OSの幅が広い
EC2 Instance Connect は 2019/7/9 時点 で対応OSが限られています。

* Amazon Linux 2（任意のバージョン）
* Ubuntu 16.04以降

Session Managerを使用したSSH接続の場合、SSM Agent をインストール可能な
以下のLinux環境であれば利用することができます。

* Amazon Linux and Amazon Linux 2
* Ubuntu Server
* Red Hat Enterprise Linux (RHEL)
* CentOS
* SUSE Linux Enterprise Server (SLES) 12
* Raspbian

**Manually Install SSM Agent on Amazon EC2 Linux Instances**
https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-manual-agent-install.html

またSystems Managerを利用して管理されているオンプレミスの
マネージドインスタンスに対しても利用可能です。
ただしAdvanced-Instances Tierで登録されている必要があります。

**Step 7: (Optional) Enable the Advanced-Instances Tier**
https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-managedinstances.html

## 参考
**Step 7: (Optional) Enable SSH Session Manager Sessions**
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

**Starting a Session (SSH)**
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-start-ssh

**EC2 Instance Connect の特徴や注意点についてまとめてみる**
https://qiita.com/hayao_k/items/7b44ed1cd11651272985

以上です。
参考になれば幸いです。