コーヒーが好きな木谷映見です。
本日は、AWS Systems Manager のセッションマネージャーを使用したリモートホストへのポートフォワードを制限してみます。
- セッションマネージャーでリモートホストへのポートフォワードを制限する経緯
- 準備:リモートホストへのポートフォワードができる環境を作る
- 検証:リモートホストへのポートフォワードは禁止する
- 検証:リモートホストへのポートフォワードもポートフォワードも禁止する
- 考慮事項
- 参考
セッションマネージャーでリモートホストへのポートフォワードを制限する経緯
2022年5月27日、AWS Systems Manager(以降、SSM と表記)のセッションマネージャーでリモートホストへのポートフォワード機能をサポートしたアップデートがありました。
aws.amazon.com
ここでメリットとして「手元のローカル端末からプライベートサブネットの RDS にログインして操作できる」ことが考えられました。
逆に考えると「"ssm:StartSession" Action が許可されたユーザであれば、RDS にログインして操作できてしまう」という側面も考えられます。
そこで、セッションマネージャーは使えるようにしつつ、リモートホストへのポートフォワードは禁止する IAM ポリシーを書いてみます。
準備:リモートホストへのポートフォワードができる環境を作る
リモートホストへのポートフォワードができる環境を整えます。

詳細は以下ブログをご参照ください。
blog.serverworks.co.jp
今回、AWS CLI を実行するユーザには "ssm:StartSession" Action を許可したポリシーを直接アタッチします。

手元のローカル端末で、リモートホストへのポートフォワード用のコマンドを実行します。
aws ssm start-session \
--target i-bastionxxxxxxxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["remote-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["13306"]}'
実行結果
$ aws ssm start-session \
> --target i-bastionxxxxxxxxxx \
> --document-name AWS-StartPortForwardingSessionToRemoteHost \
> --parameters '{"host":["remote-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["13306"]}'
Starting session with SessionId: user-port-forwarding-to-remote-hosts-xxxxxxxxxxxxxxxxx
Port 13306 opened for sessionId user-port-forwarding-to-remote-hosts-xxxxxxxxxxxxxxxxx.
Waiting for connections...
ターミナルはこのまま、別途コマンドプロンプトを開き、ポートフォワード用ローカルポート番号 13306 ポートに接続します。
>mysql -u admin -p -h localhost -P 13306
リモートホストの Amazon RDS (MySQL) にログインできました。

検証:リモートホストへのポートフォワードは禁止する
AWS CLI を実行するユーザの IAM 権限を制限して、リモートホストへのポートフォワードを禁止します。

SSM ドキュメント AWS-StartPortForwardingSessionToRemoteHost へのアクションを拒否する IAM ポリシーを作成し、ユーザーグループに付与します。
IAM コンソール画面で [ポリシー] - [ポリシーの作成]をクリックします。
JSON でポリシーを記載してもいいのですが、今回はビジュアルエディタで作成してみました。
- ビジュアルエディタ
- サービス:Systems Manager
- アクション:StartSession
- document:「ARN の追加」をクリック

document の ARN は以下のように指定します。
- Region:
* - Account:
* - Document name:
AWS-StartPortForwardingSessionToRemoteHost

リモートホストへのポートフォワードアクションが定義された SSM ドキュメント名は、SSM コンソールの [共有リソース] - [ドキュメント] を開き、「Amazon が所有」タブで「
Session Documents」にチェックして探すと確認できます。

【今回作成したポリシー】
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": "ssm:StartSession",
"Resource": "arn:aws:ssm:*:*:document/AWS-StartPortForwardingSessionToRemoteHost"
}
]
}

このユーザーグループに、ユーザーを追加します。
追加したユーザーで、リモートホストへのポートフォワード用のコマンドを実行すると、以下のようにエラーになりました。
$ aws ssm start-session \
> --target i-bastionxxxxxxxxxx \
> --document-name AWS-StartPortForwardingSessionToRemoteHost \
> --parameters '{"host":["remote-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["13306"]}'
An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::716243146259:user/user-port-forwarding-to-remote-hosts is not authorized to perform: ssm:StartSession on resource: arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSessionToRemoteHost with an explicit deny in an identity-based policy
ちなみに、通常のポートフォワードはできます。

$ aws ssm start-session \ > --target i-bastionxxxxxxxxxx \ > --document-name AWS-StartPortForwardingSession \ > --parameters "portNumber=22,localPortNumber=10022" Starting session with SessionId: user-port-forwarding-to-remote-hosts-xxxxxxxxxxxxxxxxx Port 10022 opened for sessionId user-port-forwarding-to-remote-hosts-xxxxxxxxxxxxxxxxx. Waiting for connections...
検証:リモートホストへのポートフォワードもポートフォワードも禁止する
ついでに、AWS CLI を実行するユーザの IAM 権限を制限して、セッションマネージャーを利用したポートフォワード自体の禁止も試してみましょう。

SSM ドキュメント AWS-StartPortForwardingSessionToRemoteHost 、 AWS-StartPortForwardingSession へのアクションを拒否するポリシーを作成し、ユーザーグループに付与します。
【今回作成したポリシー】
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": "ssm:StartSession",
"Resource": [
"arn:aws:ssm:*:*:document/AWS-StartPortForwardingSessionToRemoteHost",
"arn:aws:ssm:*:*:document/AWS-StartPortForwardingSession"
]
}
]
}

このユーザーグループに、ユーザーを追加します。
追加したユーザーで、リモートホストへのポートフォワード用のコマンドを実行すると、以下のようにエラーになりました。
$ aws ssm start-session \
> --target i-bastionxxxxxxxxxx \
> --document-name AWS-StartPortForwardingSessionToRemoteHost \
> --parameters '{"host":["remote-rds.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["13306"]}'
An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::716243146259:user/user-port-forwarding-to-remote-hosts is not authorized to perform: ssm:StartSession on resource: arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSessionToRemoteHost with an explicit deny in an identity-based policy
通常のポートフォワード用のコマンドを実行すると、以下のようにエラーになりました。
$ aws ssm start-session \ > --target i-bastionxxxxxxxxxx \ > --document-name AWS-StartPortForwardingSession \ > --parameters "portNumber=22,localPortNumber=10022" An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam::xxxxxxxxxxxx:user/user-port-forwarding-to-remote-hosts is not authorized to perform: ssm:StartSession on resource: arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession with an explicit deny in an identity-based policy
考慮事項
以下のように、接続する AWS アカウント ID を指定すると、ポートフォワードの制御ができない(ポートフォワードできてしまう)ので、ご注意ください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Deny",
"Action": "ssm:StartSession",
"Resource": "arn:aws:ssm:*:123456789012:document/AWS-StartPortForwardingSessionToRemoteHost"
}
]
}
参考
共有 SSM ドキュメントを使用する - AWS Systems Manager
Session Manager の追加サンプル IAM ポリシー - AWS Systems Manager
IAM ポリシーを使用して Systems Manager パラメータへのアクセスを制限する - AWS Systems Manager
emi kitani(執筆記事の一覧)
AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。