使用條件鍵值區政策範例 - Amazon Simple Storage Service

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

使用條件鍵值區政策範例

您可以使用存取政策語言來指定授予許可時的條件。您可以使用選用 Condition 元素或 Condition 區塊來指定政策何時生效的條件。

如需使用 Amazon S3 條件索引鍵進行物件和儲存貯體操作的政策,請參閱下列範例。如需條件索引鍵的詳細資訊,請參閱 Amazon S3 的政策條件金鑰。如需可在政策中指定的 Amazon S3 動作、條件金鑰和資源的完整清單,請參閱服務授權參考適用於 Amazon S3 的動作、資源和條件金鑰

範例 — 物件操作的 Amazon S3 條件索引鍵

本節提供的範例示範如何將 Amazon S3 特定的條件索引鍵用於物件操作。如需可在政策中指定的 Amazon S3 動作、條件金鑰和資源的完整清單,請參閱服務授權參考適用於 Amazon S3 的動作、資源和條件金鑰

有幾個政策範例示範如何搭配 PUT 物件操作來使用條件金鑰。PUT 物件操作允許存取控制清單 (ACL) 特定的標頭,可用來授予以 ACL 為基礎的許可。使用這些金鑰,儲存貯體擁有者可設定條件,在使用者上傳物件時要求特定的存取許可。您也可以授與以 ACL 為基礎的權限與作業。PutObjectAcl 如需詳細資訊,請參閱 Amazon S3 Amazon 簡單儲存服務 API 參考PutObjectAcl中的。如需 ACL 的詳細資訊,請參閱「存取控制清單 (ACL) 概觀」。

範例 1:授與 s3:需要使用伺服器端加密存放物件的PutObject 權限

假設帳戶 A 擁有儲存貯體。帳戶管理員想要將上傳物件的許可授予帳戶 A 中的使用者 Jane,但條件是 Jane 一律要求伺服器端加密,以便 Amazon S3 儲存加密的物件。帳戶 A 管理員可使用 s3:x-amz-server-side-encryption 條件索引鍵完成此操作,如下所示。Condition 區塊中的金鑰/值對會指定 s3:x-amz-server-side-encryption 金鑰。

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

使用測試權限時 AWS CLI,您必須使用參數新增必要的--server-side-encryption參數。

aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin

示例 2:授予 s3:複製對象的PutObject 權限,並限制複製源

