本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用條件索引鍵的儲存貯體政策範例
您可以使用存取政策語言來指定授予許可時的條件。您可以使用選用 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 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 參考》中的使用 AWS CLI 開發 Amazon S3。 Amazon S3
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
您可以使用 命令搭配 --version-id
參數來識別要擷取的特定物件版本,以 AWS CLI get-object
測試此政策中的許可。此命令會擷取特定版本的物件,並將其儲存至
檔案。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 帳戶帳戶中儲存貯體的存取
-
Amazon ECR 指南中的限制對 Amazon ECR 使用的儲存貯體的存取
-
《 AWS Systems Manager 指南》中的為 AWS 受管 Amazon S3 儲存貯體提供 Systems Manager 的必要存取權
如需 aws:ResourceAccount
和 s3:ResourceAccount
條件索引鍵的詳細資訊,以及示範其使用方式的範例,請參閱 AWS 儲存部落格中的限制對特定 AWS 帳戶所擁有 Amazon S3 儲存貯體的存取
範例 6:需要最低 TLS 版本
您可以使用 s3:TlsVersion
條件索引鍵來撰寫 IAM、虛擬私有雲端端點 (VPCE) 或儲存貯體政策,以限制使用者或應用程式存取用戶端所使用基於 TLS 版本的 Amazon S3 儲存貯體。您可以使用此條件索引鍵來撰寫需要最低 TLS 版本的政策。
注意
當 AWS 服務代表您呼叫其他 AWS 服務 service-to-service呼叫) 時,會修訂特定網路的授權內容,包括 s3:TlsVersion
、aws:SecureTransport
、 aws:SourceIp
和 aws:VpcSourceIp
。如果您的政策搭配 Deny
陳述式使用這些條件金鑰, AWS 服務主體可能會意外遭到封鎖。若要允許 AWS 服務正常運作,同時維護您的安全需求,請新增值為 aws:PrincipalIsAWSService
的條件金鑰,以從 Deny
陳述式中排除服務主體false
。例如:
{ "Effect": "Deny", "Action": "s3:*", "Resource": "*", "Condition": { "Bool": { "aws:SecureTransport": "false", "aws:PrincipalIsAWSService": "false" } } }
此政策會在不使用 HTTPS (aws:SecureTransport
為 false) 時拒絕存取 S3 操作,但僅適用於非AWS 服務主體。這可確保您的條件限制適用於 AWS 服務委託人以外的所有委託人。
下列範例儲存貯體政策會「拒絕」TLS 版本低於 1.2 (例如 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
下列範例儲存貯體政策會「允許」TLS 版本高於 1.1 (例如 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
陳述式中排除特定主體
下列儲存貯體政策會拒絕對
的 amzn-s3-demo-bucket
s3:GetObject
存取,但帳戶號碼為
的主體除外。若要使用此範例政策,請以您自己的資訊取代 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
範例 8:強制用戶端有條件地根據物件金鑰名稱或 ETag 來上傳物件
透過條件式寫入,您可以將額外的標頭新增至 WRITE
請求,以指定 S3 操作的先決條件。此標頭會指定條件,如果不符合,則會導致 S3 操作失敗。例如,您可以在物件上傳期間驗證儲存貯體中沒有相同金鑰名稱的物件,以防止覆寫現有的資料。或者,您也可以在寫入物件之前,檢查 Amazon S3 中物件的實體標籤 (ETag)。
如需在儲存貯體政策中使用條件來強制執行條件式寫入的儲存貯體政策範例,請參閱在 Amazon S3 儲存貯體上強制執行條件式寫入。
範例:儲存貯體操作的 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
注意
IPAddress
區塊中指定的 NotIpAddress
和 Condition
金鑰值使用 CIDR 表示法,如 RFC 4632 中所述。如需詳細資訊,請參閱 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
資料夾下顯示物件。在 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 API 參考》中的使用 AWS CLI 與 Amazon S3 一起開發。 Amazon S3
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 使用者指南》中的數值條件運算子。