如何拒绝AWS账户的s3存储桶访问

时间:2017-12-05 12:46:54

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

我有一个ID为11111的AWS账户,我想拒绝访问存储桶所属的同一账户的s3存储桶的某些部分,即使访问该对象的角色具有完全的s3访问权限。

据我了解,在s3存储桶策略上设置DENY规则应该这样做,所以我尝试了下面的s3策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::111111:root" }, "Action": [ "s3:PutObject", "s3:GetObjectVersion", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::mybucket/production/*" ] } ] }

然而,与s3存储桶位于同一帐户的ec2计算机具有允许完全访问存储桶(s3:*)的iam角色,仍可以写入/读取mybucket/production/*

我错过了什么吗? DENY桶规则不应该优先吗?如何处理这种情况?我想避免必须从ec2角色中删除完整访问权限,而是能够否认这一点。

4 个答案:

答案 0 :(得分:1)

我相信以下内容正在进行中:

1>帐户111111拥有S3桶和IAM实体(在这种情况下是IAM角色)。

2 - ;由于请求来自同一帐户(存储桶拥有者)中的IAM角色,因此S3只会检查“User Context”。

3>在评估“用户上下文”时,S3会考虑: *附加到IAM角色的政策 *铲斗政策 *存储桶和对象ACL(如果有)

4>通过IAM角色的权限策略允许该请求,并且IAM角色没有明确的拒绝,因为存储桶策略中的Principal实际上是"Root User"而不是覆盖111111帐户中的IAM实体,因为两个帐户(存储桶)所有者和111111)是一样的。

我测试了这个并使用类似的策略,我的Root用户无法删除或将对象上传到存储桶中。但是,root可以通过删除存储桶策略来获取访问权限。

正如@John Hanley所提到的,您可以使用IAM角色作为委托人来拒绝生产“文件夹”中的访问权限,但由于该角色具有S3fullaccess,它可以删除存储桶策略,因此我建议拒绝该功能

答案 1 :(得分:0)

我实际上没有测试过这个。

您的S3策略限制了IAM用户的访问权限。您的目标是限制服务和/或服务所承担的角色的访问权限。

要拒绝访问所有EC2实例,请添加其他规则并将主体指定为(或添加到现有的Principal条目中):

"Principal": {"Service": "ec2.amazonaws.com"}

限制对EC2假定的特定角色的访问:

"Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }

答案 2 :(得分:0)

看看这是否有效。由于您提供完全访问权限,因此您需要明确拒绝访问权限。如果不允许用户使用用户或不允许角色,则以下策略表示拒绝访问。这还应该防止未授权的用户/角色删除存储桶策略。我还没有测试过它。

{
                "Id": "DenyAllAllowOnlyOne",
                "Statement": [
                        {
                                "Action": "s3:*",
                                "Effect": "Deny",
                                "NotPrincipal": {
                                        "AWS": [
                                    "arn:aws:iam::111111:user/alloweduser",
                                    "arn:aws:iam::111111:role/allowedrole"

                                        ]
                                },
                                "Resource": [
                                        "arn:aws:s3:::mybucket/production",
                                        "arn:aws:s3:::mybucket/production/*"
                                ]
                        }
                ],
                "Version": "2012-10-17"
        }

答案 3 :(得分:0)

我遇到了同样的问题,还没有确定为什么,只是拒绝根主体是行不通的。但是,我找到了一个解决方案,该解决方案是在语句中添加一个条件,以与本知识中心指南https://aws.amazon.com/premiumsupport/knowledge-center/explicit-deny-principal-elements-s3/

中的userid字段进行比较

您首先必须确定IAM用户的神奇unique id
然后将一条语句添加到指定通配符主体*的策略中,并添加一个条件以按请求的"aws:userid"字段进行过滤,例如(用确定的唯一ID替换AROAID2GEXAMPLEROLEID):

{
   "Sid": "",
   "Effect": "Deny",
   "Principal": "*",
   "Action": [
      "s3:PutObject",
      "s3:GetObjectVersion",
      "s3:GetObject",
      "s3:DeleteObject"
   ]
   "Resource": [
      "arn:aws:s3:::mybucket/production/*"
   ],
   "Condition": {
      "StringLike": {
         "aws:userid": [
            "AROAID2GEXAMPLEROLEID:*",
            "111111"
         ]
      }
   }
}

Amazon在资源字段中为操作和警告支持部分通配符。我不知道为什么亚马逊会如此复杂,而不是仅仅在principal字段中添加对部分通配符的支持以允许简单直接的配置,例如

"Principal": {
   "AWS": "arn:aws:iam::111111:*"
},