📝
バケットポリシーってなんだろ?
S3のバケットポリシーについて調べてみました。
バケットポリシーとユーザーポリシー - Amazon Simple Storage Service
概要
- S3へのアクセス許可を付与するには2つの方法がある
- バケットポリシー
- ユーザーポリシー
- JSON ベースのアクセスポリシー言語
- ポリシーの構成
- Resource (リソース)
- バケット、オブジェクト、アクセスポイント、ジョブなど
- アクセスを許可または拒否できるS3 のリソース
- Action (アクション)
- 各リソースに対するオペレーション
-
s3:GetObject
、s3:ListBucket
など
- Effect (効力)
- 許可または拒否
- Principal (プリンシパル)
- ユーザー、アカウント、サービス、または他のエンティティ
- Condition (条件)
- ポリシーが有効になる条件
- AWS 全体のキーと Amazon S3 固有のキーがある
- Resource (リソース)
例
このポリシーは、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:GetObject
、s3:ListBucket
など) - Effectは許可または拒否
- Principalはユーザー、アカウント、サービス、または他のエンティティ
- Conditionはポリシーが有効になる条件
- 同一アカウント内のS3へのアクセス許可ではIAMユーザーのポリシーとバケットポリシーどちらかで明示的な許可があればOK
- 別アカウントのS3へのアクセス許可ではアクセス元のIAMユーザーのポリシーと別アカウントのバケットポリシー、両方の許可が必要
参考になれば幸いです。
Discussion