条件キーを使用したバケットポリシーの例 - Amazon Simple Storage Service

条件キーを使用したバケットポリシーの例

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

オブジェクトおよびバケットオペレーションに Amazon S3 条件キーを使用するポリシーについては、次の例を参照してください。条件キーの詳細については、Amazon S3 のポリシー条件キー を参照してください。Amazon S3 アクションの完全なリストとポリシーで指定できるリソースについては、「サービス認可リファレンス」の「Actions, resources, and condition keys for Amazon S3」を参照してください。

S3 リソースタイプ別の S3 API オペレーションへのアクセス許可の詳細については、「Amazon S3 API オペレーションに必要なアクセス許可」を参照してください。

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

以下の例は、オブジェクトオペレーションに Amazon S3 固有の条件キーを使用する方法を示しています。Amazon S3 アクションの完全なリストとポリシーで指定できるリソースについては、「サービス認可リファレンス」の「Actions, resources, and condition keys for Amazon S3」を参照してください。

S3 リソースタイプ別の S3 API オペレーションへのアクセス許可の詳細については、「Amazon S3 API オペレーションに必要なアクセス許可」を参照してください。

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

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

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

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

AWS CLI を使用してこのアクセス許可をテストする場合、次の例に示すように、--server-side-encryption パラメータを使用して必要な暗号化を追加する必要があります。このコマンドの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

