【问题标题】:IAM User in account A, S3 bucket in account B账户 A 中的 IAM 用户,账户 B 中的 S3 存储桶
【发布时间】:2017-07-21 17:35:33
【问题描述】:

我们在账户 A 中有一个启用了 ServerSideEncryption 的 S3 存储桶,我们在账户 B 中有一个 IAM 用户,我们授予对该存储桶的访问权限。我遇到的问题是如何让用户能够解密存储桶内的对象,而无需为其分配账户 A 中的角色来承担。是否可以仅通过使用存储桶策略来完成?

【问题讨论】:

  • 服务器端加密的哪种变体(SSE-KMS、SSE-C 或 SSE-S3)?
  • 我们使用的是S3(SSE-S3),日志全部来自cloudtrail,所以默认
  • SSE-S3 对用户是透明的。 SSE-S3 是关于使用 AWS 提供的密钥进行静态加密。 S3 在写入时自动加密,在读取时自动解密。这些 S3 对象的使用者不需要了解任何有关加密的信息。
  • 我遇到的问题是拥有存储桶的帐户之外的 IAM 用户,这并不容易:link 如您所见,我可以看到数据,但是当我说查看属性:link
  • 这份文件有帮助吗? (docs.aws.amazon.com/AmazonS3/latest/dev/…)

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


【解决方案1】:

来自 AWS 支持: 谢谢你今天和我聊天。据我了解,您有一个跨账户场景,您的预期被授权者无法访问存储在源存储桶中的对象。经过进一步考虑,我倾向于建议下面的选项 #3,以便以最少的管理开销满足您的要求。

您有以下设置(保持通用以符合跨账户支持限制):

账户 A - 上传者账户(AWS Cloudtrail 服务账户)账户 B - 存储桶所有者账户 C - 目标账户/IAM 用户

在这种情况下,账户 C 无法访问对象,即使存储桶拥有者拥有完全控制权,这与 S3 中的以下默认行为有关:

  • S3 将对象的所有者 ID 设置为执行 PUT 请求的帐户。默认情况下,在对象上设置的唯一 ACL 是所有者(上传者)的“完全控制”。如果添加了标准 ACL 'bucket-owner-full-control',则存储桶所有者可以将此权限委托给其自己的 IAM 用户,但它仍然不拥有该对象。如果将 Cloudtrail 日志上传到任何给定存储桶,则存储桶所有者将被添加为具有完全控制权的对象 ACL 中的被授权者,但如上所述,它不是对象所有者。账户 A 拥有该对象。

  • 您不能使用存储桶策略与账户 C 共享数据,因为存储桶策略只能影响您拥有的对象。

有几种不同的方法可以纠正或减轻这种行为。首先,您可以执行以下操作之一来更正现有对象的问题:

1) 以帐户 B 中的用户身份覆盖它们,以将 ownerID 设置为正确的值。这可以使用 AWS CLI Tool 之类的工具来完成。

例如: aws s3 cp s3://aplptrails/master/AWSLogs/005670278797/CloudTrail/us-east-1/2017/07/21/005670278797_CloudTrail_us-east-1_20170721T0000Z_2WJSxO6C1Hmvg6Is.json.gz s3://aplptrails702787/AWSLogs9/06/AWSLogs CloudTrail/us-east-1/2017/07/21/005670278797_CloudTrail_us-east-1_20170721T0000Z_2WJSxO6C1Hmvg6Is.json.gz --storage-class 标准

注意:--recursive 参数可用于遍历整个前缀。

问题是这是一个一次性的过程,所以任何新写入的文件仍然会有相同的权限问题。

2) 账户 B 可以对每个对象执行 PUT Object acl 操作,以包括对账户 C 的授权。在 AWS CLI 中,命令 [1] 可能如下所示:

aws s3api put-object-acl --bucket aplptrails --key master/AWSLogs/005670278797/CloudTrail/us-east-1/2017/07/21/005670278797_CloudTrail_us-east-1_20170721T0000Z_2WJSxO6C1Hmvg6Is.json.gz --grant-完全控制 emailaddress=user1@example.com --grant-read emailaddress=user2@example.com

上例中“emailaddress”的值将是账户 B 和账户 C 的主要电子邮件地址。您还可以替换每个账户的规范用户 ID,例如:--grant-full-control id= .可以通过运行“aws s3api get-bucket-acl --bucket”来检索任何给定帐户的规范 ID。

3) 在账户 B 中创建一个角色,为其分配访问相关 S3 存储桶的权限,并授予账户 C 代入该角色的权限。以下演练概述了此过程:https://urldefense.proofpoint.com/v2/url?u=http-3A__docs.aws.amazon.com_AmazonS3_latest_dev_example-2Dwalkthroughs-2Dmanaging-2Daccess-2Dexample4.html&d=DwICaQ&c=dbNN4u5swSMqErirwbKEcvcubeovAzUWne5MYBi0r7Y&r=sg0v1cuQBLPlmbnAW-j8tYGo_hZ8sJMOUwPgykG-0X5DSDm5TvADprofgHg5KINt&m=4l2Fw6GuW_vLHvMERYZ-LiPffMUTqeY2G6ozGiH32TA&s=Mw5PbQwnx8CG-xzPstZLGP92kxlCWYhYWtUrATOzsII&e=

未来的另一个选择是创建一个 S3 事件通知来触发新 PUT 的 Lambda 函数;然后 Lambda 函数将自动执行覆盖副本(并有效地“取得所有权”)。这里的示例 Lambda 函数在执行复制操作之前首先检查对象的所有权,以免导致无限循环:https://urldefense.proofpoint.com/v2/url?u=https-3A__gist.github.com_williamtsoi1_104531c65852a852399a3dc1096a2dcc&d=DwICaQ&c=dbNN4u5swSMqErirwbKEcvcubeovAzUWne5MYBi0r7Y&r=sg0v1cuQBLPlmbnAW-j8tYGo_hZ8sJMOUwPgykG-0X5DSDm5TvADprofgHg5KINt&m=4l2Fw6GuW_vLHvMERYZ-LiPffMUTqeY2G6ozGiH32TA&s=QXSuAXdXpxSMYBZrW0cLzMPe99HgSKHkIJ0G_nO3QEg&e=

【讨论】:

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