Amazon S3 条件キー - Amazon Simple Storage Service

Amazon S3 条件キー

アクセスポリシー言語では、アクセス許可を付与するときの条件を指定することができます。ポリシーが有効なときの条件を指定するには、オプションの Condition 要素または Condition ブロックを使用して、ポリシーが有効になるときの条件を指定します。定義済みの AWS‐全体キーと Amazon S3 ‐ 固有キーを使用して、Amazon S3 アクセスポリシーで条件を指定できます。

Condition エレメントに、ブール演算子 (等しい、未満など) を使用する演算式を構築し、リクエストの値に対する条件を適合させます。たとえば、オブジェクトをアップロードするアクセス許可を付与する場合、バケット所有者は以下のように StringEquals 条件を追加して、オブジェクトをパブリックに読み取り可能にするよう要求することができます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::examplebucket/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": [ "public-read" ] } } } ] }

この例で、Condition ブロックは指定されたキーと値のペア "s3:x-amz-acl":["public-read"] に適用される StringEquals 条件を指定します。条件の表現に使用できる、事前に定義された一連のキーがあります。この例では、s3:x-amz-acl 条件キーを使用しています。この条件では、public-read の値が指定された x-amz-acl ヘッダーをすべての PUT Object リクエストに含めることがユーザーに求められます。

AWS ‐ 全体の条件キー

AWS には、ポリシーをサポートするすべての AWS のサービスでサポートされる、一連の一般的なキーが用意されています。これらのキーは AWS ‐ 全体のキー と呼ばれ、プレフィックス aws: を使用します。AWS ‐ 全体の条件キーの詳細なリストについては、IAM ユーザーガイド の「条件に利用可能な AWS キー」を参照してください。

Amazon S3 では、AWS ‐ 全体の条件キーを使用できます。以下のバケットポリシー例は、リクエストが指定された範囲の IP アドレス (192.0.2.0.*、ただし 192.0.2.188 を除く) から発信される場合に、認証ユーザーに s3:GetObject アクションを使用するアクセス許可を付与します。条件ブロックの IpAddressNotIpAddress は条件であり、それぞれの条件では評価されるキーと値のペアが指定されています。この例の両方のキーと値のペアでは、aws:SourceIp AWS ‐ 全体キーを使用しています。

注記

条件で指定されている IPAddressNotIpAddress のキー値は、RFC 4632 の CIDR 表記を使用していることに注意してください。詳細については、http://www.rfc-editor.org/rfc/rfc4632.txt を参照してください。

{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": "*", "Action":["s3:GetObject"] , "Resource": "arn:aws:s3:::examplebucket/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "192.0.2.0/24" }, "NotIpAddress" : { "aws:SourceIp": "192.0.2.188/32" } } } ] }

Amazon S3 ポリシーでその他の AWS ‐ 全体条件キーを使用することもできます。たとえば、VPC エンドポイントのバケットポリシーで aws:sourceVpce および aws:sourceVpc 条件キーを指定できます。例については、「Amazon S3 の VPC エンドポイント用のバケットポリシーの例」を参照してください。

Amazon S3 ‐ 固有条件キー

Amazon S3 条件キーは、特定の Amazon S3 アクションで使用できます。各条件キーは、条件を設定できる API で許可されている同じ名前のリクエストヘッダーに対応します。Amazon S3 ‐ 固有条件キーは、同じ名前のリクエストヘッダーの動作を指定します。Amazon S3 ‐ 固有条件キーの詳細なリストについては、Amazon S3 のアクション、リソース、条件キー を参照してください。

たとえば、s3:PutObject アクセス許可に対して条件付きのアクセス許可を付与する条件キー s3:x-amz-acl は、PUT Object API でサポートされている x-amz-acl リクエストヘッダーの動作を定義します。また、アクセス許可 s3:VersionId に対して条件付きのアクセス許可を付与する条件キー s3:GetObjectVersion は、GET Object リクエストで設定する versionId クエリパラメータの動作を定義します。

以下のバケットポリシーは、オブジェクトをパブリックに読み取り可能にする x-amz-acl ヘッダーがリクエストに含まれている場合に、2 つの AWS アカウントに s3:PutObject のアクセス許可を付与します。Condition ブロックでは、StringEquals 条件を使用し、キーと値のペアとして "s3:x-amz-acl":["public-read" を評価に使用できます。このキーと値のペアで、s3:x-amz-acl は、s3: というプレフィックスが示すとおり Amazon S3 固有のキーです。

{ "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": ["arn:aws:iam::account1-ID:root","arn:aws:iam::account2-ID:root"] }, "Action":["s3:PutObject"], "Resource": ["arn:aws:s3:::examplebucket/*"], "Condition": { "StringEquals": { "s3:x-amz-acl":["public-read"] } } } ] }
重要

