AWS Systems Manager Session Manager でポートフォワーディングする際に接続先の EC2 インスタンスをタグで絞り込む方法を教えてください

ssm:StartSession アクションを実行する許可を加える際は、実行するドキュメントの名前を resouce 句に加える必要があります。また、接続先の EC2 をタグで絞り込む際には condition 句での指定が必要となりますが、実行するドキュメントは condition 句での指定を外して別の要素として記述したほうが煩雑ではなくなります。
2024.04.09

困っていること

AWS Systems Manager Session Manager でポートフォワーディングする際に接続先の EC2 インスタンスをタグで絞り込みたいです。

参考資料[1]を元に、下記のように IAM ユーザーにポリシーを付与しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:<AccountID>:instance/*"
            ],
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/Env": [
                        "Dev"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession",
                "ssm:ResumeSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:userid}-*"
            ]
        }
    ]
}

しかしながら、下記のエラーが発生し、ポートフォワーディングによる接続ができません。

An error occurred (AccessDeniedException) when calling the StartSession operation: User: arn:aws:iam:::user/IAMUserName is not authorized to perform: ssm:StartSession on resource: arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession because no identity-based policy allows the ssm:StartSession action

どのように対応すれば良いでしょうか。

どう対応すればいいの?

下記の IAM ポリシーに変更してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:<AccountID>:instance/*"
            ],
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/Env": [
                        "Dev"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:username}-*"
            ]
        }
    ]
}

どうしてこうしなければいけないのか

ssm:StartSession アクションでは、Resouce句で対象を絞り込むことができます。

アクション 説明 アクセスレベル リソースタイプ(*必須) 条件キー
StartSession セッションマネージャーセッションの指定したターゲットへの接続を開始する許可を付与 書き込み document
instance
managed-instance
task
ssm:SessionDocumentAccessCheck
ssm:resourceTag/${TagKey}
aws:ResourceTag/${TagKey}

Resouce句にinstanceを指定し、Condition句にssm:resourceTag/${TagKey}を指定した場合、ドキュメントが対象から外れてしまします。

AWS Systems Manager Session Manager でポートフォワーディングする際に実行するドキュメントはAWS-StartPortForwardingSessionです。

そのため、ssm:StartSessionアクションの許可について、Resouce句にドキュメントAWS-StartPortForwardingSessionを対象するように明示的に記載する必要があります。

参考資料

[1]Session Manager の追加サンプル IAM ポリシー - AWS Systems Manager

[2]AWS Systems Manager のアクション、リソース、および条件キー - サービス認証リファレンス