AWS SSMでSSHトンネリング
aws-vault はaws credentialを管理したりSTSでの一時的なクレデンシャルを発行して一時的な認証情報として使うことの出来るツール
ssh-over-ssm はssmを利用してSendCommandでローカルでコマンド実行の際に鍵ペアを生成してpublic keyをリモートマシンのauthorizedkeysに登録する
ssh configでProxyCommandとして登録することで透過的なキーレスでのSSH接続が可能になる
aws-vault
AWS SSM
AWS SSMプラグインをインストールする
Mac
code:bash
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
Linux
code:bash
$ sudo dpkg -i session-manager-plugin.deb
ssh-over-ssm
ssh-over-ssmをインストールする
code:bash
sudo chmod +x /usr/local/bin/ssh-ssm
SSH Config
ssh configでProxyCommandを使うよう設定する
code:bash
❯ cat ~/.ssh/config
Host your-project.bastion
Hostname i-0efead5e1a8v1c32f
Match host i-*
IdentityFile ~/.ssh/ssm-ssh-tmp
PasswordAuthentication no
GSSAPIAuthentication no
User ec2-user
ProxyCommand bash -c "/usr/local/bin/ssh-ssm %h %r"
AWS CLIのSSM経由でログイン
code:bash
$ aws-vault exec test -n -- aws ssm start-session --target i-0efead5e1a8v1c32f
Starting session with SessionId: test-01a7ad1dd5e4ee30d
sh-4.2$
sh-4.2$
SSHログイン
AWS SSMセッションマネージャーはSSMとインスタンス同士の通信で完結していてec2messagesでメッセージのやり取りをしているが、SSHセッションを開始することも出来る。
※SSH接続ではエンドトゥーエンドで暗号化されるためセッションの操作ログが残らないことに注意
code:bash
❯ aws-vault exec test -n -- ssh-ssm i-0efead5e1a8v1c32f ec2-user
Last login: Sat May 30 15:28:31 2020 from localhost
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
SSH接続を無効化したい場合はIAMポリシーでAWS-StartSSHSessionドキュメントを無効化するように制御する
code:bash
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Deny",
"Action": "ssm:StartSession",
"Resource": "arn:aws:ssm:*:*:document/AWS-StartSSHSession"
}
]
}
トンネリング
code:bash
$ aws-vault exec test -n -- ssh -f -nNT -oExitOnForwardFailure=yes -L 3300:your-rds-development.~~.ap-northeast-1.rds.amazonaws.com:3306 your-project.bastion
$ mysql -h 127.0.0.1 -P 3300 -u foo -p
2020-06-01現在SSMからVPC内の対象のDBホスト等に直接ポートフォワーディングすることは出来ないのでトンネリングする場合は依然SSM用に踏み台ホストが必用