背景
AWS Summit Japan 2022 の興奮冷めやらぬ間にしれっとAWSが次ような発表をしました。
AWS Systems Manager announces support for port forwarding to remote hosts using Session Manager
詰まるところ今まではローカルホストのポートフォワードしか対応できていなかったので、外部からRDSへ接続する為の踏み台に対して SSH アカウントを個別に発行する必要がありました。
SSH アカウントの管理ではキーペアの登録等で運用が面倒でしたが、それが一切不要になりました。
課題
一部の運用では「セッションマネージャーを許可したいだけだったのに RDS に接続できてしまう」というのが不都合だということで、この機能を制限してみる。
解決
今回の機能のメリットは「IAMだけで集中管理ができる」ことなので、リモートホストに対するポートフォワード機能をIAMポリシーで制限してしまえば良い。
具体的な制限には若干の特徴があるので注意してください。
基本形
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": "ssm:StartSession",
"Resource": "arn:aws:ssm:{region}:{account_id}:document/AWS-StartPortForwardingSessionToRemoteHost"
}
]
}
結果
{account_id} を接続先のAWSアカウントIDにしてしまうと、繋がってしまうので、拒否したい場合はアスタリスクにしておくべし。
繋がらない(OK)
"Resource": "arn:aws:ssm:*:*:document/AWS-StartPortForwardingSessionToRemoteHost"
"Resource": "arn:aws:ssm:ap-northeast-1:*:document/AWS-StartPortForwardingSessionToRemoteHost"
繋がる(NG)
"Resource": "arn:aws:ssm:*:111111111111:document/AWS-StartPortForwardingSessionToRemoteHost"
"Resource": "arn:aws:ssm:ap-northeast-1:111111111111:document/AWS-StartPortForwardingSessionToRemoteHost"
一言
この挙動はどこか別のAWSアカウントと通信しているということか。
それと、RDSへの接続情報知っていれば、SSMだろうがSSHだろうが接続出来てしまうよね。セッションマネージャーのリモートホストポートフォワードは困るというのはそもそもの運用に問題は無いだろうか。
最後にインフラエンジニアは「SSHしたら負け」だと信じてます。
って「一言」どころじゃなくなってるし。
さらに一言
そもそも接続のやり方どうなってるん?な説明も簡潔に。
ポートフォワード
# aws ssm start-session \
--target {instance_id} \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["{rds_endpoint"],"portNumber":["3306"], "localPortNumber":["3306"]}' \
--profile {profile} &
接続
# mysql -u {user} -p -h 127.0.0.1 -P 3306
Enter password:
& を使ってバックグラウンド実行させておけば同じ shell で接続できます。
但し、作業後は一応バックグラウンドプロセスを kill しておきましょう。