すべての条件が、すべてのアクションに対して意味を成すわけではありません。たとえば、Amazon S3 のアクセス許可 s3:CreateBucket を付与するポリシーに s3:LocationConstraint 条件を含めることは理にかなっています。ただし、s3:GetObject アクセス許可を付与するポリシーにこの条件を含めることは意味がありません。Amazon S3 は、Amazon S3 – 固有条件を含む、このタイプのセマンティックエラーをテストできます。ただし、IAM ユーザーを対象とするポリシーを作成するときに、意味を持たない Amazon S3 条件が含まれていても、エラーは報告されません。これは、IAM が Amazon S3 条件を検証できないためです。

例 — オブジェクトオペレーションで使用できる Amazon S3 条件キー

このセクションでは、オブジェクトオペレーションに Amazon S3 ‐ 固有条件キーを使用する方法を示す例を紹介します。ポリシーで指定できる Amazon S3 アクション、条件キー、およびリソースの詳細なリストについては、Amazon S3 のアクション、リソース、条件キー を参照してください。

ポリシーの例には、PUT Object オペレーションで条件キーを使用する方法がいくつか示されています。PUT Object オペレーションでは、アクセスコントロールリスト (ACL) – 固有のヘッダーを使用して、ACL ベースのアクセス許可を付与することができます。バケット所有者は、これらのキーを使用して条件を設定し、ユーザーがオブジェクトをアップロードする場合に特定のアクセス許可を要求することができます。PutObjectAcl オペレーションを使用して、ACL – ベースのアクセス許可を付与することもできます。詳細については、Amazon S3Amazon Simple Storage Service API Reference の「 PutObjectAcl」を参照してください。ACL の詳細については、「アクセスコントロールリスト (ACL) の概要」を参照してください。

例 1: バケット所有者にフルコントロールを与えることを条件として s3:PutObject のアクセス許可を付与する

PUT Object オペレーションでは、アクセスコントロールリスト (ACL) 固有のヘッダーを使用して、ACL ベースのアクセス許可を付与することができます。バケット所有者は、これらのキーを使用して条件を設定し、ユーザーがオブジェクトをアップロードする場合に特定のアクセス許可を要求することができます。

たとえば、アカウント A がバケットの所有者であり、アカウント管理者がアカウント B のユーザー Dave に対して、オブジェクトをアップロードするアクセス許可を付与するとします。デフォルトでは、Dave がアップロードするオブジェクトはアカウント B に所有されるため、アカウント A にはそれらのオブジェクトに対するアクセス許可は付与されません。しかし、バケットの所有者は請求書を支払うために、Dave がアップロードするオブジェクトに対する完全なアクセス許可を必要としています。この対処方法として、アカウント A の管理者は、明示的に完全なアクセス許可を付与するか、既定 ACL を使用する ACL 固有のヘッダーをリクエストに含むことを条件として、Dave に s3:PutObject のアクセス許可を付与できます。詳細については、「PUT Object」を参照してください。

x-amz-full-control ヘッダーを必須にする

リクエストで、バケット所有者へのフルコントロールのアクセス許可が含まれる x-amz-full-control ヘッダーを要求できます。以下のバケットポリシーは、s3:PutObject 条件キーを使用して、リクエストに s3:x-amz-grant-full-control ヘッダーを含めることを条件とする x-amz-full-control のアクセス許可をユーザー Dave に付与します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
注記

この例では、クロスアカウントのアクセス許可を付与しています。ただし、アクセス許可を付与される Dave がバケットを所有している AWS アカウントに属している場合、この条件付きアクセス許可は不要になります。これは、ユーザーがアップロードするオブジェクトは Dave が属する親アカウントによって所有されるためです。

明示的な拒否を追加する

前述のバケットポリシーでは、アカウント B のユーザー Dave に条件付きのアクセス許可が付与されます。ただし、このポリシーが有効であっても、Dave が他のポリシーに従って、条件なしで同じアクセス許可を取得する場合があります。たとえば、Dave が属するグループに、条件なしで s3:PutObject のアクセス許可が付与される場合があります。このようなアクセス許可の抜け穴を避けるには、明示的な拒否を追加して、より厳格なアクセスポリシーを記述する必要があります。次の例では、バケット所有者に完全なアクセス許可を付与するヘッダーをリクエストに含めない場合、Dave に対してアップロードのアクセス許可を明示的に拒否します。明示的な拒否は、付与されている他のアクセス許可に常に優先されます。以下は、明示的な拒否が追加された、改訂済みアクセスポリシーの例です。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }

