服务
关于
CloudProse博客

2018年7月27日,星期五

访问管理是任何企业IT基础架构安全的关键属性。 Amazon Web 服务(AWS)提供了多种工具来解决访问管理。拥有各种各样的可用选项可以为客户提供灵活性和敏捷性,但是由于有时不清楚这些访问管理服务如何交互,因此还可能增加混乱。具体来说,S3访问管理可能会变得非常压倒性。对象ACL,存储桶ACL,IAM策略,存储桶策略,存储桶所有权和对象所有权都会影响谁有权访问存储在S3中的对象,并且不清楚它们如何交互。

与s3权限进行交互时, 此AWS博客文章 我的主要目的是对三种访问控制(IAM策略,存储桶策略,ACL)之间的交互有一个基本的了解,但是并不能涵盖所有用例,尤其是它没有提到对象所有者可以对访问控制产生影响。权限。

为了使s3权限更加清晰,我们创建了一个脚本来测试IAM策略,存储桶策略,对象所有者和ACL的所有相关组合。结果汇总在该帖子末尾的表格中。

方法

For simplicity we only looked at the GetObject api operation. We created multiple buckets in one account, each with a different bucket policy. In each bucket, we created multiple objects with different object owners and ACLs. We created IAM users in two seperate accounts (one account also holds the bucket) to test cross account access. We created objects owned by three accounts (two of the 预先viously mentioned accounts and a third because sometimes objects are owned by an AWS controlled account, billing reports and some access logs are notable examples of this). We used three IAM policies: one with an explicit 拒绝, one with an explicit 允许, and one with no policy. (Policy statements are detailed at the end). We also had four bucket policies: one with no policy, one with an explicit 拒绝 for everyone, one that 允许ed access to everyone, and one that 允许ed access to either of the two user accounts. Again, policies are detailed a the end of the post. We set four different object ACLs: 私人的, 公众阅读, 认证读, and 桶拥有者阅读. We initially started with different bucket ACLs but they had no effect (since we only test the GetObject api). Thus they are not included in the results. Finally, we also made unauthenticated get requests for each of the objects.

The table shows the results every combination of the above resources: every combination of AWS account and IAM policy made a getObject call on every combination of bucket policy, object acl, and object owner.

强调

  • 存储桶ACL对获取对象调用成功或失败没有影响。
  • 拒绝存储区策略或拒绝用户策略-即使对象具有公共ACL,也始终无权访问。
  • 仅当对象所有者与存储桶所有者相同时,各种允许存储桶策略才适用。
  • 对象所有者可以对权限产生影响。

结果

结果记录在下表中。在适当的情况下,我们使用通配符来减少结果。

符号含义
*给定列的任何可能值
!值给定列的任何可能值(给定VALUE除外)

结果表

This first table demonstrates how 拒绝 policies completely 拒绝 access, regardless of other factors.

用户帐号用户政策铲斗政策对象所有者帐户对象ACL来电者自来水桶呼叫者拥有的对象值区拥有者拥有的物件可以访问
**拒绝*****拒绝访问
*拒绝******拒绝访问

该表显示了从第一个帐户(与存储桶所有者相同的帐户)发出的调用。

用户帐号用户政策铲斗政策对象所有者帐户对象ACL来电者自来水桶呼叫者拥有的对象值区拥有者拥有的物件可以访问
第一场允许! 拒绝*!私人的**成功
第一场允许! 拒绝第一场私人的成功
第一场允许*第二档私人的没有 没有 拒绝访问
第一场没有允许任何第一场*成功
第一场没有允许任何第二档!私人的没有 没有 成功
第一场没有允许任何第二档私人的没有 没有 拒绝访问
第一场没有允许呼叫帐户或无第一场认证读或公共读成功
第一场没有允许呼叫帐户或无第一场存储桶所有者读取或私有拒绝访问
第一场没有允许呼叫帐户或无第二档*没有 没有 拒绝访问

该表显示了从第二个帐户发出的呼叫,该呼叫演示了跨帐户访问。

