ACL 的政策範例 - Amazon Simple Storage Service

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

ACL 的政策範例

您可以使用儲存貯體政策中的條件金鑰來控制對 Amazon S3 的存取。

授予 s3:具有要求存儲桶所有者獲得完全控制PutObject 權的條件的權限

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

假設帳戶 A 擁有一個儲存貯體,而帳戶管理員希望將上傳物件的許可授予帳戶 B 的使用者 Dave。根據預設,Dave 上傳的物件是為帳戶 B 所擁有,而帳戶 A 沒有這些物件的許可。因為付費的是儲存貯體擁有者,它希望有 Dave 上傳之物件的完整許可。帳戶 A 管理員只要將 s3:PutObject 許可授予 Dave,附帶要求包含 ACL 專屬標頭的條件,明確授予完整許可或指定使用固定的 ACL,即可完成此操作。如需詳細資訊,請參閱 PUT 物件

需要標 x-amz-full-control 頭

您可以指定要求中的 x-amz-full-control 標頭需要有儲存貯體擁有者的完全控制許可。下列儲存貯體政策授予使用者 Dave s3:PutObject 許可,附使用 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/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
注意

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

新增明確拒絕

前面的儲存貯體政策將條件式許可授予帳戶 B 的使用者 Dave。當此政策生效時,Dave 卻可能透過另一個政策無條件取得相同的許可。例如,Dave 可屬於某個群組,而您無條件授予該群組 s3:PutObject 許可。為避免此等許可漏洞,您可以新增明確拒絕,撰寫較嚴格的存取政策。在本例中,如果 Dave 在授予儲存貯體擁有者的完整許可要求中未包含必要標頭,您會明確拒絕他的使用者上傳許可。明確拒絕會取代任何其他已授予的許可。以下是已新增明確拒絕的修訂後存取政策範例。

{ "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) 來測試原則。您可以附加原則,並使用 Dave 的認證,使用下列 AWS CLI put-object命令來測試權限。您可以新增 --profile 參數,來提供 Dave 的憑證。您可以透過新增 --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

授予 s3:具有 x-amz-acl 標題條件的PutObject 權限

AWS 帳戶 如果請求包含使物件可公開讀取的x-amz-acl標頭,則下列儲存貯體政策會授與兩s3:PutObject者的權限。Condition 區塊使用 StringEquals 條件,而且有用於評估的金鑰/值對 "s3:x-amz-acl":["public-read"]。在此金鑰/值對中,s3:x-amz-acl 是 Amazon S3 專用金鑰,如字首 s3: 所示。

{ "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": [ "arn:aws:iam::Account1-ID:root", "arn:aws:iam::Account2-ID:root" ] }, "Action":"s3:PutObject", "Resource": ["arn:aws:s3:::awsexamplebucket1/*"], "Condition": { "StringEquals": { "s3:x-amz-acl":["public-read"] } } } ] }
重要

不是所有的條件都對所有動作有意義。例如,在授予 s3:CreateBucket Amazon S3 許可的政策中包含 s3:LocationConstraint 條件有意義。但在授予 s3:GetObject 許可的政策中包含此條件就沒意義。Amazon S3 可以測試這類涉及 Amazon S3 特定條件的語意錯誤。但是,如果您為 IAM 使用者或角色建立政策,但包含語意無效的 Amazon S3 條件,則不會回報任何錯誤,因為 IAM 無法驗證 Amazon S3 條件。