AWS CLI でポリシーをテストする

2 つの AWS アカウントがある場合は、AWS Command Line Interface (AWS CLI) を使用してポリシーをテストできます。ポリシーをアタッチしたら、Dave の認証情報を使用し、次の AWS CLI put-object コマンドを実行してアクセス許可をテストします。Dave の認証情報は、--profile パラメータを追加して指定します。バケット所有者にフルコントロールのアクセス許可を付与するには、--grant-full-control パラメータを追加します。AWS CLI のセットアップおよび使用の詳細については、「チュートリアル例のツールのセットアップ」を参照してください。

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile

x-amz-acl ヘッダーを必須にする

バケット所有者にフルコントロールのアクセス許可を付与する既定 ACL が指定された x-amz-acl ヘッダーを要求できます。リクエストに x-amz-acl ヘッダーを含めることを義務付けるには、以下の例のように Condition ブロックのキーと値のペアを置き換え、s3:x-amz-acl 条件キーを指定します。

"Condition": { "StringNotEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }

AWS CLI を使用してアクセス許可をテストするには、--acl パラメータを指定します。これにより、AWS CLI は送信するリクエストに x-amz-acl ヘッダーを追加します。

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin

例 2: サーバー側の暗号化を使用してオブジェクトを保存するよう要求する s3:PutObject のアクセス許可を付与する

アカウント A がバケットの所有者であるとします。アカウント管理者は、アカウント A のユーザー Jane にオブジェクトをアップロードするアクセス許可を付与するとします。ただし、必ずサーバー側の暗号化をリクエストすることを条件とします。これにより、Amazon S3 でオブジェクトが暗号化されて保存されます。この場合、アカウント A の管理者は、以下のように s3:x-amz-server-side-encryption 条件キーを使用することができます。Condition ブロックのキーと値のペアは、s3:x-amz-server-side-encryption キーを指定します。

"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }

AWS CLI を使用してアクセス許可をテストする場合は、--server-side-encryption パラメータを使用して、必須パラメータを追加する必要があります。

aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin

例 3: 制限されているコピー元からオブジェクトをコピーする s3:PutObject のアクセス許可を付与する

PUT Object リクエストでは、ソースオブジェクトを指定すると、コピーオペレーションを実行できます (「PUT Object - Copy (PUT Object - コピー)」を参照)。バケット所有者は、これに対応して、ソースに制限が付いているオブジェクトをコピーするためのアクセス許可をユーザーに付与できます。以下に例を示します。

  • sourcebucket バケットからのみオブジェクトをコピーすることを許可します。

  • sourcebucket バケットから、キー名のプレフィックスが public/ で始まるオブジェクト (sourcebucket/public/* など) のみコピーすることを許可します。

  • sourcebucket から特定のオブジェクト (sourcebucket/example.jpg など) のみコピーすることを許可します。

次のバケットポリシーでは、ユーザー (Dave) に s3:PutObject のアクセス許可が付与されます。Dave は、リクエストに s3:x-amz-copy-source ヘッダーを含め、ヘッダーの値が /examplebucket/public/* キー名のプレフィックスを指定するという条件が満たされる場合にのみ、オブジェクトをコピーすることができます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::examplebucket/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "examplebucket/public/*" } } } ] }

AWS CLI でポリシーをテストする

AWS CLI の copy-object コマンドを使用して、アクセス許可をテストできます。--copy-source パラメータを追加してソースを指定します。キー名のプレフィックスは、ポリシーで許可されているプレフィックスと一致する必要があります。--profile パラメータを使用して、ユーザー Dave の認証情報を指定します。AWS CLI のセットアップの詳細については、「チュートリアル例のツールのセットアップ」を参照してください。

aws s3api copy-object --bucket examplebucket --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountADave

特定のオブジェクトのみをコピーするアクセス許可を付与する

前述のポリシーでは、StringNotLike 条件を使用しています。特定のオブジェクトのみをコピーするアクセス許可を付与するには、条件を StringNotLike から StringNotEquals に変更し、次のようにオブジェクトキーを正確に指定する必要があります。

"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "examplebucket/public/PublicHappyFace1.jpg" } }

例 4: オブジェクトの特定のバージョンに対するアクセス許可を付与する

アカウント A が、バージョンを使用可能なバケットを所有しているとします。このバケットには、HappyFace.jpg オブジェクトのバージョンが複数含まれています。アカウント管理者は、ユーザー Dave にオブジェクトの特定のバージョンのみを取得できるアクセス許可を付与したいと考えています。この場合、アカウント管理者は、次に示すように、条件を付けて Dave に s3:GetObjectVersion のアクセス許可を付与できます。Condition ブロックのキーと値のペアは、s3:VersionId 条件キーを指定します。この場合、Dave がオブジェクトを取得するには、オブジェクトのバージョン ID を正確に知っている必要があります。

詳細については、Amazon Simple Storage Service API Reference の「GetObject」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": ["s3:GetObjectVersion"], "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": ["s3:GetObjectVersion"], "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }

AWS CLI でポリシーをテストする

このアクセス許可をテストするには、AWS CLI の get-object コマンドを実行するときに、特定のオブジェクトバージョンを指定する --version-id パラメータを使用します。コマンドは、オブジェクトを取得し、OutputFile.jpg ファイルに保存します。

aws s3api get-object --bucket examplebucketversionenabled --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

例 5: オブジェクトのアップロードを特定のストレージクラスのオブジェクトに制限する

アカウント A がバケットの所有者であるとします。アカウント管理者は、アカウント A のユーザーである Dave に対して、STANDARD_IA ストレージクラスに保存されているバケットにのみオブジェクトのアップロードを許可するとします。オブジェクトのアップロードを特定のストレージクラスに制限するために、アカウント A の管理者は、次のバケットポリシーの例に示すように s3:x-amz-storage-class 条件キーを使用できます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::examplebucket/*" ], "Condition": { "StringEquals": { "s3:x-amz-storage-class": [ "STANDARD_IA" ] } } } ] }

例 6: オブジェクトタグに基づくアクセス許可の付与

Amazon S3 オペレーションでオブジェクトタグ付け条件キーを使用する方法の例については、オブジェクトのタグ付けとアクセスコントロールポリシー を参照してください。

例 — バケットオペレーションで使用できる Amazon S3 条件キー

このセクションでは、バケットオペレーションでの Amazon S3 ‐ 固有条件キーの使用方法を示すポリシーの例を紹介します。

例 1: 特定のリージョンでのみバケットを作成するアクセス許可の付与

AWS アカウントの管理者が、南米 (サンパウロ) リージョンでのみバケットを作成するアクセス許可をユーザー (Dave) に付与するとします。アカウント管理者は、以下のように条件を指定して、s3:CreateBucket のアクセス許可を付与する次のユーザーポリシーをアタッチします。Condition ブロックのキーと値のペアは、s3:LocationConstraint キーと、その値として sa-east-1 リージョンを指定します。

注記

この例では、バケット所有者はユーザーの 1 人にアクセス許可を付与するため、バケットポリシーまたはユーザーポリシーのどちらでも使用することができます。この例では、ユーザーポリシーを使用します。

Amazon S3 リージョンのリストについては、『AWS General Reference』の「リージョンとエンドポイント」を参照してください。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws:s3:::*" ], "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }

明示的な拒否を追加する

上記のポリシーは、ユーザーが sa-east-1 以外のリージョンでバケットを作成することを制限します。ただし、他の一部のポリシーで、このユーザーに別のリージョンでバケットを作成するアクセス許可を付与する場合があります。たとえば、ユーザーがグループに属している場合、グループのアクセス許可内にいるすべてのユーザーが別のリージョンでバケットを作成できるように、ポリシーがアタッチされている場合があります。ユーザーに別のリージョンでバケットを作成するアクセス許可が付与されないように、上記のポリシーに明示的な拒否のステートメントを追加します。

Deny ステートメントは、StringNotLike 条件を使用します。つまり、場所の制約が sa-east-1 でない場合、バケットの作成リクエストは拒否されます。明示的な拒否を使用すれば、どのようなアクセス権限が付与されている場合でも、ユーザーは別のリージョンでバケットを作成できなくなります。以下のポリシーには、明示的な拒否ステートメントが含まれています。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws:s3:::*" ], "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws:s3:::*" ], "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }

AWS CLI でポリシーをテストする

このポリシーは、次の create-bucket AWS CLI コマンドを使用してテストできます。この例では、bucketconfig.txt ファイルを使用して場所の制約を指定しています。Windows のファイルパスに注意してください。必要に応じて、バケットの名前とパスを更新します。--profile パラメータを使用して、ユーザーの認証情報を指定する必要があります。AWS CLI のセットアップおよび使用の詳細については、「チュートリアル例のツールのセットアップ」を参照してください。

aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

bucketconfig.txt ファイルは、次のように設定を指定します。

{"LocationConstraint": "sa-east-1"}

例 2: 特定のプレフィックスを持つバケット内のオブジェクト一覧の取得

s3:prefix 条件キーを使用して、GET Bucket (ListObjects) API の応答を、特定のプレフィックスを持つキー名に制限できます。バケット所有者であれば、バケット内の特定のプレフィックスの内容に限り、コンテンツを表示することをユーザーに許可できます。この条件キーは、バケットのオブジェクトがキー名プレフィックスによって整理されている場合に便利です。Amazon S3 コンソールでは、キー名のプレフィックスを使用して、フォルダの概念を示します。フォルダの概念をサポートするのはコンソールのみです。Amazon S3 API ではバケットとオブジェクトのみがサポートされます。プレフィックスと区切り文字を使用してアクセス許可をフィルタリングする方法の詳細については、チュートリアル: ユーザーポリシーを使用したバケットへのアクセスのコントロール を参照してください。

たとえば、キー名が public/object1.jpg および public/object2.jpg である 2 つのオブジェクトがある場合、コンソールには public フォルダ以下のオブジェクトが表示されます。Amazon S3 APIでは、これらはプレフィックスを持つオブジェクトであり、フォルダ内のオブジェクトではありません。ただし、Amazon S3 API で、このようなプレフィックスを使用してオブジェクトキーを管理している場合は、特定のプレフィックスの付いたキー名のリストを取得できる、s3:prefix 条件付きの s3:ListBucket アクセス許可を付与できます。

この例では、バケット所有者とユーザーが属する親アカウントは同一です。したがって、バケット所有者はバケットポリシーまたはユーザーポリシーのどちらでも使用することができます。GET Bucket (ListObjects) API で使用できるその他の条件キーの詳細については、ListObjects を参照してください。

ユーザーポリシー

以下のユーザーポリシーは、ユーザーがリクエストで prefix およびその値 projects を指定することを条件として、s3:ListBucket のアクセス許可を付与します (「GET Bucket (List Objects)」を参照)。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }

この条件では、ユーザーの取得できるリストが projects プレフィックスの付いているオブジェクトキーに限定されます。明示的な拒否を追加すると、ユーザーに付与されている他のアクセス許可に関係なしに、他のプレフィックスが付いたキーのリストを求めるユーザーのリクエストは拒否されます。たとえば、以前のユーザーポリシーの更新やバケットポリシーにより、オブジェクトキーのリストを表示するアクセス許可がユーザーに制限なく付与される場合があります。明示的な拒否が常に優先されるため、project プレフィックス以外のキーの表示を求めるユーザーのリクエストは拒否されます。

バケットポリシー

上記のユーザーポリシーに Principal 要素を追加して、ユーザーを指定する場合は、次のようにバケットポリシーを使用できます。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::BucketOwner-accountID:user/user-name" }, "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringEquals" : { "s3:prefix": "examplefolder" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::BucketOwner-AccountID:user/user-name" }, "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringNotEquals" : { "s3:prefix": "examplefolder" } } } ] }

AWS CLI でポリシーをテストする

このポリシーは、次の list-object AWS CLI コマンドを使用してテストできます。このコマンドでは、--profile パラメータを使用してユーザーの認証情報を指定します。AWS CLI のセットアップおよび使用の詳細については、「チュートリアル例のツールのセットアップ」を参照してください。

aws s3api list-objects --bucket examplebucket --prefix examplefolder --profile AccountADave

バケットがバージョニングに対応している場合、バケット内のオブジェクトのリストを表示するには、s3:ListBucket のアクセス許可ではなく、前述のポリシーの s3:ListBucketVersions のアクセス許可を付与する必要があります。このアクセス許可は、s3:prefix 条件キーもサポートしています。

例 3: キーの最大数の設定

s3:max-keys 条件キーを使用して、リクエスタが GET Bucket (ListObjects) または ListObjectVersions リクエストで返すことができるキーの最大数を設定できます。デフォルトでは、API は最大 1,000 個のキーを返します。s3:max-keys で使用できる数値条件演算子の一覧とそれに付随する例については、IAM ユーザーガイド の「数値条件演算子」を参照してください。