【问题标题】:S3 cross account access: Reading an object in own bucket, written by another accountS3跨账户访问:读取自己存储桶中的对象,由另一个账户写入
【发布时间】:2017-08-21 21:06:16
【问题描述】:

背景:

我有两个帐户 AB。账户A 拥有一个桶my-bucket。我已授予帐户 B 访问此存储桶的权限 - 帐户 B 可以从该存储桶读取对象并将对象写入此存储桶。这按预期工作。

但是,帐户A 只能读取my-bucket 中它自己编写的那些对象。虽然它甚至可以列出帐户B 写入的那些对象,但它无法读取这些对象。

下面是我尝试使用 AWS CLI 和账户 A 的 AWS 配置从 my-bucket 下载所有对象时看到的内容。

download: s3://my-bucket/PN1492646400000.csv to tp/PN1492646400000.csv
download: s3://my-bucket/PN1491264000000.csv to tp/PN1491264000000.csv
download: s3://my-bucket/PN1493942400000.csv to tp/PN1493942400000.csv
download failed: s3://my-bucket/PN1503346865232.csv to tp/PN1503346865232.csv An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
download: s3://my-bucket/PN1495389670000.csv to tp/PN1495389670000.csv
download: s3://my-bucket/PN1496685403000.csv to tp/PN1496685403000.csv
download: s3://my-bucket/PN1497945130000.csv to tp/PN1497945130000.csv
download: s3://my-bucket/PN1500508800000.csv to tp/PN1500508800000.csv

正如大家所见,我可以下载所有文件,但PN1503346865232.csv(这是B 帐户使用java 方法putObject 编写的)。

到目前为止我尝试了什么:

我研究了以下两个问题:

  1. Amazon S3 file 'Access Denied' exception in Cross-Account:其中一条评论要求用acl 做一个putObject,但没有指定acl 是什么。
  2. S3: User cannot access object in his own s3 bucket if created by another user:这是关于阻止帐户 B 将对象放入 my-bucket 而不授予所有权访问权限。 仅设置此约束是否有助于我获得完全访问权限?

这就是我在将对象放入 java 代码时尝试放入 ACL 的方式。

AccessControlList acl = new AccessControlList();
acl.grantPermission(new CanonicalGrantee(S3_BUCKET_OWNER_ID), Permission.FullControl);
PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUCKET, remoteCleanedPrismFilename, fileStream, null)
                        .withAccessControlList(acl);
s3Client.putObject(putObjectRequest);

它抛出异常说:com.amazonaws.services.s3.model.AmazonS3Exception: Invalid id

问题:

  1. 我想知道我应该如何获得这个 ID。它不是 aws 帐户 ID,即 10-12 位数字吗?
  2. 即使我找到了这个ID,也会给这个ACL和bucket-owner-full- control一样的吗?

【问题讨论】:

    标签: java amazon-web-services amazon-s3


    【解决方案1】:

    这篇文章获得了如此多的浏览量,但没有一个答案!

    为了帮助其他人,我发布了一些我迄今为止从研究中发现的解决方法。在这些变通方法之后,帐户A 能够访问帐户B 创建的对象。

    在帐户B 中运行的java 代码中,我在要创建的对象上显式设置了ACL。

    AccessControlList acl = new AccessControlList();
    acl.grantPermission(new CanonicalGrantee(S3_BUCKET_OWNER_ID), Permission.FullControl);
    PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUCKET, remoteCleanedPrismFilename, fileStream, null)
                            .withAccessControlList(acl);
    s3Client.putObject(putObjectRequest);
    

    这里S3_BUCKET_OWNER_ID 是帐户A 的规范ID。请注意,这不是我们知道的 AWS 账户 ID,我不知道比以下更好的方法来找到它

    aws s3api get-object-acl --bucket my-bucket --key PN1491264000000.csv --output text --profile accountA
    

    在我看来,这仍然不是一个优雅的解决方案,我相信存在更好的解决方案。一旦我找到更好的东西,我会编辑这个答案。

    编辑:

    桶拥有者的规范ID可以更优雅地找到如下:

    String s3BucketOwnerId = s3Client.getBucketAcl(S3_BUCKET).getOwner().getId();
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2023-03-17
      • 2020-06-24
      • 2020-07-05
      • 2021-12-07
      • 2021-04-25
      • 2020-11-28
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多