📝

バケットポリシーってなんだろ?

2021/04/29に公開

S3のバケットポリシーについて調べてみました。

バケットポリシーとユーザーポリシー - Amazon Simple Storage Service

概要

  • S3へのアクセス許可を付与するには2つの方法がある
    • バケットポリシー
    • ユーザーポリシー
  • JSON ベースのアクセスポリシー言語
  • ポリシーの構成
    • Resource (リソース)
      • バケット、オブジェクト、アクセスポイント、ジョブなど
      • アクセスを許可または拒否できるS3 のリソース
    • Action (アクション)
      • 各リソースに対するオペレーション
      • s3:GetObjects3:ListBucketなど
    • Effect (効力)
      • 許可または拒否
    • Principal (プリンシパル)
      • ユーザー、アカウント、サービス、または他のエンティティ
    • Condition (条件)
      • ポリシーが有効になる条件
      • AWS 全体のキーと Amazon S3 固有のキーがある

このポリシーは、Account-ID アカウントのユーザーの Dave に、awsexamplebucket1 バケットに対する Amazon S3 の s3:GetObject、s3:GetBucketLocation、s3:ListBucket のアクセス許可を付与します。

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/Dave"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::awsexamplebucket1/*",
                "arn:aws:s3:::awsexamplebucket1"
            ]
        }
    ]
}

リソース

  • AWS では、次の一般的な Amazon リソースネーム (ARN) 形式でリソースを識別
    • arn:partition:service:region:namespace:relative-id
  • S3 の ARN では AWS リージョンと名前空間は除外され、以下のものが含まれる
    • パーティション
      • 共通:aws
      • 中国 (北京) リージョン:aws-cn
    • サービス
      • s3
    • 相対 ID
      • bucket-name または bucket-name/object-key
      • ワイルドカード(*?)も可能
  • S3 のリソースの ARN 形式
    • arn:aws:s3:::bucket_name/key_name
  • S3 リソースの ARN の例
    • arn:aws:s3:::examplebucket/developers/design_info.doc
    • examplebucket バケットの /developers/design_info.doc オブジェクトを指す
  • ワイルドカード(*?)
    • アスタリスク (*) は 0 個以上の文字の任意の組み合わせ
    • 疑問符 (?) は任意の 1 文字
  • ワイルドカード例
    • arn:aws:s3:::examplebucket/*
      • examplebucket バケット内のすべてのオブジェクトを指す
    • arn:aws:s3:::*
      • S3 のすべてのリソース (アカウントの S3 のすべてのバケットとオブジェクト) を指す
    • arn:aws:s3:::example?bucket/*
      • example1bucket、example2bucket、example3bucket など、バケット内のすべてのオブジェクトを指す
  • ポリシー変数
    • ポリシーの評価時に対応する値で置き換えられる
  • ポリシー変数例
    • arn:aws:s3:::bucket_name/developers/${aws:username}/
      • ユーザーごとに別のフォルダを使用

プリンシパル

  • リソースへのアクセスを許可または拒否するユーザー、アカウント、サービス、または他のエンティティ
  • AWS アカウントにアクセス許可を付与
    • "AWS":"account-ARN"
    • "Principal":{"AWS":"arn:aws:iam::AccountNumber-WithoutHyphens:root"}
    • "Principal":{"AWS":["arn:aws:iam::AccountNumber1-WithoutHyphens:root","arn:aws:iam::AccountNumber2-WithoutHyphens:root"]}
  • IAM ユーザーにアクセス許可を付与
    • "AWS":"user-ARN"
    • "Principal":{"AWS":"arn:aws:iam::account-number-without-hyphens:user/username"}
  • 匿名アクセス許可を付与
    • ワイルドカード ("*") を設定
    • "Principal":"*"
    • "Principal":{"AWS":"*"}
    • 匿名アクセスでは世界中のすべてのユーザーがバケットにアクセス可能
  • CloudFront の URL を使用したアクセスの要求
    • S3 のコンテンツへのアクセスに、S3 の URL ではなく、CloudFront の URL を使用する
    • CloudFront のオリジンアクセスアイデンティティ (OAI) の作成が必要
    • "Principal":{"CanonicalUser":"Amazon S3 Canonical User ID assigned to origin access identity"}

アクション

  • アクセス許可

条件キー

  • ポリシーが有効なときの条件を指定
  • Condition 要素または Condition ブロックを使用
  • AWS 全体の条件キー
    • aws:SourceIpなど
  • S3 固有の条件キー
    • "s3:x-amz-acl":["public-read"]など
    • オブジェクトをパブリックに読み取り可能にする x-amz-acl ヘッダーがリクエストに含まれている場合という条件

バケットポリシーの例

s3:PutObject および s3:PutObjectAcl アクセス許可を複数の AWS アカウントに付与し、これらのオペレーションのリクエストに public-read という既定のアクセスコントロールリスト (ACL) が含まれることを要求しています

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddCannedAcl",
      "Effect":"Allow",
    "Principal": {"AWS": ["arn:aws:iam::111122223333:root","arn:aws:iam::444455556666:root"]},
      "Action":["s3:PutObject","s3:PutObjectAcl"],
      "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition":{"StringEquals":{"s3:x-amz-acl":["public-read"]}}
    }
  ]
}

任意のパブリック匿名ユーザーに s3:GetObject アクセス許可を付与

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject","s3:GetObjectVersion"],
      "Resource":["arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"]
    }
  ]
}

リクエストが条件で指定した IP アドレス範囲からのものでない限り、指定した S3 のバケット内のオブジェクトに対して Amazon S3 のオペレーションを実行するユーザーのアクセスを拒否

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
	       "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
         "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
	 "NotIpAddress": {"aws:SourceIp": "54.240.143.0/24"}
      }
    }
  ]
}

CloudFront のオリジンアクセスアイデンティティ (OAI) に Amazon S3 のバケット内のすべてのオブジェクトを取得 (読み取り) するアクセス許可を付与

{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
        }
    ]
}

より具体的な例

S3バケットポリシーの具体例で学ぶAWSのPolicyドキュメント | DevelopersIO
S3のバケットポリシーでハマったので、S3へのアクセスを許可するPrincipalの設定を整理する | DevelopersIO

  • 同一アカウント内のS3へのアクセス許可
    • IAMユーザーのポリシーとバケットポリシーどちらかで明示的な許可があればOK
    • ただしバケットポリシーのみの場合、PrincipalにIAMユーザーのArnの記載が必要
  • 別アカウントのS3へのアクセス許可
    • アクセス元のIAMユーザーのポリシーと別アカウントのバケットポリシー、両方の許可が必要

まとめ

今回はS3のバケットポリシーについて調べてみました。
以下がポイントでした。

  • JSON ベースのアクセスポリシー言語
  • Resourceはアクセスを許可または拒否できるS3 のリソース(バケット、オブジェクトなど)
  • Actionは各リソースに対するオペレーション(s3:GetObjects3:ListBucketなど)
  • Effectは許可または拒否
  • Principalはユーザー、アカウント、サービス、または他のエンティティ
  • Conditionはポリシーが有効になる条件
  • 同一アカウント内のS3へのアクセス許可ではIAMユーザーのポリシーとバケットポリシーどちらかで明示的な許可があればOK
  • 別アカウントのS3へのアクセス許可ではアクセス元のIAMユーザーのポリシーと別アカウントのバケットポリシー、両方の許可が必要

参考になれば幸いです。

Discussion