🐶

セッションマネージャーがリモートホストのポートフォワードに対応した件

2022/05/31に公開

背景

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 しておきましょう。

Discussion