【AWS】SSH/SessionManagerによる要件別踏み台構成のまとめ

# 目的
用途別に踏み台構成を用意し、それぞれのポイントや接続方法を整理します。
SSMが何かなどの話はここでは除外します。

また、構成パターン別にCloudFormation用のymlファイルは下記記事にまとめました。
ご参考までに。
https://qiita.com/eiji-noguchi/items/856b7964e7b17a76d011

構成パターンは以下になります。
[1.EC2インスタンスがパブリックサブネットにあってssh接続をしたいとき](#1ec2インスタンスがパブリックサブネットにあってssh接続をしたいとき)
[2.EC2インスタンスがパブリックサブネットにあってインターネットへの経路を持つがSession Managerを通してSSH接続する場合](#2ec2インスタンスがパブリックサブネットにあってインターネットへの経路を持つがsession-managerを通してssh接続する場合)
[3.EC2インスタンスがプライベートサブネットにあってインターネットへの経路を持たずSession Managerを通して接続する場合](#3ec2インスタンスがプライベートサブネットにあってインターネットへの経路を持たずsession-managerを通して接続する場合)

# 1.EC2インスタンスがパブリックサブネットにあってssh接続をしたいとき
基本的な踏み台構成になります。
シンプルの構成かつ、外部とのトラフィックが発生する場合にこの構成をとることが多くなると思います。

###### 構成図
<img width="600" alt="ssh" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/461e6cc8-bca2-834d-7fc6-d98341bf0d1b.png">

###### ポイント
- 踏み台用インスタンスはパブリックサブネットに配置する
- 踏み台用インスタンスのキーペアを用意する
- ルートテーブルにはInternet Gatewayへのルートを設定する
- セキュリティグループにはポート22からのssh通信を許可するインバウンドルールを設定する

###### 接続例
```powershell:接続コマンド
ssh -i "/path/key-pair-name.pem" instance-user-name@instance-public-dns-name
```

# 2.EC2インスタンスがパブリックサブネットにあってインターネットへの経路を持つがSession Managerを通してSSH接続する場合
セキュリティグループのインバウンドルールを設定しなくてもいいため、パターン1よりもよりセキュアになります。
また、セッション履歴も管理したい場合にはこの構成になるかと思います。

###### 構成図
<img width="600" alt="ssmpub" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/e8a67a79-62fd-90d7-27ca-4ddeef200a50.png">

###### ポイント
- 踏み台用インスタンスはパブリックサブネットに配置する
- 踏み台用インスタンスのキーペアを用意する
- 踏み台用インスタンスにはIAMロール「AmazonSSMManagedInstanceCore」をアタッチする
- ルートテーブルにはInternet Gatewayへのルートを設定する
- セキュリティグループにはポート443からのHTTPS通信を許可するアウトバウンドルールを設定する

###### 接続例
※AWS Session Managerを使用してSSH接続を行うためにはSSHの設定ファイル(通常 C:\Users\<username>\.ssh\config )に以下を追加する必要が必要になります。
```text:config
# SSH over Session Manager
# 「host i-* mi-*」により、SSH接続を行う対象となるEC2インスタンスのIDが「i-」または「mi-」で始まるものを指定
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
```

```powershell:接続コマンド
ssh -i "/path/key-pair-name.pem" instance-user-name@instance-id
```

###### 参考
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html


# 3.EC2インスタンスがプライベートサブネットにあってインターネットへの経路を持たずSession Managerを通して接続する場合
一番セキュアにな構成になります。
経路を完全に閉じた状態でSSMを利用する場合にはこの構成になるかと思います。

###### 構成図
<img width="600" alt="ssmpri" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/0362193b-f0e6-ace2-fea9-979e51a205c3.png">

###### ポイント
- 踏み台用インスタンスはプライベートサブネットに配置する
- 踏み台用インスタンスのキーペアを用意する
- 踏み台用インスタンスにはIAMロール「AmazonSSMManagedInstanceCore」をアタッチする
- 踏み台用インスタンスのセキュリティグループにはポート443からのHTTPS通信を許可するアウトバウンドルールを設定する
- VPC Endpointsのセキュリティグループにはポート443からのHTTPS通信を許可するインバウンドルールを設定する
- 下記3つのVPC Endpointsを作成する
    - ec2messages.region.amazonaws.com
    - ssm.region.amazonaws.com
    - ssmmessages.region.amazonaws.com

###### 接続例
※AWS Session Managerを使用してSSH接続を行うためにはSSHの設定ファイル(通常 C:\Users\<username>\.ssh\config )に以下を追加する必要が必要になります。
```text:config
# SSH over Session Manager
# 「host i-* mi-*」により、SSH接続を行う対象となるEC2インスタンスのIDが「i-」または「mi-」で始まるものを指定
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
```

```powershell:接続コマンド
ssh -i "/path/key-pair-name.pem" instance-user-name@instance-id
```

###### 参考
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html

# まとめ
以上が3パターンによる踏み台接続の方法となります。
それぞれの要件にあった設計を選び、よりセキュアな構成を意識するようにしましょう。