操作とプリンシパルにワイルドカードを使う S3 バケットポリシー

S3 ポリシーの操作とプリンシパルにワイルドカードを使うと、必要以上のアクセスを許可する可能性があります。実際の操作、リソース、条件を確認し、最小権限に絞ってください。

説明

Action と Principal にワイルドカードを指定すると、意図しない操作や主体まで許可する可能性があります。s3:* はすべての S3 操作を表しますが、s3:Get* は一部の操作に限られます。実際の権限は Resource、条件、明示的な拒否、パブリックアクセスブロックにも左右されます。対象がオブジェクト ARN だけのポリシーは、すべてのバケット管理操作を許可するものではありません。

想定される影響

  • 読み取りが許可されると、アクセスが不要な主体にオブジェクト内容が公開される可能性があります。
  • 書き込みや削除の権限は、不要なアップロード、オブジェクト内容の変更、データ消失につながる場合があります。
  • 過剰な権限は、ストレージを使うデプロイやサービスの運用を妨げる可能性があります。影響は実際に許可された操作とリソースによって異なります。

対処方法

  • 必要な操作、主体、リソース ARN を明示し、不要なワイルドカードを絞り込んでください。公開読み取りが必要な場合でも、書き込みと管理権限は別途制限してください。
  • 条件、明示的な拒否、アカウントとバケットのパブリックアクセスブロックを確認してください。private ACL は、バケットポリシーによる許可を取り消しません。
  • 使用するプロバイダーとモジュールに合った方法でポリシーを適用してください。S3 モジュール 3.7.0 のカスタムポリシーには attach_policy = true が必要です。変更後、必要なアクセスが維持され、承認していないアクセスが拒否されることを試してください。

旧形式のポリシー例

以下は、操作範囲の違いを示す旧形式のインライン設定です。AWS プロバイダー 4.2.0 では policy と acl は読み取り専用として文書化されているため、そのバージョンでは独立したポリシーリソースが必要です。新しいバケットでは、現在のオブジェクト所有権とパブリックアクセスブロックの要件も確認してください。バケット名を利用可能な一意の名前に変え、二つの構成を同時に適用しないでください。

すべてのオブジェクト操作を許可

hcl
resource "aws_s3_bucket" "open_bucket" {
  bucket = "example-s3b-181355"
  acl    = "private"

  policy = <<EOF
  {
    "Id": "id113",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": [
          "s3:*"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::example-s3b-181355/*",
        "Principal": "*"
      }
    ]
  }
  EOF
}

オブジェクト ARN の範囲で適用できるすべての S3 操作を、ワイルドカードのプリンシパルに許可します。acl = "private" ではこの許可は取り消されません。すべてのバケット管理操作を許可するポリシーとは区別してください。

操作だけをオブジェクト書き込みに限定

hcl
resource "aws_s3_bucket" "restricted_bucket" {
  bucket = "example-s3b-181355"
  acl    = "private"

  policy = <<EOF
  {
    "Id": "id113",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": [
          "s3:putObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::example-s3b-181355/*",
        "Principal": "*"
      }
    ]
  }
  EOF
}

操作範囲は狭くなっていますが、Principal: "*" にオブジェクト書き込みを許可する点は変わりません。AWS の操作名は大文字と小文字を区別しないため、s3:putObject も書き込み権限です。公開書き込みの解消にはなっておらず、承認済みの主体と必要なオブジェクト範囲へさらに限定する必要があります。

参考資料