Amazon S3 條件索引鍵範例 - Amazon Simple Storage Service

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

Amazon S3 條件索引鍵範例

您可以使用存取政策語言來指定授予許可時的條件。您可以使用選用 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 權限,條件要求存儲桶所有者獲得完全控制

PUT 物件操作允許存取控制清單 (ACL) 特定的標頭,可用來授予以 ACL 為基礎的許可。使用這些金鑰,儲存貯體擁有者可設定條件,在使用者上傳物件時要求特定的存取許可。

假設帳戶 A 擁有值區,且帳戶管理員想要授與 Agua (帳戶 B 中的使用者) 上傳物件的權限。根據預設,Agua 上傳的物件由帳戶 B 擁有,而帳戶 A 對這些物件沒有權限。由於存儲桶所有者正在支付帳單,因此它需要對 Agua 上傳的對象具有完整權限。帳戶管理員可以通過授予 Acua s3:PutObject 權限來執行此操作,條件是請求包括明確授予完整權限或使用固定 ACL 的 ACL 特定 ACL 的特定標頭。如需詳細資訊,請參閱 PUT 物件

需要標 x-amz-full-control 頭

您可以指定要求中的 x-amz-full-control 標頭需要有儲存貯體擁有者的完全控制許可。下列儲存貯體政策將s3:PutObject權限授予使用者 Agua 的條件使用s3:x-amz-grant-full-control條件,這需要要求包含x-amz-full-control標頭的要求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/Akua" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
注意

此範例有關跨帳戶許可。但是,如果 Agua(獲得權限的人)屬於擁有 AWS 帳戶 該值區的人,則不需要此條件權限。這是因為 Agua 所屬的父帳戶擁有使用者上傳的物件。

新增明確拒絕

上述儲存貯體政策授予帳戶 B 中的使用者 Agua 條件權限。雖然此政策生效,但 Agua 有可能透過其他政策在沒有任何條件的情況下取得相同的權限。例如,Agua 可以屬於一個組,並且您在沒有任何條件的情況下授予該組s3:PutObject權限。為避免此等許可漏洞,您可以新增明確拒絕,撰寫較嚴格的存取政策。在此範例中,如果使用者 Agua 上傳權限未在授與值區擁有者完整權限的請求中包含必要的標頭,則您明確拒絕使用者 Agua 上傳權限。明確拒絕會取代任何其他已授予的許可。以下是已新增明確拒絕的修訂後存取政策範例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
使用 AWS CLI

如果您有兩個 AWS 帳戶,則可以使用 AWS Command Line Interface (AWS CLI) 來測試原則。您附加原則並使用 Agua 的認證,使用下列 AWS CLI put-object命令來測試權限。您可以透過新增--profile參數來提供 Agua 的認證。您可以透過新增 --grant-full-control 參數,授予儲存貯體擁有者的完全控制許可。若要取得有關設定和使用的更多資訊 AWS CLI,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile

需要標 x-amz-acl 頭

您可以要求有固定 ACL 的 x-amz-acl 標頭將完全控制許可授予儲存貯體擁有者。要求中若需要 x-amz-acl 標頭,您可以取代 Condition 區塊中的金鑰/值對,並指定 s3:x-amz-acl 條件索引鍵,如以下範例所示。

"Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }

若要使用測試權限 AWS CLI,請指定--acl參數。 AWS CLI 然後在發送請求時添加x-amz-acl標題。

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin

範例 2:授與 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

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

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

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

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

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

以下存儲桶策略授予用戶(Agua)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/Akua" }, "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/Akua" }, "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參數提供用戶 Agua 憑據。若要取得有關設定的更多資訊 AWS CLI,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

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

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

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

範例 4:授予物件特定版本的存取許可

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

如需詳細資訊,請參閱《Amazon Simple Storage Service API 參考》中的 GetObject

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "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 AccountAAkua

範例 5:限制物件上傳到使用特定儲存體方案的物件

假設帳戶 A (以帳戶 ID 123456789012 代表) 擁有一個儲存貯體。帳戶管理員想要限制 Agua (帳戶 A 中的使用者) 只能將物件上傳到隨儲存區類別一起儲存的STANDARD_IA值區。若要限制物件上傳至特定儲存體方案,帳戶 A 管理員可以使用 s3:x-amz-storage-class 條件索引鍵,如下列儲存貯體政策範例所示。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Akua" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition": { "StringEquals": { "s3:x-amz-storage-class": [ "STANDARD_IA" ] } } } ] }

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

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

範例 7:依值區擁有者的 AWS 帳戶 ID 限制存取

您可以使用 aws:ResourceAccounts3:ResourceAccount 索引鍵來撰寫 IAM 或虛擬私有雲端 (VPC) 端點政策,以限制使用者、角色或應用程式對特定 AWS 帳戶 ID 擁有的 Amazon S3 儲存貯體的存取權。您可以使用此條件索引鍵來限制 VPC 內的用戶端存取您未擁有的儲存貯體。

不過,請注意,某些 AWS 服務需要存取 AWS 受管理值區。因此,在 IAM 政策使用 aws:ResourceAccount 或者 s3:ResourceAccount 金鑰也可能影響對這些資源的存取。

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

範例 8:需要最低 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:授予使用者建立儲存貯體的許可,但僅限特定區域

假設 AWS 帳戶 管理員想要授與其使用者 (Agua) 權限,以便僅在南美洲 (聖保羅) 區域建立值區。帳戶管理員可連接下列使用者政策,授予附條件的 s3:CreateBucket 許可,如下所示。Condition 區塊中的金鑰/值對會指定 s3:LocationConstraint 金鑰與 sa-east-1 區域當做值。

注意

在此範例中,儲存貯體擁有者要將許可授予其使用者之一,所以可使用儲存貯體政策或使用者政策。本例示範使用者政策。

如需 Amazon S3 區域的清單,請參閱《AWS 一般參考》中的區域與端點

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
新增明確拒絕

上述政策限制使用者只能在 sa-east-1 區域建立儲存貯體,任何其他區域皆不可。不過,可能有其他政策會授予此使用者許可,使其可在其他區域建立儲存貯體。例如,假設使用者屬於某個群組,而此群組所連接的政策允許群組許可範圍中的所有使用者在另一區域建立儲存貯體。為確保使用者不會取得在任何其他區域建立儲存貯體的許可,您可在上述政策中新增明確拒絕陳述式。

Deny 陳述式使用 StringNotLike 條件。亦即,如果位置限制條件不是 sa-east-1,便拒絕建立儲存貯體的要求。無論使用者取得什麼樣的許可,明確拒絕都不允許使用者在任何其他區域建立儲存貯體。以下是包含明確拒絕陳述式的政策。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }
使用 AWS CLI

您可以使用下列create-bucket AWS CLI 命令來測試原則。本例使用 bucketconfig.txt 檔案指定位置限制條件。請記下 Windows 檔案路徑。您需要適時更新儲存貯體名稱及路徑。您必須使用 --profile 參數提供使用者憑證。若要取得有關設定和使用的更多資訊 AWS CLI,請參閱使用 AWS CLI 來透過 Amazon S3 進行開發

aws s3api create-bucket --bucket examplebucket --profile AccountAAkua --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

bucketconfig.txt 檔案會指定組態,如下所示。

{"LocationConstraint": "sa-east-1"}

範例 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 AccountAAkua

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

範例 3:設定金鑰數上限

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