用户帐号用户政策铲斗政策对象所有者帐户对象ACL来电者自来水桶呼叫者拥有的对象值区拥有者拥有的物件可以访问
第二档允许! 拒绝第二档*没有 没有 成功
第二档允许允许任何 OR 允许呼叫帐户第一场*没有 没有 成功
第二档允许允许任何 OR 允许呼叫帐户第三步认证读或公共读没有 没有 没有 成功
第二档允许允许任何 OR 允许呼叫帐户第三步存储桶所有者读取或私有没有 没有 没有 拒绝访问
第二档允许没有第一项或第三项认证读或公共读没有 没有 成功
第二档允许没有第一项或第三项存储桶所有者读取或私有没有 没有 拒绝访问
第二档没有! 拒绝第二档认证读或公共读没有 没有 成功
第二档没有! 拒绝第二档存储桶所有者读取或私有没有 没有 拒绝访问
第二档没有*第一场*没有 没有 拒绝访问
第二档没有*第三步*没有 没有 没有 拒绝访问

下表显示了未经身份验证的用户发出的呼叫。

用户帐号用户政策铲斗政策对象所有者帐户对象ACL来电者自来水桶呼叫者拥有的对象值区拥有者拥有的物件可以访问
取消验证用户没有! 拒绝*公众阅读没有 没有 *成功
取消验证用户没有允许任何第一场*没有 没有 成功
取消验证用户没有允许任何第二档!公众阅读没有 没有 没有 拒绝访问
取消验证用户没有允许呼叫帐户*!公众阅读没有 没有 *拒绝访问
取消验证用户没有没有*!公众阅读没有 没有 *拒绝访问

资源说明

以下是我们用于每个列的可能值。

用户帐号

  • 第一场:这表明呼叫者与s3存储桶在同一帐户中。
  • 第二档:这表明呼叫者与s3存储桶使用的帐户不同,因此发出了跨帐户请求。
  • 取消验证用户:这表示进行了未经身份验证的呼叫。

用户政策

  • 允许“声明”:[{“效果”:“允许”,“动作”:“ s3:GetObject”,“资源”:“ *”}]
  • 拒绝<pre><code>“声明”:[{“效果”:“拒绝”,“动作”:“ s3:GetObject”,“资源”:“ *”}</code></pre>

    ]

  • 无-没有附加的IAM策略。

值区ACL

  • 我们发现存储桶ACL对呼叫是否成功没有影响。

铲斗政策

  • 没有 - There is no bucket policy affecting the GetObject operation (there is a base bucket policy affecting the put operation).
  • 允许任何<pre><code>{“ Sid”:“允许任何主体s3 getObject”,“ Effect”:“允许”,“ Principal”:“ *”,“ Action”:[“ s3:GetObject”],“ Resource”:[“ arn:aws :s3 ::: *“]}</code></pre>
  • 允许呼唤account_statement<pre><code>{“ Sid”:“允许s3获取对象”,“ Effect”:“允许”,“ Principal”:{“ AWS”:[“ arn:aws:iam :: 1stAcctNumber:root”,“ arn:aws:iam: :2ndAcctNumber:root“]},” Action“:[” s3:GetObject“],” Resource“:[” arn:aws:s3 ::: *“]}</code></pre>
  • 拒绝
    { "Sid":"Deny s3 get object", "Effect":"Deny", "Principal": "*", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::*"]}

对象所有者帐户

  • 第一场:对象与存储桶属于同一帐户
  • 第二档:对象由拥有用于交叉帐户请求的用户的同一帐户帐户拥有
  • 第三步:对象由不同于存储桶帐户和交叉帐户的帐户拥有

对象ACL(这些只是AWS提供的固定ACL)

  • 私人的
  • 公众阅读
  • 认证读
  • 桶拥有者阅读

脚本+完整结果

Every possible combination of these features were tested in the script. The 码 and the complete, unreduced results can be found 这里.

作者
布伦登·贾德森(Brenden Judson)Trek10
布伦登·贾德森(Brenden Judson)