web-dev-qa-db-ja.com

AWSポリシーで複数のStringNotEquals条件を提供するにはどうすればよいですか?

2つのVPCからのトラフィックを除き、すべてのトラフィックを拒否するAWS S3バケットポリシーを記述しようとしています。私が書こうとしているポリシーは、次のようなもので、2つのStringNotEqualsの間の論理ANDを使用しています(ただし、無効なポリシーは除きます)。

{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Allow-access-only-from-two-VPCs",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::my-bucket",
                    "arn:aws:s3:::my-bucket/*"],
       "Condition": {
         "StringNotEquals": {
           "aws:sourceVpc": "vpc-111bbccc"
         },
         "StringNotEquals": {
           "aws:sourceVpc": "vpc-111bbddd"
         }
       },
       "Principal": "*"
     }
   ]
}

これを使用する場合:

"StringNotEquals": {
       "aws:sourceVpc": ["vpc-111bbccc", "vpc-111bbddd"]
     }

次に、少なくとも1つの文字列比較がtrueを返し、S3バケットはどこからでもアクセスできません。

12
ikh

これまでに試したことはありませんが、次のように動作するはずです。 From: 詳細なアクセス制御のためのIAMポリシー条件の使用

    "Condition": {
        "ForAllValues:StringNotEquals": {
            "aws:sourceVpc": [
                "vpc-111bbccc",
                "vpc-111bbddd"
            ]
        },
7
helloV

元のJSONの問題:

"Condition": {
    "StringNotEquals": {
        "aws:sourceVpc": "vpc-111bbccc"
    },
    "StringNotEquals": {
        "aws:sourceVpc": "vpc-111bbddd"
    }
}

StringNotEqualsという名前の重複するキーは使用できません。

しかし、問題を解決する方法はいくつかあります。

条件を反転し、Allow権限ではなくDenyを指定します

説明不要:Allowの代わりにDeny権限を使用してから、配列でStringEqualsを使用します。すべての値はOR条件として使用されます。

{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Allow-access-only-from-two-VPCs",
       "Action": "s3:*",
       "Effect": "Allow",
       "Resource": ["arn:aws:s3:::my-bucket",
                    "arn:aws:s3:::my-bucket/*"],
       "Condition": {
         "StringEquals": {
           "aws:sourceVpc": ["vpc-111bbccc", "vpc-111bbddd"]
         }
       },
       "Principal": "*"
     }
   ]
}

セット演算子を使用する

IAMポリシーでは ForAnyValuesおよびForAllValues を使用できます。これにより、Condition内の複数の値をテストできます。

{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Deny-access-except-from-two-VPCs",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::my-bucket",
                    "arn:aws:s3:::my-bucket/*"],
       "Condition": {
         "ForAllValues:StringNotEquals": {
           "aws:sourceVpc": ["vpc-111bbccc", "vpc-111bbddd"]
         }
       },
       "Principal": "*"
     }
   ]
}

StringNotEqualsStringNotEqualsIgnoreCaseのハックの組み合わせを使用する

私はこれがうまくいくと確信していますが、条件文でVPCを2つに制限するだけです。

{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Deny-access-except-from-two-VPCs",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::my-bucket",
                    "arn:aws:s3:::my-bucket/*"],
       "Condition": {
         "StringNotEquals": {
           "aws:sourceVpc": ["vpc-111bbccc"]
         },
         "StringNotEqualsIgnoreCase": {
           "aws:sourceVpc": ["vpc-111ddeee"]
         }
       },
       "Principal": "*"
     }
   ]
}
2
wkl