本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用條件索引鍵的儲存貯體政策範例
您可以使用存取政策語言來指定授予許可時的條件。您可以使用選用Condition
元素或Condition
區塊來指定政策生效時的條件。
如需使用 Amazon S3 條件索引鍵進行物件和儲存貯體操作的政策,請參閱下列範例。如需條件索引鍵的詳細資訊,請參閱 Amazon S3 的政策條件金鑰。如需您可以在政策中指定的 Amazon S3 動作、條件金鑰和資源的完整清單,請參閱服務授權參考 中的 Amazon S3 的動作、資源和條件金鑰。
如需 S3 資源類型對 S3 API操作的許可的詳細資訊,請參閱 Amazon S3 API操作的必要許可。
範例:物件操作的 Amazon S3 條件金鑰
下列範例示範如何將 Amazon S3 特定條件金鑰用於物件操作。如需您可以在政策中指定的 Amazon S3 動作、條件金鑰和資源的完整清單,請參閱服務授權參考 中的 Amazon S3 的動作、資源和條件金鑰。
如需 S3 資源類型對 S3 API操作的許可的詳細資訊,請參閱 Amazon S3 API操作的必要許可。
數個範例政策顯示如何將條件金鑰與PUT物件操作搭配使用。PUT 物件操作允許存取控制清單 (ACL) 特定的標頭,您可以用來授予 ACL型許可。透過使用這些條件金鑰,您可以設定條件,以便在使用者上傳物件時要求特定的存取許可。您也可以使用 PutObjectAcl 操作授予以 ACL為基礎的許可。如需詳細資訊,請參閱 Amazon S3 Amazon Simple Storage Service API參考 PutObjectAcl 中的 。如需 的詳細資訊ACLs,請參閱 存取控制清單 (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
-
允許從指定的來源儲存貯體複製物件,且僅允許其金鑰名稱字首開頭為 的物件作為特定字首,例如
(例如公有/
)。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 參考 中的使用 開發 AWS CLI Amazon S3API。
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
如需詳細資訊,請參閱 GetObject 在 Amazon Simple Storage Service API參考 中。
{ "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
條件金鑰來寫入IAM或虛擬私有雲端 (VPC) 端點政策,以限制使用者、角色或應用程式對特定 AWS 帳戶 ID 所擁有之 Amazon S3 儲存貯體的存取。您可以使用這些條件金鑰來限制 中的用戶端VPC存取您未擁有的儲存貯體。
不過,請注意,某些 AWS 服務依賴於對 AWS 受管儲存貯體的存取。因此,在IAM政策中使用 aws:ResourceAccount
或 s3:ResourceAccount
金鑰,可能會影響對這些資源的存取。如需詳細資訊,請參閱下列資源:
-
《AWS PrivateLink 指南》中限制對指定 AWS 帳戶帳戶中儲存貯體的存取
-
AWS Systems Manager 提供指南中受 AWS 管 Amazon S3 儲存貯體所需的 Systems Manager 存取權
如需有關 aws:ResourceAccount
和 s3:ResourceAccount
條件索引鍵的詳細資訊,以及示範如何使用它們的範例,請參閱 AWS Storage Blog 中的限制對特定 擁有的 Amazon S3 儲存貯體的存取權 AWS 帳戶
範例 6:需要最低TLS版本
您可以使用 s3:TlsVersion
條件金鑰來寫入 IAM、虛擬私有雲端端點 (VPCE) 或儲存貯體政策,以根據用戶端使用的TLS版本限制使用者或應用程式對 Amazon S3 儲存貯體的存取。您可以使用此條件金鑰來撰寫需要最低TLS版本的政策。
下列範例儲存貯體政策拒絕TLS版本早於 1.2 的用戶端提出的PutObject
請求,例如 1.1 或 1.0。若要使用此範例政策,請以您自己的資訊取代
。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
下列 儲存貯體政策範例允許TLS版本高於 1.1 的用戶端PutObject
請求,例如 1.2、1.3 或更新版本:
{ "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
陳述式中排除某些主體
下列儲存貯體政策拒絕s3:GetObject
存取
,但具有 帳戶號碼的主體除外 amzn-s3-demo-bucket
。 若要使用此範例政策,請將 取代123456789012
為您自己的資訊。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.*
s3:GetObject
許可,除非 IP 地址是您想要排除的 IP 地址 (例如,)
。在 192.0.2.188
Condition
區塊中, IpAddress
和 NotIpAddress
是條件,每個條件都會提供一個索引鍵值對以供評估。此範例中的兩個鍵值對都使用aws:SourceIp
AWS 寬鍵。若要使用此範例政策,請以您自己的資訊取代
。user input placeholders
注意
Condition
區塊中指定的 IPAddress
和 NotIpAddress
索引鍵值使用CIDR符號,如 4632 RFC 所述。如需詳細資訊,請參閱 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 支援的資源類型和條件金鑰的完整清單,請參閱服務授權參考 中的 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
folder。在 Amazon S3 中API,這些是具有字首的物件,而不是資料夾中的物件。如需有關使用字首和分隔符號來篩選存取許可的詳細資訊,請參閱使用使用者政策來控制對儲存貯體的存取。public
在下列情況下,儲存貯體擁有者和使用者所屬的父帳戶相同。因此,儲存貯體擁有者可以使用儲存貯體政策或使用者政策來授予存取權。如需有關可與 ListObjectsV2
API 操作搭配使用之其他條件金鑰的詳細資訊,請參閱 ListObjectsV2.
注意
如果儲存貯體已啟用版本控制,若要列出儲存貯體中的物件,您必須在下列政策中授予s3:ListBucketVersions
許可,而非s3:ListBucket
許可。此s3:ListBucketVersions
許可也支援 s3:prefix
條件金鑰。
使用者政策
下列使用者政策會授予 s3:ListBucket
許可 (請參閱 ListObjectsV2) 的Condition
陳述式,要求使用者在 請求中指定值為 的字首
。若要使用此範例政策,請以您自己的資訊取代 projects
。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 參考 中的使用 開發 AWS CLI Amazon S3API。
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 使用者指南 中的數值條件運算子。