跳至内容

如何向另一个 AWS 账户中的用户授予将对象上传到我的 Amazon S3 存储桶的权限?

2 分钟阅读
0

我想授予另一个 AWS 账户中的 AWS Identity and Access Management (IAM) 用户访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶的权限。另外,我还想授予跨账户访问权限,以便该用户将对象上传到我的 Amazon S3 存储桶。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

要向另一个账户中的用户授予将对象上传到 S3 存储桶的访问权限,请更新该用户或其账户的 IAM 策略。最佳做法是通过账户控制访问权限,同时使用存储桶所有者强制执行的对象所有权

如果您的存储桶使用访问控制列表 (ACL) 而非存储桶所有者强制执行的所有权,请考虑使用 Amazon S3 配置 BucketOwnerEnforced,该配置会关闭 ACL。使用以下 get-bucket-ownership-controls 命令,检查您的存储桶是否使用 ACL:

aws s3api get-bucket-ownership-controls --bucket DOC-EXAMPLE-BUCKET

**注意:**将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

如果输出显示 BucketOwnerPreferred 或 ObjectWriter 而非 BucketOwnerEnforced,则表示您的存储桶使用 ACL。跨账户上传的对象归上传者所有,而非存储桶所有者。

存储桶所有者强制执行的对象所有权

要在账户级别授予对存储桶的访问权限,请使用存储桶所有者强制执行的对象所有权。请按照以下步骤,向账户 A 中的 IAM 用户授予向账户 B 中的 S3 存储桶上传对象的权限:

  1. 在账户 A 中,为需要访问账户 B 的存储桶的用户创建 IAM 策略:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",  
            "s3:ListBucket",  
            "s3:GetBucketLocation"
          ],
          "Resource": [
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
          ]
        }
      ]
    }

    **注意:**将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

  2. 从账户 A 中获取 IAM 用户的 Amazon 资源名称 (ARN)

  3. 从账户 B 中创建存储桶策略,向跨账户用户授予上传对象的权限:

    {
      "Version": "2012-10-17",
      "Statement": [
          {  
              "Sid": "CrossAccountUploadAccess",  
              "Effect": "Allow",  
              "Principal": {  
                  "AWS": "arn:aws:iam::111122223333:user/UploadData"  
              },  
              "Action": [  
                  "s3:PutObject"  
              ],  
              "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
          },  
          {  
              "Sid": "CrossAccountListAccess",  
              "Effect": "Allow",  
              "Principal": {  
                  "AWS": "arn:aws:iam::111122223333:user/UploadData"  
              },  
              "Action": [  
                  "s3:ListBucket",  
                  "s3:GetBucketLocation"  
              ],  
              "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"  
          }  
        ]
    }

    **注意:**对于 Principal(主体)的值,请务必在账户 A 中输入 IAM 用户的 ARN。请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。

ACL 强制执行的对象所有权

要为使用 ACL 强制执行的对象所有权的存储桶授予访问权限,请在存储桶策略和 IAM 用户策略中授予 PutObjectAcl 权限。

  1. 从账户 A 中,向 IAM 用户附加策略。该策略必须允许用户在账户 B 中的存储桶上运行 PutObjectPutObjectAcl 操作:

    {    
      "Version": "2012-10-17",  
      "Statement": [  
        {  
          "Effect": "Allow",  
          "Action": [  
            "s3:PutObject",  
            "s3:PutObjectAcl",  
            "s3:ListBucket",  
            "s3:GetBucketLocation"  
          ],  
          "Resource": [  
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET",  
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
          ]  
        }  
      ]  
    }

    **注意:**在为上传指定 ACL 之前,您必须拥有 s3:PutObjectAcl 权限。否则,当您上传带有 ACL 的对象(例如bucket-owner-full control ACL)时,您会收到访问遭拒错误。

  2. 从账户 B 中,附加存储桶策略,向账户 A 中的 IAM 用户授予运行 s3:PutObject and s3:PutObjectAcl 操作的权限:

    {  
      "Version": "2012-10-17",  
      "Statement": [  
          {  
              "Sid": "DelegateS3ObjectAccess",  
              "Effect": "Allow",  
              "Principal": {  
                  "AWS": "arn:aws:iam::999999999999:user/UploadData"  
              },    
              "Action": [  
                  "s3:PutObject",  
                  "s3:PutObjectAcl"  
               ],  
              "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
          },  
          {  
              "Sid": "DelegateS3BucketAccess",  
              "Effect": "Allow",  
              "Principal": {  
                  "AWS": "arn:aws:iam::111122223333:user/UploadData"  
              },  
                "Action": [  
                    "s3:ListBucket",  
                    "s3:GetBucketLocation"  
                ],  
                "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"  
            }  
        ]  
    }

相关信息

示例 2: 存储桶拥有者授予跨账户存储桶权限

AWS 官方已更新 5 个月前