在 PUT 物件請求中,當您指定來源物件時,即為複製操作 (請參閱 PUT 物件 - 複製)。相對的,儲存貯體擁有者可以授予使用者複製物件的許可,但來源有所限制,例如:

  • 僅允許複製來自 sourcebucket 儲存貯體的物件。

  • 允許從來源儲存貯體複製物件,而且只複製金鑰名稱前綴以 public/f 開頭的物件 (例如,sourcebucket/public/*)。

  • 允許只複製來源儲存貯體中的特定物件 (例如 sourcebucket/example.jpg)。

以下儲存貯體政策會授予使用者 (Dave) s3:PutObject 許可。這允許其複製僅具有以下條件的物件:要求包含 s3:x-amz-copy-source 標頭,而且標頭值指定 /awsexamplebucket1/public/* 金鑰名稱前綴。

{ "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:::awsexamplebucket1/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "awsexamplebucket1/public/*" } } } ] }
使用 AWS CLI

您可以使用 AWS CLI copy-object指令測試權限。您可以透過新增 --copy-source 參數來指定來源,而金鑰名稱前綴必須符合政策中允許的前綴。您需要使用 --profile 參數,來提供使用者 Dave 的憑證。如需有關設定的更多資訊 AWS CLI,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

aws s3api copy-object --bucket awsexamplebucket1 --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountADave
提供僅複製特定物件的許可

前項政策使用 StringNotLike 條件。若要授予僅複製特定物件的許可,您必須將條件從 StringNotLike 變更成 StringNotEquals,然後指定確切的物件金鑰,如下所示。

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

範例 3:授與物件特定版本的存取權

假設帳戶 A 擁有已啟用版本控制的儲存貯體。儲存貯體有數個版本的 HappyFace.jpg 物件。現在,帳戶管理員希望授予使用者 Dave 只取得特定物件版本的許可。帳戶管理員可有條件地授予 Dave s3:GetObjectVersion 許可來完成此操作,如下所示。Condition 區塊中的金鑰/值對會指定 s3:VersionId 條件索引鍵。在本例中,Dave 需要知道確切的物件版本 ID 才能擷取物件。

如需詳細資訊,請參閱 Amazon 簡易儲存服務 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:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }
使用 AWS CLI

您可以使用 AWS CLI get-object指令與識別特定物件版本的--version-id參數來測試權限。此命令會擷取物件並將它儲存到 OutputFile.jpg 檔案。

aws s3api get-object --bucket examplebucketversionenabled --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:ResourceAccount 或者 s3:ResourceAccount 金鑰也可能影響對這些資源的存取。

如需詳細資訊和範例,請參閱下列資源:

範例 6:需要最低 TLS 版本

您可以使用 s3: TlsVersion 條件金鑰撰寫 IAM、虛擬私有雲端端點 (VPCE) 或儲存貯體政策,以根據用戶端使用的 TLS 版本限制使用者或應用程式存取 Amazon S3 儲存貯體。您可以使用此條件索引鍵來撰寫需要最低 TLS 版本的政策。

此範例值區政策會 PutObject 拒絕 TLS 版本低於 1.2 的用戶端 (例如 1.1 或 1.0) 的要求。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

範例 — 儲存貯體操作的 Amazon S3 條件索引鍵

本節提供的政策範例示範如何將 Amazon S3 特定的條件索引鍵用於儲存貯體操作。

示例 1:授予 s3:具有 IP 地址條件的GetObject 權限

如果要求來自特定 IP 位址範圍 (192.0.2.*),您可以授與已驗證的使用者使用該s3:GetObject動作的權限,除非 IP 位址是 192.0.2.188。在條件區塊中,IpAddressNotIpAddress 是條件,而且每個條件都獲得一組用於評估的金鑰/值對。本範例中的兩個鍵值對都使用了aws:SourceIp AWS寬鍵。

注意

條件中指定的 IPAddressNotIpAddress 金鑰值使用 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:::awsexamplebucket1/*", "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 的動作、資源和條件金鑰

範例 2:取得儲存貯體中包含特定前綴的物件清單

您可以使用s3:prefix條件鍵將 GET 值區 (ListObjects) API 的回應限制為具有特定前置詞的金鑰名稱。如果您是儲存貯體擁有者,則可限制使用者列出儲存貯體中特定前綴的內容。如果儲存貯體中的物件是按金鑰名稱前綴來組織,此條件索引鍵會很有用。Amazon S3 主控台會使用金鑰名稱前綴來顯示資料夾概念。只有主控台支援資料夾的概念,Amazon S3 API 僅支援儲存貯體和物件。如需有關使用字首和分隔符號來篩選存取許可的詳細資訊,請參閱使用使用者政策來控制對儲存貯體的存取

例如,若您擁有的兩個物件金鑰名稱分別為 public/object1.jpgpublic/object2.jpg,則主控台會在 public 資料夾下顯示物件。在 Amazon S3 API 中,這些是具有字首的物件,而不是資料夾內的物件。不過,在 Amazon S3 API 中,如果您使用這類字首來組織物件金鑰,則可以搭配 s3:prefix 條件來授予 s3:ListBucket 許可,以允許使用者取得具有這些特定字首的金鑰名稱清單。

在此範例中,儲存貯體擁有者及使用者所屬的父帳戶是同一個。所以儲存貯體擁有者可以使用儲存貯體政策或使用者政策。如需可搭配 GET 值區 (ListObjects) API 使用之其他條件金鑰的詳細資訊,請參閱ListObjects

使用者政策

下列使用者政策授予 s3:ListBucket 許可 (請參閱 GET 儲存貯體 (列出物件)),條件是使用者需要在請求中指定 prefix 的值為 projects

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

此條件限制使用者列出使用 projects 字首的物件金鑰。無論使用者可能擁有什麼樣的許可,新增的明確拒絕都會拒絕使用者列出具有任何其他字首金鑰的要求。例如,只要更新上述使用者政策或透過儲存貯體政策,使用者就有可能取得列出物件金鑰的許可,而不受任何限制。明確拒絕會取代一切,所以使用者列出 projects 前綴以外之金鑰的要求將遭拒。

儲存貯體政策

如果將 Principal 元素新增至上述使用者政策來找出使用者,則您現在就會有儲存貯體政策,如下所示。

{ "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:::awsexamplebucket1", "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:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }
使用 AWS CLI

您可以使用下列list-object AWS CLI 命令來測試原則。在命令中,您要使用 --profile 參數來提供使用者憑證。若要取得有關設定和使用的更多資訊 AWS CLI,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

aws s3api list-objects --bucket awsexamplebucket1 --prefix examplefolder --profile AccountADave

如果儲存貯體已啟用版本控制,您必須在上述政策中授予 s3:ListBucketVersions 許可 (而非 s3:ListBucket 許可),才能列出儲存貯體中的物件。此許可也支援 s3:prefix 條件索引鍵。

範例 3:設定金鑰數上限

您可以使用s3:max-keys條件鍵來設置請求者可以在 GET 存儲桶(ListObjects)ListObjectVersions請求中返回的最大密鑰數量。API 預設傳回最多 1,000 個金鑰。如需您可搭配 s3:max-keys 使用的數值條件運算子清單和隨附範例,請參閱《IAM 使用者指南》中的數值條件運算子