AWS Systems Manager のセッションマネージャーを使用したリモートホストへのポートフォワードを制限する

記事タイトルとURLをコピーする

コーヒーが好きな木谷映見です。

本日は、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-StartPortForwardingSessionToRemoteHostAWS-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

AWS Policy Generator

emi kitani(執筆記事の一覧)

AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。