コーヒーが好きな木谷映見です。
本日は、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冠。