この記事はSupershipグループ Advent Calendar 2022の20日目の記事です。
はじめに
いまだにSSHは鍵交換して、22ポートを開けて、踏み台サーバー経由するなどが当たり前と思っていたのですが、弊社のccoeチームからsession-managerについて共有を受け、今更ながら存在を知り、感激したので、自分の備忘としても書いておきたいと思います。
SessionManagerでできること
AWSのサポートドキュメントに記載があるのですが、一部抜粋いたします。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html
-
22ポートを開放などが不要
-
踏み台サーバーが不要
-
SSH キーを管理不要
-
コンソールと CLI からワンクリックでマネージドノードへアクセス可能
-
セッションアクティビティーのログ記録が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エンドポイントの作成などを実施が必要です。
参考:セッションマネージャーをプライベートサブネットから利用してみる
2. Session Manager 許可を持つ IAM ロールを確認または作成する
ひとまずデフォルトのAmazonSSMManagedInstanceCoreポリシーを割り当てたIAMロールを作成する。
3.EC2インスタンスに該当IAMロールを設定する
先ほど作成したIAMロールをEC2インスタンスにアタッチする。
ちなみに、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
監査ログはどこに?
監査ログはどこに記録されているのかわからなかったのですが、デフォルトでは設定されていないようなので下記から設定が必要でした。
バッチリ取れてますね。
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ではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
是非ともよろしくお願いします!
参考
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/