バケットポリシーの例 - Amazon Simple Storage Service

バケットポリシーの例

このセクションでは、バケットポリシーの一般的なユースケース例をいくつか紹介します。以下のポリシーでは、リソース値の中で「bucket」および「examplebucket」の文字列が使用されています。これらのポリシーをテストするには、これらの文字列を使用するバケット名に置き換えます。アクセスポリシー言語の詳細については、「Amazon S3 でのポリシーとアクセス許可」を参照してください。

注記

バケットポリシーのサイズは 20 KB に制限されています。

AWS Policy Generator を使用して、Amazon S3 バケットのバケットポリシーを作成できます。その後、生成されたドキュメントを使用して、Amazon S3 コンソールか、複数のサードパーティー製ツールを介して、またはアプリケーション経由でバケットポリシーを設定できます。

重要

Amazon S3 コンソールを使用してアクセス権限をテストする場合、コンソールで必要な s3:ListAllMyBucketss3:GetBucketLocations3:ListBucket のアクセス権限を追加で付与する必要があります。コンソールを使用してユーザーにアクセス許可を付与してテストする例の解説については、「チュートリアル: ユーザーポリシーを使用したバケットへのアクセスのコントロール」を参照してください。

追加条件付きでの複数のアカウントへのアクセス許可の付与

次のポリシーの例では、s3:PutObject および s3:PutObjectAcl アクセス許可を複数の AWS アカウントに付与し、これらのオペレーションのリクエストに public-read という既定のアクセスコントロールリスト (ACL) が含まれることを要求しています。詳細については、「Amazon S3 アクション」および「Amazon S3 条件キー」を参照してください。

{ "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:::examplebucket/*"], "Condition":{"StringEquals":{"s3:x-amz-acl":["public-read"]}} } ] }

匿名ユーザーへの読み取り専用アクセス許可の付与

