セキュリティグループの編集におけるリソースタグ条件を使用したアクセス制御を行うためのIAMポリシーの記述方法を教えて下さい

2021.08.11

困っていた内容

権限の付いている IAM ユーザにてセキュリティグループの編集をしたところ以下のエラーが発生しました。

You may be missing IAM policies that allow ModifySecurityGroupRules.
You are not authorized to perform this operation.

IAM ユーザにアタッチしているポリシーは以下のとおりです。IAM ユーザでは特定のタグを指定して "ec2:*" の権限を付けております。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*",
                "ec2:DescribeSecurityGroupRules",
                "ec2:ModifySecurityGroupRules"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Name": "mdfsg"
                }
            },
            "Resource": "*"
        }
    ]
}

各セキュリティグループに対して、リソースタグの条件を使用して、リソースタグが設定されている場合は編集を許可、リソースタグが設定されていない場合は拒否とする IAM ポリシーを作成したいです。エラーの原因と作成方法を教えて下さい。

エラーの原因はなんですか?

今回の発生したエラーは、リソースレベルの権限をサポートしているアクションと、サポートしていないアクションを同一ステートメントブロック内で混在させてポリシーを作成していたことに起因します。

権限の付いている IAM ユーザにアタッチされた IAM ポリシー("ec2:")には、リソースレベルの権限をサポートしない "ec2:Describe" アクション等が含まれています。

そのため、リソースレベルの権限をサポートする "ec2:ModifySecurityGroupRules" アクションが同一ステートメントブロック内で設定されているとエラーが発生します。

関連の記事については、下記ブログをご確認ください。

どう作成すればいいの?

リソースレベルの権限をサポートする "ec2:ModifySecurityGroupRules" については、以下の例のように別のステートメントブロック内にてポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": ["ec2:ModifySecurityGroupRules"],
            "Resource": ["arn:aws:ec2:*:*:security-group/*"],
            "Condition": {
                "StringNotEquals": {
                    "ec2:ResourceTag/Name": "mdfsg"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": ["ec2:*"],
            "Resource": "*"
        }
    ]
}

[補足]IAM Policy 説明

参考資料

  • Actions defined by Amazon EC2

    Actions
    ModifySecurityGroupRules

    Resource types (required)
    security-group

    Condition keys
    ec2:ResourceTag/${TagKey}

  • リソースタグを使用した EC2 リソースへのアクセスの制御

    Describe アクションはリソースレベルの権限をサポートしていないため、条件なしで別のステートメントで指定する必要があることに注意してください。

  • 条件キーテーブル

    すべてのアクションまたはリソースですべてのキーを指定できるわけではありません。特定のキーは、特定のタイプのアクションとリソースでのみ機能します