如何將跨帳户存取權授予在 Amazon S3 儲存貯體中的物件?

4 分的閱讀內容
0

我想要將其他 AWS 帳戶存取權授予在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的物件。

簡短說明

在 Amazon S3 中,您可以將跨帳戶存取權授予在其他帳戶中的使用者,使其可存取您在您的帳戶中擁有的物件。

根據您要提供的存取類型,使用下列其中一種方式將跨帳戶存取權授予物件:

  • 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 是您要授予物件存取權的帳戶。

  1. 在帳戶 A 中,建立 S3 儲存貯體

  2. 在帳戶 B 中,建立 IAM 使用者或角色

  3. GetObjectPutObject 許可授予帳戶 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 身分型政策。

  4. 設定帳戶 A 的儲存貯體政策,將 GetObjectPutObject 許可授予在帳戶 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 允許使用者僅定義 READWRITEREAD_ACPWRITE_ACPFULL_CONTROL 許可集。您僅能使用帳戶或其中一個預先定義的 Amazon S3 群組作為 Amazon S3 ACL 的承授者。您為帳戶指定電子郵件地址或正規使用者 ID 時,ACL 會套用至承授者帳戶中的所有身分。例如,您無法使用 ACL 來限制對個別 IAM 使用者或角色的存取權。您也無法將 ACL 套用至共用相同字首的不同物件。

**注意:**儲存貯體擁有者可能無法完全控制 ACL 承授者上傳的物件。這是因為 ACL 不支援 ACL 授權的 S3 操作的條件。

若要使用儲存貯體和物件 ACL 來管理 S3 儲存貯體存取權,請完成下列步驟:

  1. 在帳戶 B 中,建立 IAM 使用者或角色

  2. 將執行必要 Amazon S3 操作的許可授予角色或使用者。呼叫 PutObjectGetObject 的使用者必須具有資源型政策和 IAM 政策區段中列出的許可。

  3. 將儲存貯體 ACL 設定為至少包含帳戶 B 的 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

  4. 將物件 ACL 設定為至少包含帳戶 B 的 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 儲存貯體存取權,請完成下列步驟:

  1. 在帳戶 A 中,建立 IAM 角色

  2. 將執行必要 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 主控台以程式設計方式下載和上傳物件。如需詳細資訊,請參閱如何將 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/*"
            }
        ]
    }

    您還可以執行 create-policy AWS CLI 命令以建立 IAM 身分型政策。

  3. 將擔任您在帳戶 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 身分型政策。

  4. 從帳戶 B 中的角色,擔任帳戶 A 中的角色,以便帳戶 B 中的 IAM 身分可以執行必要的 S3 操作。 
    **注意:**您在帳戶 A 中擔任 IAM 角色時,Amazon S3 會根據存取政策來決定操作。IAM 角色可作為帳戶 A 中的本機 IAM 身分調用的 API 呼叫。不需要儲存貯體政策或跨帳戶存取權的 ACL。如需詳細資訊,請參閱 Amazon S3 的政策動作

相關資訊

Amazon S3 的動作、資源和條件索引鍵

Amazon S3 儲存貯體政策的範例

Amazon S3 的身分型政策範例

跨帳戶政策評估邏輯

AWS 官方
AWS 官方已更新 3 個月前