S3バケットポリシーにIPアドレスとVPCエンドポイントのアクセス制限を両方付けたい場合の対処法

2021.07.30

困っていた内容

S3バケットに対して、特定の IP アドレス以外のアクセスを拒否したいです。

加えて、特定の VPC エンドポイント以外のアクセスを拒否する設定を追加しようとしています。

バケットポリシーはどのように記述すればよいですか?

どう対応すればいいの?

以下のポリシーを設定してください。

{
  "Id": "SourceIP",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SourceIPAndVPCe",
      "Action": "s3:*",
      "Effect": "Deny",
      "Principal": "*",
      "Resource": "arn:aws:s3:::EXAMPLE-BUCKET/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "11.11.11.11/32",
            "22.22.22.22/32"
          ]
        },
        "StringNotEquals": {
          "aws:SourceVpce": [
            "vpce-1111111",
            "vpce-2222222"
          ]
        }
      }
    }
  ]
}

解説

特定の IP アドレス以外からのアクションを拒否するバケットポリシーは以下のような記述となります。

{
  "Id": "SourceIP",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SourceIP",
      "Action": "s3:*",
      "Effect": "Deny",
      "Principal": "*"
      "Resource": "arn:aws:s3:::EXAMPLE-BUCKET/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "11.11.11.11/32",
            "22.22.22.22/32"
          ]
        }
      }
    }
  ]
}

ベン図で記載すると、以下の範囲になります。(緑色の塗りつぶし部分が拒否の範囲となります)

特定の VPC エンドポイント以外からのアクションを拒否するバケットポリシーは以下のような記述となります。

{
  "Id": "VPCe",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VPCe",
      "Action": "s3:*",
      "Effect": "Deny",
      "Principal": "*",
      "Resource": "arn:aws:s3:::EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": [
            "vpce-1111111",
            "vpce-2222222"
          ]
        }
      }
    }
  ]
}

ベン図で記載すると、以下の範囲になります。(緑色の塗りつぶし部分が拒否の範囲となります)

Condition 句内に複数の条件演算子を記載した場合は、and 条件となるため、

「特定のIPアドレス以外からのアクセス」かつ「特定のVPCエンドポイント以外からのアクセス」の場合に拒否となります。

ベン図で書くと以下のようになります。(緑色の塗りつぶし部分が拒否の範囲となります)

参考資料

IAM JSON ポリシーの要素: 条件演算子 - AWS Identity and Access Management

複数の否定条件を使ったS3バケットポリシーを正しく理解してますか? | DevelopersIO