条件キーを使用したバケットポリシーの例
アクセスポリシー言語を使用して、アクセス許可を付与するときに条件を指定できます。オプションの 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
--keyHappyFace.jpg
--bodyc:\HappyFace.jpg
--server-side-encryption "AES256
" --profileAccountAadmin
例 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:::/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::
amzn-s3-demo-source-bucket
123456789012
:user/Dave
" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "
amzn-s3-demo-source-bucket
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
--key
amzn-s3-demo-source-bucket
HappyFace.jpg
--copy-source
amzn-s3-demo-source-bucket
/public/PublicHappyFace1.jpg
--profileAccountADave
特定のオブジェクトのみをコピーするアクセス許可を付与する
前述のポリシーでは、StringNotLike
条件を使用しています。次に示すとおり、特定のオブジェクトのみをコピーするアクセス許可を付与するには、条件を StringNotLike
から StringNotEquals
に変更し、オブジェクトキーを正確に指定する必要があります。このコマンドの例を実行するには、
をユーザー自身の情報に置き換えます。user input
placeholders
"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "
amzn-s3-demo-source-bucket
/public/PublicHappyFace1.jpg
" } }
例 3: オブジェクトの特定のバージョンに対するアクセス許可を付与する
アカウント A が、バージョニングが有効なバケットを所有しているとします。このバケットには、
オブジェクトのバージョンが複数含まれています。アカウント A の管理者は、ユーザー HappyFace.jpg
にオブジェクトの特定のバージョンのみを取得できるアクセス許可を付与したいと考えています。この場合、アカウント管理者は、次に示すように、条件を付けてユーザー Dave
に Dave
s3:GetObjectVersion
のアクセス許可を付与できます。Condition
ブロックのキーと値のペアは、s3:VersionId
条件キーを指定します。この場合、指定したバージョニングが有効なバケットからオブジェクトを取得するには、
は正確なオブジェクトバージョン ID を知る必要があります。このポリシーの例を実行するには、Dave
をユーザー自身の情報に置き換えます。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
--key
amzn-s3-demo-bucket
HappyFace.jpg
OutputFile.jpg
--version-idAaaHbAQitwiL_h47_44lRO2DDfLlBO5e
--profileAccountADave
例 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 アカウント ガイドの指定された AWS PrivateLink のバケットへのアクセスの制限
-
Amazon ECR ガイドの Amazon ECR が使用するバケットへのアクセスを制限する
-
AWS Systems Manager ガイドの AWS が管理する Amazon S3 バケットに必要なアクセスを System Manager に提供する
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:::
", "arn:aws:s3:::
amzn-s3-demo-bucket1
/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }
amzn-s3-demo-bucket1
このバケットポリシー例では、1.1 よりも高い TLS バージョン (1.2、1.3 以降など) のクライアントによる PutObject
リクエストを許可します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::
", "arn:aws:s3:::
amzn-s3-demo-bucket1
/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }
amzn-s3-demo-bucket1
例 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 アドレス (例:
) から発信された場合は、そのアドレスが除外する IP アドレス (例: 192.0.2.*
) でない限り、192.0.2.188
s3:GetObject
アクションを使用するアクセス許可を認証したユーザーに付与できます。Condition
ブロックでは、IpAddress
と NotIpAddress
は条件であり、それぞれの条件に評価されるキーと値のペアが指定されています。この例の両方のキーと値のペアは、aws:SourceIp
AWS 全体キーを使用しています。このポリシーの例を実行するには、
をユーザー自身の情報に置き換えます。user input placeholders
注記
Condition
ブロックで指定されている IPAddress
と NotIpAddress
のキー値は、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:::
/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "
amzn-s3-demo-bucket
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
である 2 つのオブジェクトがある場合、コンソールには public/object2.jpg
フォルダ以下のオブジェクトが表示されます。Amazon S3 API では、これらはプレフィックスを持つオブジェクトとして扱われ、フォルダ内のオブジェクトとしては扱われません。プレフィックスと区切り文字を使用してアクセス許可をフィルタリングする方法の詳細については、ユーザーポリシーを使用したバケットへのアクセスの制御 を参照してください。public
次のシナリオでは、バケット所有者とユーザーが属する親アカウントは同一です。したがって、バケット所有者は、アクセス許可を付与するためにバケットポリシーまたはユーザーポリシーのどちらも使用できます。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:::
", "Condition" : { "StringEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
projects
" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::", "Condition" : { "StringNotEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
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:::", "Condition" : { "StringEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
projects
" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012
:user/bucket-owner
" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::", "Condition" : { "StringNotEquals" : { "s3:prefix": "
amzn-s3-demo-bucket
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
--prefix
amzn-s3-demo-bucket
projects
--profileAccountA
例 3: キーの最大数の設定
s3:max-keys
条件キーを使用すると、リクエスタが ListObjectsV2 または ListObjectVersions リクエストで返すことができるキーの最大数を設定できます。デフォルトでは、API オペレーションは最大 1,000 個のキーを返します。s3:max-keys
で使用できる数値条件演算子の一覧とその例については、IAM ユーザーガイドの数値条件演算子 を参照してください。