aws s3api put-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountAadmin

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

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

  • 指定したソースバケット (例: amzn-s3-demo-source-bucket) からのみオブジェクトをコピーすることを許可します。

  • 指定したソースバケットから、キー名のプレフィックスが public/ など特定のプレフィックス (例: amzn-s3-demo-source-bucket/public/*) で始まるオブジェクトのみコピーすることを許可します。

  • ソースバケット (例: amzn-s3-demo-source-bucket/example.jpg) から特定のオブジェクトのみをコピーすることを許可します。

次のバケットポリシーでは、ユーザー (Dave) に s3:PutObject のアクセス許可が付与されます。このポリシーでは、リクエストに s3:x-amz-copy-source ヘッダーを含め、ヘッダーの値でキー名のプレフィックスに /amzn-s3-demo-source-bucket/public/* を指定している場合にのみ、オブジェクトをコピーできます。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/public/*" } } } ] }
AWS CLI でポリシーをテストする

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

aws s3api copy-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --copy-source amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg --profile AccountADave
特定のオブジェクトのみをコピーするアクセス許可を付与する

前述のポリシーでは、StringNotLike 条件を使用しています。次に示すとおり、特定のオブジェクトのみをコピーするアクセス許可を付与するには、条件を StringNotLike から StringNotEquals に変更し、オブジェクトキーを正確に指定する必要があります。このコマンドの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

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

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

アカウント A が、バージョニングが有効なバケットを所有しているとします。このバケットには、HappyFace.jpg オブジェクトのバージョンが複数含まれています。アカウント A の管理者は、ユーザー Dave にオブジェクトの特定のバージョンのみを取得できるアクセス許可を付与したいと考えています。この場合、アカウント管理者は、次に示すように、条件を付けてユーザー Daves3:GetObjectVersion のアクセス許可を付与できます。Condition ブロックのキーと値のペアは、s3:VersionId 条件キーを指定します。この場合、指定したバージョニングが有効なバケットからオブジェクトを取得するには、Dave は正確なオブジェクトバージョン ID を知る必要があります。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

詳細については、「Amazon Simple Storage Service API リファレンス」の「GetObject」を参照してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }
AWS CLI でポリシーをテストする

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

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

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

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

例 5: バケット所有者の AWS アカウント ID によるアクセスの制限

aws:ResourceAccount または s3:ResourceAccount の条件キーのいずれかを使用して、特定の AWS アカウント ID が所有する Amazon S3 バケットへのユーザー、ロール、またはアプリケーションのアクセスを制限する IAM または仮想プライベートクラウド (VPC) エンドポイントポリシーを記述できます。これらの条件キーを使用すると、VPC 内のクライアントによる、ユーザーが所有していないバケットへのアクセスを制限できます。

ただし、一部の AWS サービスは AWS マネージドバケットへのアクセスに依存していることに注意してください。したがって、IAM ポリシーで aws:ResourceAccount キーまたは s3:ResourceAccount キーを使用することは、これらのリソースへのアクセスにも影響する可能性があります。詳細については、以下のリソースを参照してください。

aws:ResourceAccount および s3:ResourceAccount 条件キーの詳細と使用方法を示す例については、「AWS ストレージブログ」の「Limit access to Amazon S3 buckets owned by specific AWS アカウント」を参照してください。

例 6: 最小の TLS バージョンの要求

s3:TlsVersion 条件キーを使用して、クライアントが使用する TLS バージョンに基づいて Amazon S3 バケットへのユーザーまたはアプリケーションのアクセスを制限する IAM ポリシー、仮想プライベートクラウドエンドポイント (VPCE) ポリシー、またはバケットポリシーを作成できます。この条件キーを使用して、最小の TLS バージョンを必要とするポリシーを記述できます。

このバケットポリシーの例では、1.2 より前の TLS バージョン (1.1 や 1.0 など) のクライアントによる PutObject リクエストを拒否します。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }

このバケットポリシー例では、1.1 よりも高い TLS バージョン (1.2、1.3 以降など) のクライアントによる PutObject リクエストを許可します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

例 7: Deny ステートメントから特定のプリンシパルを除外する

次のバケットポリシーは、アカウント番号 123456789012 を持つプリンシパルを除き、amzn-s3-demo-bucket への s3:GetObject アクセスを拒否します。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyAccessFromPrincipalNotInSpecificAccount", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ], "Condition": { "StringNotEquals": { "aws:PrincipalAccount": [ "123456789012" ] } } } ] }

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

以下のポリシーの例では、バケットオペレーションに Amazon S3 固有の条件キーを使用する方法を示します。

例 1: IP アドレスに対する条件付きの s3:GetObject アクセス許可の付与

リクエストが特定の範囲の IP アドレス (例: 192.0.2.*) から発信された場合は、そのアドレスが除外する IP アドレス (例: 192.0.2.188) でない限り、s3:GetObject アクションを使用するアクセス許可を認証したユーザーに付与できます。Condition ブロックでは、IpAddressNotIpAddress は条件であり、それぞれの条件に評価されるキーと値のペアが指定されています。この例の両方のキーと値のペアは、aws:SourceIp AWS 全体キーを使用しています。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

注記

Condition ブロックで指定されている 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:::amzn-s3-demo-bucket/*", "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 条件キーを指定できます。具体的な例については、「バケットポリシーを使用した VPC エンドポイントからのアクセスコントロール」を参照してください。

注記

一部の AWS グローバル条件キーでは、特定のリソースタイプのみがサポートされます。そのため、使用するグローバル条件キーとリソースタイプを Amazon S3 がサポートしているかどうか、または代わりに Amazon S3 固有の条件キーを使用する必要があるかどうかを確認してください。Amazon S3 に対してサポートされているリソースタイプと条件キーの完全なリストについては、サービス認可リファレンスの「Actions, resources, and condition keys for Amazon S3」を参照してください。

S3 リソースタイプ別の S3 API オペレーションへのアクセス許可の詳細については、「Amazon S3 API オペレーションに必要なアクセス許可」を参照してください。

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

s3:prefix 条件キーを使用して、ListObjectsV2 API オペレーションを、特定のプレフィックスを持つキー名に制限できます。バケット所有者であれば、条件キーを使用して、ユーザーがバケット内の特定のプレフィックスの内容を一覧表示することを制限できます。s3:prefix 条件キーは、バケットのオブジェクトがキー名プレフィックスによって整理されている場合に便利です。

Amazon S3 コンソールでは、キー名のプレフィックスを使用して、フォルダの概念を示します。フォルダの概念をサポートしているはコンソールのみです。Amazon S3 API では、バケットとオブジェクトのみがサポートされています。例えば、キー名が public/object1.jpg および public/object2.jpg である 2 つのオブジェクトがある場合、コンソールには public フォルダ以下のオブジェクトが表示されます。Amazon S3 API では、これらはプレフィックスを持つオブジェクトとして扱われ、フォルダ内のオブジェクトとしては扱われません。プレフィックスと区切り文字を使用してアクセス許可をフィルタリングする方法の詳細については、ユーザーポリシーを使用したバケットへのアクセスの制御 を参照してください。

次のシナリオでは、バケット所有者とユーザーが属する親アカウントは同一です。したがって、バケット所有者は、アクセス許可を付与するためにバケットポリシーまたはユーザーポリシーのどちらも使用できます。ListObjectsV2 API オペレーションを使用できる条件キーの詳細については、「ListObjectsV2」を参照してください。

注記

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

ユーザーポリシー

次のユーザーポリシーは、s3:ListBucket のアクセス許可 (「ListObjectsV2」を参照) に、projects の値を持つリクエストでプレフィックスを指定する必要がある Condition ステートメントを付与します。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

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

Condition ステートメントは、プレフィックスが projects のオブジェクトキーのみを一覧表示するようにユーザーを制限します。明示的なDeny ステートメントを追加すると、ユーザーに付与されている他のアクセス許可にかかわらず、他のプレフィックスが付いたキーのリストを求めるユーザーは拒否されます。例えば、以前のユーザーポリシーの更新やバケットポリシーにより、オブジェクトキーのリストを表示するアクセス許可がユーザーに制限なく付与される場合があります。明示的な Deny ステートメントは常に Allow ステートメントを上書きするため、ユーザーが projects プレフィックスを持つキー以外のキーを一覧表示しようとすると、リクエストは拒否されます。

バケットポリシー

次の例に示すとおり、上記のユーザーポリシーに Principal 要素を追加して、ユーザーを指定する場合は、バケットポリシーを使用できます。このポリシーの例を実行するには、user input placeholders をユーザー自身の情報に置き換えます。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }
AWS CLI でポリシーをテストする

このポリシーは、次の list-object AWS CLI コマンドを使用してテストできます。このコマンドでは、--profile パラメータを使用してユーザーの認証情報を指定します。AWS CLI のセットアップと使用の詳細については、「Amazon S3 API リファレンス」の「Developing with Amazon S3 using the AWS CLI」を参照してください。

aws s3api list-objects --bucket amzn-s3-demo-bucket --prefix projects --profile AccountA

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

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