すべての主体に Get 権限を許可する S3 バケットポリシー

S3 の Get 権限を必要な主体とリソースに制限し、実際の公開範囲を確認してください。

説明

S3 バケットポリシーですべての主体に Get 操作を許可すると、意図しないユーザーや匿名リクエストに情報が公開される可能性があります。影響は、許可した操作とリソースによって異なります。例えば s3:GetObject はオブジェクトの内容を読み取り、s3:GetBucketLocation はバケットのリージョン情報を取得します。

条件、明示的な拒否、パブリックアクセスのブロック、必要な KMS 権限も実際のアクセスを制限する場合があります。読み取りの許可自体が、オブジェクトの変更や削除を許可するわけではありません。

想定される影響

  • オブジェクトの読み取りが実際に許可されると、ログ、バックアップ、デプロイ用ファイルの内容が漏えいする可能性があります。
  • 設定情報の取得が許可されると、内部リソースに関する情報が公開される可能性があります。

対処方法

  • すべての主体に対する不要な許可を取り除き、必要なアカウント、ロール、サービスプリンシパルだけを指定してください。
  • 操作に適したリソース ARN と必要な条件で範囲を制限してください。データを意図的に公開する場合も、許可する読み取り操作と対象オブジェクトを必要な範囲に限定してください。
  • パブリックアクセスのブロックとほかのポリシーを確認し、必要なアクセスが成功し、不要なアクセスが拒否されることを確認してください。すでに公開されていた場合は、データとアクセス記録を調査してください。

例

オブジェクトの読み取り権限を比較する例です。バケット名とロール ARN は実際に使用できる値に置き換え、ほかの公開アクセス制御も構成してください。

変更前

hcl
resource "aws_s3_bucket" "data_bucket" {
  bucket = "my-tf-test-bucket"
}

resource "aws_s3_bucket_policy" "data_bucket_policy" {
  bucket = aws_s3_bucket.data_bucket.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-tf-test-bucket/*"
    }
  ]
}
POLICY
}

この許可文は、バケット内のオブジェクトに対する s3:GetObject をすべての主体に付与します。ほかの制御で拒否されなければ、匿名リクエストでも内容を取得できる可能性があります。

変更後

hcl
resource "aws_s3_bucket" "data_bucket" {
  bucket = "my-tf-test-bucket"
}

resource "aws_s3_bucket_policy" "data_bucket_policy" {
  bucket = aws_s3_bucket.data_bucket.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/app-reader"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-tf-test-bucket/*"
    }
  ]
}
POLICY
}

この許可文の主体を app-reader ロールに限定しています。そのロールを使える主体やほかのポリシーの権限も確認してください。この変更だけですべての既存の公開経路がなくなるわけではありません。

参考資料