如何提供對 Amazon S3 儲存貯體中物件的跨帳戶存取權?
我想授權其他 AWS 帳戶存取 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的物件。
簡短描述
在 Amazon S3 中,您可以向其他 AWS 帳戶中的使用者授予精細的跨帳戶存取權,使其可存取您在您的帳戶中擁有的物件。
根據您想要提供的存取類型,使用下列其中一種解決方案授予對物件的跨帳戶存取權:
- AWS Identity and Access Management (IAM) 政策和資源型儲存貯體政策,用於僅以程式設計方式存取 S3 儲存貯體物件
- IAM 政策和資源型存取控制清單 (ACL),用於僅以程式設計方式存取 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 簡化並擴展共用資料集的存取管理。
解決方法
IAM 政策和資源型儲存貯體政策
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
若要管理跨帳戶存取權控制和稽核 S3 物件的許可,請使用資源型儲存貯體政策。在儲存貯體層級套用儲存貯體政策,以定義下列值:
- 主體元素: 誰可以存取儲存貯體內的物件
- 資源元素: 他們可以存取的物件
- 動作元素: 他們如何存取儲存貯體內的物件
在儲存貯體層級套用儲存貯體政策時,您可以定義儲存貯體內不同物件的精細存取權。您還可以檢閱儲存貯體政策,以查看誰可以存取 S3 儲存貯體中的物件。
若要使用儲存貯體政策來管理 S3 儲存貯體存取權,請完成下列步驟:
**注意:**在下列步驟中,帳戶 A 是您的帳戶,而帳戶 B 是您想要授予物件存取權的帳戶。
-
在帳戶 A 中,建立 S3 儲存貯體。
-
在帳戶 B 中,建立 IAM 角色或使用者。
-
為帳戶 B 中的 IAM 角色提供向特定儲存貯體下載 (GetObject) 和上傳 (PutObject) 物件的許可。使用 IAM 政策還可向帳戶 B 中的 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 儲存貯體中特定資料夾的存取權?您還可以使用 AWS CLI 命令 (create-policy) 建立 IAM 身分型政策。
-
設定帳戶 A 的儲存貯體政策,以向您在帳戶 B 中建立的 IAM 角色或使用者授予許可。使用此儲存貯體政策,向使用者授予對帳戶 A 擁有的儲存貯體中物件的 GetObject 和 PutObject 許可:
{ "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/*" ] } ] }
您還可以使用 AWS CLI 命令 put-bucket-policy 來建立 Amazon S3 儲存貯體政策。
注意:若要限制對特定儲存貯體資料夾的存取權,請在資源元素 (例如 "arn:aws:s3:::AccountABucketName/FolderName/*") 中定義資料夾名稱。在您使用有條件的 s3:PutObject 許可時,儲存貯體擁有者可以完全控制其他帳戶上傳的物件。PutObject API 呼叫會強制執行使用特定標頭的 ACL。
IAM 政策和資源型 ACL
您還可以使用物件 ACL 來管理特定案例的許可。如需詳細資訊,請參閱何時使用 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 不支援 ACL 授權的 S3 操作的條件。
若要使用儲存貯體和物件 ACL 來管理 S3 儲存貯體存取權,請完成下列步驟:
- 在帳戶 B 中,建立 IAM 角色或使用者。
- 向角色或使用者授予執行所需 Amazon S3 操作的許可。呼叫 PutObject 和 GetObject 的使用者必須具有資源型政策和 IAM 政策區段中列出的許可。
- 將儲存貯體 ACL 設定為至少包含帳戶 B 的 WRITE 許可。這可確保帳戶 B IAM 角色或使用者可以將物件上傳至帳戶 A 擁有的儲存貯體:
**注意:**若要尋找您的 CanonicalUserID,請參閱尋找 AWS 帳戶正規使用者 ID。...<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>
- 將物件 ACL 設定為至少包含帳戶 B 的 READ 許可。這可讓帳戶 B 中的 IAM 角色或使用者從帳戶 A 擁有的儲存貯體下載物件:
ACL 許可會根據套用 ACL 的 S3 資源、儲存貯體或物件而有所不同。如需詳細資訊,請參閱存取控制清單 (ACL) 概觀。在建立儲存貯體或將物件上傳至現有的儲存貯體時,設定儲存貯體和物件 ACL。如需詳細資訊,請參閱設定 ACL。...<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>
跨帳戶 IAM 角色
並非所有 AWS 服務都支援資源型政策。在將跨帳戶存取權提供給多項服務時,使用跨帳戶 IAM 角色以集中化許可管理。此方法允許跨帳戶存取其他帳戶或 AWS 服務擁有或上傳的物件。如果不使用跨帳戶 IAM 角色,您必須修改物件 ACL。如需詳細資訊,請參閱 Amazon S3 如何授權物件操作的請求。
若要使用跨帳戶 IAM 角色來管理 S3 儲存貯體存取權,請完成下列步驟:
- 在帳戶 A 中,建立 IAM 角色。
- 向角色授予執行所需 S3 操作的許可。在角色的信任政策中,向帳戶 B 中的角色或使用者授予擔任帳戶 A 中角色的許可:
**注意:**IAM 角色必須具有信任政策,該政策定義可以擔任該角色的主體,以及何時可以擔任這些角色。IAM 角色可以具有多項許可政策,這些政策定義擔任該角色的主體可以執行的許可,及其使用的資源。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB:user/AccountBUserName" }, "Action": "sts:AssumeRole" } ] }
您也可以執行 create-role AWS CLI 命令,以建立具有信任政策的角色。
下列存取政策允許擔任此角色的使用者透過 Amazon S3 主控台以程式設計方式下載和上傳物件。如需詳細資訊,請參閱如何向使用者授予對 Amazon S3 儲存貯體中特定資料夾的存取權?
**注意:**如果僅需以程式設計方式存取,您可以移除政策中的前兩個陳述式:
或者,執行 create-policy AWS CLI 命令以建立 IAM 身分型政策。{ "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/*" } ] }
- 向帳戶 B 中的 IAM 角色或使用者授予擔任您在帳戶 A 中建立的 IAM 角色的許可。您必須新增下列範例政策作為 IAM 使用者或角色的許可政策:
或者,執行 create-policy AWS CLI 命令以建立 IAM 身分型政策。{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA:role/AccountARole" } }
- 從帳戶 B 中的角色,擔任帳戶 A 中的角色,以便帳戶 B 中的 IAM 身分可以執行所需的 S3 操作。如需詳細資訊,請參閱切換至角色 (主控台)。
**注意:**當您在帳戶 A 中擔任 IAM 角色時,Amazon S3 會根據存取政策來決定操作。IAM 角色可作為帳戶 A 中的本機 IAM 身分調用的 API 呼叫。不需要儲存貯體政策或跨帳戶存取權的 ACL。如需詳細資訊,請參閱 Amazon S3 動作。
相關資訊
相關內容
- 已提問 9 個月前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前