複数の条件キーを持つ明示的な拒否ポリシーを使用して、IAM 評価ロジックを機能させるにはどうしたらよいですか?

最終更新日: 2020 年 8 月 20 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスと Amazon Elastic Block Store (Amazon EBS) ボリュームの作成を制限する AWS Identity and Access Management (IAM) の明示的な拒否ポリシーを作成したいと考えています。これを実行するにはどうすればよいですか?

簡単な説明

StringLike 条件演算子Allow を、または StringNotLike 条件演算子で Deny を使用することで、IAM ポリシータグで EC2 インスタンスと EBS ボリュームの起動を制限できます。StringLike 条件演算子で Allow を使用する手順については、「IAM ポリシータグを使用して EC2 インスタンスまたは EBS ボリュームの作成方法を制限するにはどうしたらよいですか?」を参照してください。

解決方法

StringNotLikeDeny を使用する次の IAM ポリシーの例を使って、EC2 インスタンスと EBS ボリュームの作成を制限します。

注: 特権アクセスを誤って付与するのを防ぐために、StringNotLikeDeny を使用するのがベストプラクティスです。

ポリシーが複数の条件演算子を持っているか、または複数のキーが 1 つの条件演算子にアタッチされている場合、条件は AND ロジックを使って評価されます。複数のタグ値を Deny にする場合、同じ AND ロジックを取得するには、各 RequestTag キーを別々のステートメントで使用する必要があります。

注: Deny ポリシーを使用して 1 つの条件にすべての RequestTag キー値を設定すると、期待どおりに動作しないことがあります。これは、すべての条件が満たされるまでアクションが許可されるためです。すべての条件が満たされると、アクションは拒否されます。

次の必須タグに注意してください。

  • cost_center タグには NULL 以外の値が必要です。
  • EC2 インスタンスには、Production という名前のタグキーがあります。
  • identifier タグは、任意の 5 文字の組み合わせである必要があります。
  • env タグの値は、sandboxdev、または prodである必要があります。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowToDescribeAll",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowRunInstances",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*::image/*",
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:key-pair/*"
            ]
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions1",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/cost_center": "?*"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions2",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "ForAllValues:StringNotLike": {
                    "aws:TagKeys": "Production"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions3",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/identifier": "?????"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions4",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/env": [
                        "sandbox",
                        "dev",
                        "prod"
                    ]
                }
            }
        },
        {
            "Sid": "AllowRunInstances1",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ]
        },
        {
            "Sid": "AllowCreateTagsOnRunInstance",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "RunInstances"
                }
            }
        }
    ]
}

次の強制値に注意してください。

  • aws:TagKeys 値は、Production の大文字と小文字を区別するチェックを強制します。
  • ?????? 値は、任意の 5 文字の組み合わせを使用できることを強制します (先頭または末尾のスペースは無視されます)。
  • ?* 値は、値フィールドに少なくとも 1 つの文字が存在することを強制して、EC2 インスタンスが空のタグ値で起動できないようにします。