我们在帐户A中有一个S3存储桶,启用了ServerSideEncryption,我们在帐户B中有一个IAM用户,我们可以访问该存储桶。我遇到的问题是如何让用户能够解密存储桶中的对象,而无需在帐户A中为其分配角色。是否可以通过使用存储桶策略来实现?
答案 0 :(得分:0)
来自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:// aplptrails / master / AWSLogs / 005670278797 / CloudTrail / us-east-1/2017/07/21 / 005670278797_CloudTrail_us-east-1_20170721T0000Z_2WJSxO6C1Hmvg6Is.json.gz --storage-class STANDARD
注意:--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 =。任何给定帐户的规范ID都可以通过运行' aws s3api get-bucket-acl --bucket'来检索。
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=