AWS Session Managerを今更ながら認識した件

この記事は[Supershipグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/supership)の20日目の記事です。

# はじめに
いまだにSSHは鍵交換して、22ポートを開けて、踏み台サーバー経由するなどが当たり前と思っていたのですが、弊社のccoeチームからsession-managerについて共有を受け、今更ながら存在を知り、感激したので、自分の備忘としても書いておきたいと思います。

# SessionManagerでできること
AWSのサポートドキュメントに記載があるのですが、一部抜粋いたします。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html
1. 22ポートを開放などが不要

2. 踏み台サーバーが不要

3. SSH キーを管理不要

4. コンソールと CLI からワンクリックでマネージドノードへアクセス可能

5. セッションアクティビティーのログ記録がCloudwatchやS3と連携可能

# セットアップ手順
基本的には下記ドキュメントにしたがって進めていくだけです。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started.html
## 1. 前提
+ サポートされるOS
大半のOSはサポートされているので特に問題になることはないかと。今回はAmazon Linux 2 を利用します。
+ SSM Agent
Amazon Linux 2 を AMI として利用していればデフォルトで稼働しているため、とくに考慮する必要なさそうです。
+ サブネット
今回は手軽に試すことが目的なので、パブリックなサブネット上のEC2インスタンスへの接続を試しています。プライベートサブネット接続はVPCエンドポイントの作成などを実施が必要です。
[参考：セッションマネージャーをプライベートサブネットから利用してみる](https://www.sunnycloud.jp/column/20220914-01/)

## 2. Session Manager 許可を持つ IAM ロールを確認または作成する
ひとまずデフォルトのAmazonSSMManagedInstanceCoreポリシーを割り当てたIAMロールを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/29a8a825-0eea-fa7a-035b-5f25951b04e2.png)

## 3.EC2インスタンスに該当IAMロールを設定する
先ほど作成したIAMロールをEC2インスタンスにアタッチする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/148ef228-d7e1-4b38-a82b-951e28ca3a8b.png)

が、設定直後ではまだコンソールからは接続できない。。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/9b97ae67-a29a-4082-407f-07e82c1255ea.png)
 
けど、放置して10分ぐらい経過すると接続できる！！(謎)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/6328eadf-5eeb-3888-722a-4dbb86ccd007.png)

画面はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/23c8e736-e495-1f2f-0376-8d4b99f21bed.png)

ちなみに、SSM-Agentのステータス確認するとこんな感じ
```
sh-4.2$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
   Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-12-14 09:25:41 UTC; 1h 5min ago
 Main PID: 3096 (amazon-ssm-agen)
   CGroup: /system.slice/amazon-ssm-agent.service
           ├─3096 /usr/bin/amazon-ssm-agent
           ├─3189 /usr/bin/ssm-agent-worker
           ├─3488 /usr/bin/ssm-session-worker shinsuke.nakamura@supership.jp-0541172aa93d0a9b7
           ├─3500 sh
           ├─3579 /usr/bin/ssm-session-worker shinsuke.nakamura@supership.jp-0441ce03c59c8333d
           └─3591 sh

Dec 14 09:25:42 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:41 INFO [amazon-ssm-agent] u...IPC
Dec 14 09:25:42 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:41 INFO [amazon-ssm-agent] a...2.0
Dec 14 09:25:42 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:41 INFO [amazon-ssm-agent] O...d64
Dec 14 09:25:42 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:41 INFO [CredentialRefresher...her
Dec 14 09:25:42 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:42 INFO [amazon-ssm-agent] [...ess
Dec 14 09:25:43 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:42 INFO [amazon-ssm-agent] [...ted
Dec 14 09:25:43 ip-172-31-3-48.ap-northeast-1.compute.internal amazon-ssm-agent[3096]: 2022-12-14 09:25:42 INFO [amazon-ssm-agent] [...nds
Dec 14 09:48:27 ip-172-31-3-48.ap-northeast-1.compute.internal useradd[3358]: new group: name=ssm-user, GID=1001
Dec 14 09:48:27 ip-172-31-3-48.ap-northeast-1.compute.internal useradd[3358]: new user: name=ssm-user, UID=1001, GID=1001, home=/hom...ash
Dec 14 10:31:17 ip-172-31-3-48.ap-northeast-1.compute.internal sudo[3602]: ssm-user : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAN...gent
Hint: Some lines were ellipsized, use -l to show in full.
```

## 4.CLIから接続する
コンソールからだと作業もしづらいので、やはりCLIからの接続も試してみます。

1 AWSCLI のインストール
```
$ brew install awscli
```
2 プラグインのインストール
```
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
```
3 sshconfigファイルに追記
```
$ vim ~/.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'"
```
4 事前に作成した秘密鍵を使ってSSH接続
```
$ ssh -i "test_session_manager.pem" ec2-user@<インスタンスID>

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

https://aws.amazon.com/amazon-linux-2/
19 package(s) needed for security, out of 38 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-3-48 ~]$
```
いけました！便利！
もちろんインバウンドポートは全く開放していません。

# 気になったこと

## ssm-user権限
コンソールから接続するとデフォルトのOSユーザーはssm-userです。
これは一応sudoできるので、特に問題ないですが、最初あれっと思ったので
下記を参考にさせていただきました。
[Session Managerでec2-userやrootとして作業する | AWS Systems Manager](https://www.bioerrorlog.work/entry/session-manager-ec2-user)

## 監査ログはどこに？
監査ログはどこに記録されているのかわからなかったのですが、デフォルトでは設定されていないようなので下記から設定が必要でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/e6d77637-9d95-7ee7-220a-6572d74a2935.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/1348edf2-9144-37b8-b8bb-bf00c225a28e.png)

以下で設定してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/b7434747-d993-91ae-4b11-005f7e7502d9.png)

下記のようなログが出ました。
![スクリーンショット 2022-12-20 12.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/dfd15813-11be-c3b2-f0e9-ddbee8da9f1b.png)

バッチリ取れてますね。
```
Script started on 2022-12-15 04:18:47+0000
[?1034hsh-4.2$ 
[Ksh-4.2$ 

sh-4.2$ 

sh-4.2$ 

sh-4.2$ test[K[K[K[Kdf -h

Filesystem      Size  Used Avail Use% Mounted on

devtmpfs        474M     0  474M   0% /dev

tmpfs           483M     0  483M   0% /dev/shm

tmpfs           483M  352K  483M   1% /run

tmpfs           483M     0  483M   0% /sys/fs/cgroup

/dev/xvda1      8.0G  1.6G  6.5G  20% /

sh-4.2$ whoami

ssm-user

sh-4.2$ 
Script done on 2022-12-15 04:18:47+0000
```


# まとめ
SessionManagerを使って、ポート開放や踏み台サーバーなしで簡単にSSH接続ができました。
SessionManagerの機能は2018年にリリースされていたようなので、大変今更感が強いのですが、まだ使っていない方がいたら使わない手はないと思いますので、ぜひお試しください。

# 最後に
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。

[Supership 採用サイト](https://supership.jp/recruit/)

是非ともよろしくお願いします！

# 参考
https://www.bioerrorlog.work/entry/session-manager-ec2-user
https://baresupport.jp/blog/2022/03/14/82/
https://qiita.com/comefigo/items/b705325d082018ab2348
https://dev.icare.jpn.com/dev_cat/aws_ssm_session_manager_introduction/