如何將跨帳户存取權授予在 Amazon S3 儲存貯體中的物件?
我想要將其他 AWS 帳戶存取權授予在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的物件。
簡短描述
身為帳戶管理員,您可以將跨帳戶存取權授予在其他帳戶中的使用者,使其可存取您在帳戶中擁有的物件。
您可以授予不需要完全管理存取權限的特定 S3 資源權限。
使用下列其中一種方法授予跨帳戶對物件的存取權:
- AWS Identity and Access Management (IAM) 政策和資源型儲存貯體政策,僅適用於以程式設計方式存取 S3 儲存貯體物件。
- IAM 政策和資源型存取控制清單 (ACL),僅適用於以程式設計方式存取 S3 儲存貯體物件。
注意:當您啟用儲存貯體擁有者強制執行設定時,Amazon S3 會停用所有儲存貯體和物件 ACL。因此,您無法使用 ACL 授予跨帳戶存取權。預設情況下,所有新建立的儲存貯體均已啟用儲存貯體擁有者強制執行功能。若要管理跨帳戶存取權,最佳做法也是使用 IAM 政策和儲存貯體政策,而不是 ACL。如需詳細資訊,請參閱控制物件的擁有權和停用儲存貯體的 ACL。 - 跨帳戶 IAM 角色,適用於以程式設計方式和主控台存取 S3 儲存貯體物件。
如果請求者是 IAM 角色主體,則擁有主體的帳戶必須使用 IAM 政策來授予 S3 儲存貯體權限。根據您的使用案例,儲存貯體擁有者還必須使用儲存貯體政策或 ACL 來授予權限。授予存取權之後,以程式設計方式的跨帳戶儲存貯體存取權與帳戶儲存貯體存取權相同。
如需 Amazon S3 Access Points 或 AWS Key Management Service (AWS KMS) 的跨帳户存取權,需要其他的組態。如需詳細資訊,請參閱為什麼跨帳戶使用者在嘗試存取我使用 AWS KMS 客戶自管金鑰加密的 S3 物件時,會收到拒絕存取錯誤?
對於必須作為跨帳戶物件存取的大型資料集,最佳做法是使用 S3 Access Points。如需詳細資訊,請參閱使用跨帳戶 Amazon S3 Access Points 簡化並擴展共用資料集的存取管理。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
在下列程序中,帳戶 A 是您的帳戶,而帳戶 B 是您要授予物件存取權的帳戶。
IAM 政策和資源型儲存貯體政策
若要管理跨帳戶存取權和稽核 S3 物件的權限,請使用資源型儲存貯體政策。
在儲存貯體層級套用儲存貯體政策,該政策定義了主體、資源和動作元素。 套用儲存貯體層級的儲存貯體政策時,您可以定義儲存貯體內不同物件的存取權。您還可以檢閱儲存貯體政策,以查看誰可以存取 S3 儲存貯體中的物件。
若要使用儲存貯體政策來管理 S3 儲存貯體存取權,請完成下列步驟:
-
在帳戶 A 中,建立 S3 儲存貯體。
-
在帳戶 B 中,建立 IAM 使用者或角色。
-
將 GetObject 和 PutObject 權限授予帳戶 B 中的 IAM 使用者或角色。此外,將許可授予 IAM 使用者或角色,以呼叫將物件許可授予儲存貯體擁有者的 PutObjectAcl:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::AccountABucketName/*" } ] }注意:在上述政策中,將範例值替換為您的使用者值。
您還可以限制帳戶 A 中特定儲存貯體資料夾的存取權。若要限制存取權,請在資源元素 (例如 "arn:aws:s3:::AccountABucketName/FolderName/*") 中定義資料夾名稱。如需詳細資訊,請參閱如何將 Amazon S3 儲存貯體中特定資料夾的存取權授予使用者?您還可以執行 create-policy AWS CLI 命令,以建立 IAM 身分型政策。 -
設定帳戶 A 的儲存貯體政策,將 GetObject 和 PutObject 許可授予在帳戶 B 中建立的 IAM 使用者或角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB:user/AccountBUserName" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::AccountABucketName/*" ] } ] }您還可以執行 put-bucket-policy AWS CLI 命令,以建立 S3 儲存貯體政策。
若要限制特定儲存貯體資料夾的存取權,請在資源元素 (例如 "arn:aws:s3:::AccountABucketName/FolderName/*") 中定義資料夾名稱。當您使用具有條件索引鍵的 s3:PutObject 權限時,儲存貯體擁有者可以完全控制其他帳戶上傳的物件。PutObject API 呼叫會強制執行使用特定標頭的 ACL。
IAM 政策和資源型 ACL
您還可以對特定案例使用物件 ACL 來管理許可。
Amazon S3 ACL 僅允許使用者定義 READ、WRITE、READ_ACP、WRITE_ACP 和 FULL_CONTROL 權限集。您僅能使用帳戶或其中一個預先定義的 Amazon S3 群組作為 Amazon S3 ACL 的承授者。您為帳戶指定電子郵件地址或正規使用者 ID 時,ACL 會套用至承授者帳戶中的所有身分。例如,您無法使用 ACL 來限制對個別 IAM 使用者或角色的存取權。您也無法將 ACL 套用至共用相同首碼的不同物件。
注意:ACL 不支援 ACL 授權的 S3 作業條件。儲存貯體擁有者可能無法完全控制 ACL 承授者上傳的物件。
若要使用儲存貯體和物件 ACL 來管理 S3 儲存貯體存取權,請完成下列步驟:
-
在帳戶 B 中,建立 IAM 使用者或角色。
-
將執行必要 Amazon S3 操作的許可授予角色或使用者。呼叫 PutObject 和 GetObject 的使用者必須具有資源型政策和 IAM 政策區段中列出的權限。
-
將儲存貯體 ACL 設定為至少包含帳戶 B 的 WRITE 權限。WRITE 權限允許帳戶 B 的 IAM 使用者或角色將物件上傳到帳戶 A 擁有的儲存貯體:
...<AccessControlPolicy> <Owner> <ID> AccountACanonicalUserID </ID> <DisplayName> AccountADisplayName </DisplayName> </Owner> <AccessControlList> ... <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"> <ID> AccountBCanonicalUserID </ID> <DisplayName> AccountBDisplayName </DisplayName> </Grantee> <Permission> WRITE </Permission> </Grant> ... </AccessControlList> </AccessControlPolicy>**注意:**若要尋找您的 CanonicalUserID,請參閱尋找 AWS 帳戶正規使用者 ID。
-
將物件 ACL 設定為至少包含帳戶 B 的 READ 權限。READ 權限允許帳戶 B 中的 IAM 角色或使用者從帳戶 A 擁有的儲存貯體下載物件:
...<AccessControlPolicy> <Owner> <ID> AccountACanonicalUserID </ID> <DisplayName> AccountADisplayName </DisplayName> </Owner> <AccessControlList> ... <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"> <ID> AccountBCanonicalUserID </ID> <DisplayName> AccountBDisplayName </DisplayName> </Grantee> <Permission> READ </Permission> </Grant> ... </AccessControlList> </AccessControlPolicy>
ACL 權限會根據您套用 ACL 的 S3 資源、儲存貯體或物件而有所不同。如需詳細資訊,請參閱存取控制清單 (ACL) 概觀。建立儲存貯體或將物件上傳至現有的儲存貯體時,設定儲存貯體和物件 ACL。
跨帳戶 IAM 角色
並非所有 AWS 服務都支援資源型政策。當您提供對多個服務的跨帳戶存取權時,請使用跨帳戶 IAM 角色來集中權限管理。此方法允許跨帳戶存取另一個帳戶或 AWS 服務擁有或上傳的物件。如果不使用跨帳戶 IAM 角色,您必須修改物件 ACL。如需詳細資訊,請參閱 Amazon S3 如何授權物件操作的請求。
若要使用跨帳戶 IAM 角色來管理 S3 儲存貯體存取權,請完成下列步驟:
-
在帳戶 A 中,建立 IAM 角色。
-
將執行必要 S3 操作的許可授予角色。在角色的信任政策中,將在帳戶 A 中擔任角色的許可授予帳戶 B 中的使用者或角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB:user/AccountBUserName" }, "Action": "sts:AssumeRole" } ] }**注意:**IAM 角色必須具有信任政策,該政策定義可以擔任該角色的主體,以及何時可以擔任這些角色。IAM 角色可以具有多項權限政策,這些政策會定義擔任該角色的主體可以執行的權限,及其使用的資源。
您還可以執行 create-role AWS CLI 命令,以建立具有信任政策的角色。
下列存取政策允許擔任此角色的使用者使用 Amazon S3 主控台,以程式設計方式下載和上傳物件。如果您只需要以程式設計方式存取,您可以移除政策中的前兩個陳述式:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListAllMyBuckets" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::AccountABucketName" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::AccountABucketName/*" } ] }如需詳細資訊,請參閱如何將 Amazon S3 儲存貯體中特定資料夾的存取權授予使用者?您還可以執行 create-policy AWS CLI 命令,以建立 IAM 身分型政策。
-
將擔任您在帳戶 A 中建立的 IAM 角色的權限授予帳戶 B 中的 IAM 角色或使用者。您必須新增下列政策作為 IAM 使用者或角色的權限政策:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA:role/AccountARole" } }您還可以執行 create-policy AWS CLI 命令,以建立 IAM 身分型政策。
-
從帳戶 B 中的角色,擔任帳戶 A 中的角色,以便帳戶 B 中的 IAM 身分可以執行必要的 S3 作業。
**注意:**您在帳戶 A 中擔任 IAM 角色時,Amazon S3 會根據存取政策來決定作業。IAM 角色可作為帳戶 A 中的本機 IAM 身分調用的 API 呼叫。不需要儲存貯體政策或跨帳戶存取權的 ACL。如需詳細資訊,請參閱 Amazon S3 的政策動作。
相關資訊
相關內容
- 已提問 2 年前
- 已提問 1 年前