次のポリシー例では、任意のパブリック匿名ユーザーに s3:GetObject アクセス許可を付与します。(これによって許可されるアクセスとオペレーションの一覧については、「Amazon S3 アクション」を参照してください。) このアクセス許可はオブジェクトデータを誰でも読み取り可能にするので、バケットをウェブサイトとして設定し、バケット内のオブジェクトをすべての人が読み取れるようにする場合に便利です。バケットポリシーを使用して匿名ユーザーに読み取り専用アクセス許可を付与する前に、バケットのパブリックアクセスブロック設定を無効にする必要があります。詳細については、「ウェブサイトアクセスのアクセス許可の設定」を参照してください。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"PublicRead", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::examplebucket/*"] } ] }
警告

Amazon S3 バケットへの匿名アクセスを許可するか、パブリックアクセスブロック設定を無効にする場合は注意してください。匿名アクセスを付与すると、世界中のすべてのユーザーがバケットにアクセスできます。静的ウェブサイトホスティングなどで特に必要な場合を除き、Amazon S3 バケットへの匿名アクセスを許可しないことをお勧めします。

特定の IP アドレスへのアクセスの制限

以下の例では、リクエストが条件で指定された IP アドレス範囲からのものでない限り、指定した S3 バケット内のオブジェクトに対して Amazon S3 オペレーションを実行するアクセス許可をユーザーに付与しません。

このステートメントでは、許可されたインターネットプロトコルバージョン 4 (IPv4) IP アドレスの範囲として 54.240.143.0/24 を識別します。

Condition ブロックでは、NotIpAddress 条件と aws:SourceIp 条件キー (AWS 全体を対象とする条件キー) を使用します。これらの条件キーの詳細については、「Amazon S3 条件キー」を参照してください。aws:SourceIpIPv4 値は標準の CIDR 表記を使用します。詳細については、IAM ユーザーガイド の「IAM JSON ポリシー要素リファレンス」を参照してください。

重要

このポリシーを使用する前に、この例の IP アドレス範囲をユースケースに適した値に置き換えます。置き換えないと、バケットにアクセスできなくなります。

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

IPv4 および IPv6 アドレスの許可

IPv6 アドレスの使用を開始する場合、IPv6 への移行に合わせてポリシーが引き続き機能することを確認するため、すでにある IPv4 の範囲に追加する IPv6 アドレスの範囲の組織のポリシーすべてを更新することをお勧めします。

以下のバケットポリシーの例は、組織内の有効な IP アドレスすべてを含めるために、IPv4 と IPv6 アドレス範囲を混在させる方法を示しています。このポリシーの例では、54.240.143.1 および 2001:DB8:1234:5678::1 のサンプル IP アドレスへのアクセスを許可したり、54.240.143.129 および 2001:DB8:1234:5678:ABCD::1 のアドレスへのアクセスを拒否したりできます。

aws:SourceIp の IPv6 の値は、標準の CIDR 形式で指定する必要があります。IPv6 では、0 の範囲を表すための :: の使用がサポートされています(例: 2032001:DB8:1234:5678::/64)。詳細については、IAM ユーザーガイドの「IP アドレス条件演算子」を参照してください。

重要

このポリシーを使用する前に、この例の IP アドレス範囲をユースケースに適した値に置き換えます。置き換えないと、バケットにアクセスできなくなる可能性があります。

{ "Id":"PolicyId2", "Version":"2012-10-17", "Statement":[ { "Sid":"AllowIPmix", "Effect":"Allow", "Principal":"*", "Action":"s3:*", "Resource":"arn:aws:s3:::examplebucket/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "54.240.143.0/24", "2001:DB8:1234:5678::/64" ] }, "NotIpAddress": { "aws:SourceIp": [ "54.240.143.128/30", "2001:DB8:1234:5678:ABCD::/80" ] } } } ] }

特定の HTTP Referer へのアクセスの制限

ドメイン名が www.example.com または example.com のウェブサイトがあり、そのドメインの Amazon S3 バケット、examplebucket には、写真や動画へのリンクが格納されているとします。デフォルトでは、すべての Amazon S3 リソースはプライベートであるため、リソースを作成した AWS アカウントだけがアクセスできます。これらのオブジェクトへのウェブサイトからの読み取りアクセスを許可するには、s3:GetObject アクセス許可を条件付きで付与するバケットポリシーを追加する方法があります。条件としては、aws:Referer キーを使用して、GET リクエストが特定のウェブページから発生する必要があることを指定します。次のポリシーは、StringLike 条件を aws:Referer 条件キーで指定しています。

{ "Version":"2012-10-17", "Id":"http referer policy example", "Statement":[ { "Sid":"Allow get requests originating from www.example.com and example.com.", "Effect":"Allow", "Principal":"*", "Action":"s3:GetObject", "Resource":"arn:aws:s3:::examplebucket/*", "Condition":{ "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]} } } ] }

使用するブラウザのリクエストに HTTP referer ヘッダーが含まれることを確認します。

Amazon CloudFront OAI を使用するアクセス権限を付与する

次のバケットポリシーの例では、Amazon S3 バケット内のすべてのオブジェクトを取得する (読み取る) アクセス許可を CloudFront オリジンアクセスアイデンティティ (OAI) に付与します。CloudFront OAI を使用すると、ユーザーが直接 Amazon S3 を通じてではなく、CloudFront を通じてバケット内のオブジェクトにアクセスすることを許可できます。詳細については、Amazon CloudFront 開発者ガイドの「オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する」を参照してください。

次のポリシーは、OAI の ID をポリシーの Principal として使用します。S3 バケットポリシーを使用した CloudFront OAI へのアクセス許可の付与の詳細については、Amazon CloudFront 開発者ガイドの「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:::aws-example-bucket/*" } ] }

MFA を要求するバケットポリシーの追加

Amazon S3 は、MFA で保護された API アクセスをサポートしています。つまり、Amazon S3 リソースへのアクセス時に多要素認証 (MFA) を適用できます。多要素認証により、AWS 環境に適用できるセキュリティのレベルが高まります。このセキュリティ機能では、有効な MFA コードを入力して MFA デバイスを物理的に所有していることを証明することがユーザーに要求されます。詳細については、「AWS の多要素認証」を参照してください。Amazon S3 リソースにアクセスするすべてのリクエストに対して MFA を要求することができます。

バケットポリシーで aws:MultiFactorAuthAge キーを使用して、MFA 要件を適用できます。AWS Identity and Access Management (IAM) ユーザーは、AWS Security Token Service (AWS STS) によって発行された一時的な認証情報を使用して Amazon S3 リソースにアクセスできます。AWS STS リクエスト時に、MFA コードを指定します。

Amazon S3 が多要素認証付きのリクエストを受信すると、aws:MultiFactorAuthAge キーから、一時的な認証情報が作成されてからの時間(秒単位)を示す数値が渡されます。リクエストで提供された一時的な認証情報が MFA デバイスを使用して作成されていない場合、このキー値は null (不在) になります。次のバケットポリシー例に示すように、バケットポリシーに、この値を確認する条件を追加できます。このポリシーは、リクエストが MFA を使用して認証されていない場合に、examplebucket バケット内の /taxdocuments フォルダへの Amazon S3 オペレーションを拒否します。MFA の詳細については、IAM ユーザーガイド の「AWS の多要素認証 (MFA) を使用する」を参照してください。

{ "Version": "2012-10-17", "Id": "123", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::examplebucket/taxdocuments/*", "Condition": { "Null": { "aws:MultiFactorAuthAge": true }} } ] }

Null キー値が null で、リクエスト内の一時的なセキュリティ認証情報が MFA キーを使用せずに作成されたことを示している場合、Condition ブロック内の aws:MultiFactorAuthAge 条件の評価は true になります。

次のバケットポリシーは、前述のバケットポリシーの拡張です。2 つのポリシーステートメントが含まれています。1 つのステートメントは、バケット (examplebucket) の s3:GetObject アクセス許可を全員に許可します。別のステートメントは、MFA を要求することにより、バケット内の examplebucket/taxdocuments フォルダへのアクセスをさらに制限します。

{ "Version": "2012-10-17", "Id": "123", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::examplebucket/taxdocuments/*", "Condition": { "Null": { "aws:MultiFactorAuthAge": true } } }, { "Sid": "", "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::examplebucket/*" } ] }

オプションで、リクエストの認証に使われる一時セキュリティ証明書の寿命に関係なく、aws:MultiFactorAuthAge キーの有効期間を制限する数値条件を使用することができます。たとえば、次のバケットポリシーでは、MFA 認証を要求するほかに、一時セッションが作成されてからの時間もチェックします。このポリシーは、aws:MultiFactorAuthAge キーの値が、一時セッションが 1 時間 (3,600 秒) 以上前に作成されたことを示す場合に、すべてのオペレーションを拒否します。

{ "Version": "2012-10-17", "Id": "123", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::examplebucket/taxdocuments/*", "Condition": {"Null": {"aws:MultiFactorAuthAge": true }} }, { "Sid": "", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::examplebucket/taxdocuments/*", "Condition": {"NumericGreaterThan": {"aws:MultiFactorAuthAge": 3600 }} }, { "Sid": "", "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::examplebucket/*" } ] }

バケット所有者はフルコントロール権限を持ちながら、オブジェクトをアップロードするクロスアカウントアクセス許可を付与する

他の AWS アカウントが自分のバケットにオブジェクトをアップロードすることを許可できます。ただし、バケット所有者として、バケットにアップロードされたオブジェクトに対してフルコントロール権限を持っている必要がある場合があります。次のポリシーは、特定の AWS アカウント (111111111111) が、メールアドレス (xyz@amazon.com) で識別されるバケット所有者がフルコントロールアクセス許可を付与しない限り、そのアカウントによるオブジェクトのアップロードを拒否する例です。ポリシーの StringNotEquals 条件は、要件を表現する s3:x-amz-grant-full-control 条件キーを指定します (「Amazon S3 条件キー」を参照してください)。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"111", "Effect":"Allow", "Principal":{"AWS":"1111111111"}, "Action":"s3:PutObject", "Resource":"arn:aws:s3:::examplebucket/*" }, { "Sid":"112", "Effect":"Deny", "Principal":{"AWS":"1111111111" }, "Action":"s3:PutObject", "Resource":"arn:aws:s3:::examplebucket/*", "Condition": { "StringNotEquals": {"s3:x-amz-grant-full-control":["emailAddress=xyz@amazon.com"]} } } ] }

Amazon S3 インベントリおよび Amazon S3 分析に対するアクセス許可の付与

Amazon S3 インベントリでは、Amazon S3 バケット内のオブジェクトのリストが作成され、Amazon S3 分析のエクスポートでは、分析に使用されるデータの出力ファイルが作成されます。インベントリによってオブジェクトがリストされるバケットは、ソースバケットと呼ばれます。インベントリファイルが書き込まれるバケットと、分析エクスポートファイルが書き込まれるバケットは、ターゲットバケットと呼ばれます。Amazon S3 バケットのインベントリをセットアップするときと分析エクスポートをセットアップするときに、ターゲットバケットのバケットポリシーを作成する必要があります。詳細については、「 Amazon S3 インベントリ」および「Amazon S3 分析 – ストレージクラス分析」を参照してください。

次のサンプルバケットポリシーでは、ソースバケットのアカウントからターゲットバケットにオブジェクト (PUT) を書き込むための Amazon S3 アクセス許可が付与されます。このようなバケットポリシーは、Amazon S3 インベントリと Amazon S3 分析エクスポートをセットアップするときに、ターゲットバケットで使用します。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"InventoryAndAnalyticsExamplePolicy", "Effect":"Allow", "Principal": {"Service": "s3.amazonaws.com"}, "Action":["s3:PutObject"], "Resource":["arn:aws:s3:::destination-bucket/*"], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, "StringEquals": { "aws:SourceAccount": "1234567890", "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }