使用條件索引鍵的儲存貯體政策範例 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用條件索引鍵的儲存貯體政策範例

您可以使用存取政策語言來指定授予許可時的條件。您可以使用選用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 --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountAadmin

範例 2:授予s3:PutObject許可,以複製對複製來源具有限制的物件

PUT物件請求中,當您指定來源物件時,請求是複製操作 (請參閱 CopyObject)。 因此,儲存貯體擁有者可以授予使用者許可,以複製對來源具有限制的物件,例如:

  • 僅允許從指定的來源儲存貯體複製物件 (例如 amzn-s3-demo-source-bucket)。

  • 允許從指定的來源儲存貯體複製物件,且僅允許其金鑰名稱字首開頭為 的物件作為特定字首,例如 公有/ (例如 amzn-s3-demo-source-bucket/public/*)。

  • 僅允許從來源儲存貯體複製特定物件 (例如 amzn-s3-demo-source-bucket/example.jpg)。

下列儲存貯體政策會授予使用者 (Daves3: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 參考 中的使用 開發 AWS CLI Amazon S3API

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

如需詳細資訊,請參閱 GetObjectAmazon 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 amzn-s3-demo-bucket --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

範例 4:根據物件標籤授予許可

如需如何搭配 Amazon S3 操作使用物件標記條件金鑰的範例,請參閱 標記與存取控制政策

範例 5:限制儲存貯體擁有者 AWS 帳戶 ID 的存取

您可以使用 aws:ResourceAccounts3:ResourceAccount條件金鑰來寫入IAM或虛擬私有雲端 (VPC) 端點政策,以限制使用者、角色或應用程式對特定 AWS 帳戶 ID 所擁有之 Amazon S3 儲存貯體的存取。您可以使用這些條件金鑰來限制 中的用戶端VPC存取您未擁有的儲存貯體。

不過,請注意,某些 AWS 服務依賴於對 AWS 受管儲存貯體的存取。因此,在IAM政策中使用 aws:ResourceAccounts3:ResourceAccount金鑰,可能會影響對這些資源的存取。如需詳細資訊,請參閱下列資源:

如需有關 aws:ResourceAccounts3: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:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }

下列 儲存貯體政策範例允許TLS版本高於 1.1 的用戶端PutObject請求,例如 1.2、1.3 或更新版本:

{ "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陳述式中排除某些主體

下列儲存貯體政策拒絕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區塊中, IpAddressNotIpAddress是條件,每個條件都會提供一個索引鍵值對以供評估。此範例中的兩個鍵值對都使用aws:SourceIp AWS 寬鍵。若要使用此範例政策,請以您自己的資訊取代 user input placeholders

注意

Condition 區塊中指定的 IPAddressNotIpAddress索引鍵值使用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:::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:SourceVpceaws: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,主控台會顯示 下的物件 public folder。在 Amazon S3 中API,這些是具有字首的物件,而不是資料夾中的物件。如需有關使用字首和分隔符號來篩選存取許可的詳細資訊,請參閱使用使用者政策來控制對儲存貯體的存取

在下列情況下,儲存貯體擁有者和使用者所屬的父帳戶相同。因此,儲存貯體擁有者可以使用儲存貯體政策或使用者政策來授予存取權。如需有關可與 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:::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 參考 中的使用 開發 AWS CLI Amazon S3API

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

範例 3:設定金鑰數上限

您可以使用 s3:max-keys 條件金鑰來設定請求者在 中可以傳回的金鑰數目上限 ListObjectsV2ListObjectVersions 請求。根據預設,這些API操作最多會傳回 1,000 個金鑰。如需可與 s3:max-keys和隨附範例搭配使用的數值條件運算子清單,請參閱 IAM 使用者指南 中的數值條件運算子