Hikaru's notes

A collection of notes and resources

View the Project on GitHub HikaruMizoe/notes

S3バケットポリシーのPrincipal要素について整理いたします。

Principal要素の概要

S3バケットポリシーのPrincipal要素は、誰がそのバケットにアクセスできるかを指定する重要な要素です。アクセス許可の対象となるIDやサービスを定義します。

Principalに指定できる主な値

1. AWSアカウント

特定のAWSアカウント全体にアクセスを許可します。

"Principal": {
  "AWS": "arn:aws:iam::123456789012:root"
}

または短縮形式:

"Principal": {
  "AWS": "123456789012"
}

2. IAMユーザー

特定のIAMユーザーにアクセスを許可します。

"Principal": {
  "AWS": "arn:aws:iam::123456789012:user/UserName"
}

3. IAMロール

特定のIAMロールにアクセスを許可します。

"Principal": {
  "AWS": "arn:aws:iam::123456789012:role/RoleName"
}

4. フェデレーションユーザー

SAML/OIDCなどでフェデレーションされたユーザーにアクセスを許可します。

"Principal": {
  "Federated": "arn:aws:iam::123456789012:saml-provider/ProviderName"
}

5. AWSサービス

特定のAWSサービスにアクセスを許可します。

"Principal": {
  "Service": "lambda.amazonaws.com"
}

よく使われるサービス例:

6. すべてのユーザー(パブリックアクセス)

インターネット上の誰でもアクセス可能にします。

"Principal": "*"

または:

"Principal": {
  "AWS": "*"
}

⚠️ 注意: パブリックアクセスは慎重に使用してください。

7. CanonicalUser

S3バケットのCanonical User IDを指定します(主にCloudFrontとの連携で使用)。

"Principal": {
  "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
}

8. 複数のPrincipalを指定

配列形式で複数のプリンシパルを指定できます。

"Principal": {
  "AWS": [
    "arn:aws:iam::123456789012:user/User1",
    "arn:aws:iam::123456789012:user/User2",
    "arn:aws:iam::123456789012:role/Role1"
  ]
}

実用的な例

例1: 特定のアカウントからのアクセス許可

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

例2: CloudFrontからのアクセス許可

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE"
        }
      }
    }
  ]
}

例3: 組織内のすべてのアカウント

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalOrgID": "o-xxxxxxxxxx"
        }
      }
    }
  ]
}

ベストプラクティス

  1. 最小権限の原則: 必要最小限のプリンシパルにのみアクセスを許可
  2. Condition要素の活用: Principalだけでなく、Conditionで追加の制約を設定
  3. パブリックアクセスの回避: Principal: "*"の使用は慎重に
  4. 定期的なレビュー: バケットポリシーを定期的に見直し、不要なアクセス権を削除

S3バケットポリシーについてさらに詳しい情報が必要な場合は、AWS公式ドキュメントを検索いたしますので、お知らせください。