AWS S3拒绝所有访问,除了1个用户-桶策略

4
我在AWS S3中设置了一个存储桶。我使用桶策略编辑器为我的IAM用户授予了访问该存储桶的权限,并设置了允许(ALLOW)策略。使用该用户,我能够将文件保存到该存储桶中。之前,我一直在使用该存储桶进行媒体服务操作,因此似乎默认操作是给予公共权限以查看文件(图像),这对于大多数网站来说很好。
在我的新项目中,我希望能够使用IAM用户访问S3存储桶,但要拒绝所有其他访问。除了具有完全访问权限(保存/删除等)的IAM用户外,没有公共读取访问权限,也没有任何其他访问权限。
根据我所做的看起来,我正在阅读这里。它说要使用NotPrincipal属性创建一个Deny策略,这样它仍然允许该用户,但拒绝其他所有人。为了保险起见,我还为我想要的用户添加了一个Allow策略。
{
    "Version": "2012-10-17",
    "Id": "Policy**********",
    "Statement": [
        {
            "Sid": "Stmt**********",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::*********:user/my_user"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        },
        {
            "Sid": "Stmt*************",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::**********:user/my_user"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        }
    ]
}

但是这样会拒绝所有人的访问,甚至包括my_user。 我可以确认,当我只使用上面策略中的Allow部分时,我有访问权限,但是公众也可以读取,而我正在尝试关闭。

我如何设置我的存储桶策略,以仅授予唯一的IAM用户完全访问权限,并拒绝任何其他用户的访问权限?

谢谢。


1
“my_user” 是如何访问存储桶的? - Michael - sqlbot
3个回答

8

很简单:

  • 默认情况下,对象存储桶没有公共访问权限
  • 不要添加对象存储桶策略,因为您不想授权公众访问
  • 相反,为IAM用户添加策略以授予他们访问权限

要注意的主要事项是IAM用户无法通过未经身份验证的URL(例如s3.amazonaws.com/bucket/file.jpg)访问内容,因为S3不知道他们是谁。当IAM用户访问内容时,他们将需要使用经过身份验证的访问方式,以便S3知道他们是谁,例如:

  • 使用用户名+密码通过AWS管理控制台进行访问
  • 使用访问密钥+秘密密钥通过AWS命令行界面(CLI)进行访问

IAM用户上的策略可能如下所示:

{
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::my_bucket",
    "arn:aws:s3:::my_bucket/*"
  ]
}

那太宝贵了,谢谢。我会尝试的。我注意到在Resource中添加这两行非常重要。我试过使用上面的设置,但是通过Web界面失去了对存储桶的控制...因此,那绝对不是正确的方法。 - jeffery_the_wind
1
我创建了一个新的桶,没有设置存储桶策略,并添加了类似于您的 IAM 策略,对于该用户来说它可以正常工作。但是当我获取照片的 URL 并在浏览器中打开时,我也可以访问它。这就是我尝试关闭的功能。因此,默认情况下整个存储桶都具有公共访问权限。这听起来对吗? - jeffery_the_wind
1
如果一个对象仍然可以通过匿名URL公开访问,则检查对象本身并确保它没有定义“所有人”权限。这是因为权限可以在对象、存储桶或用户级别上授予。此外,尝试在另一个浏览器或隐身窗口中运行,以防缓存了某些内容。哦,不要使用“操作->打开”命令,因为它会生成一个临时访问权限的预签名URL。相反,请单击属性窗格中显示的蓝色链接,该链接是匿名的。 - John Rotenstein
1
非常感谢。正在发生的是您建议的情况。每个单独的文件确实具有“所有人”权限,而存储桶则没有。当我关闭这些权限时,这些文件就变成了私有的。因此,这似乎是问题所在。您知道如何设置此行为吗?它似乎默认授予此权限。 - jeffery_the_wind
1
可以在上传对象时授予公共读取访问权限(这意味着每个人都可以查看/下载该对象),因此请检查文件进入 S3 的方式以及设置了哪些选项。 - John Rotenstein
完美。那就是正在发生的事情。我修复了我的应用程序,使其在保存时设置文件的访问级别,现在看起来很好! - jeffery_the_wind

1
获取用户的来电身份
aws sts get-caller-identity

现在,在下面的策略文档中修改PrincipalArn以添加一个例外。
在此处替换为您的用户/组/SSO用户Arn,您还可以像下面的示例一样匹配一个模式
{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Deny",
           "Principal": "*",
           "Action": "s3:DeleteObject",
           "Resource": [
               "arn:aws:s3:::s3-test-bucket",
               "arn:aws:s3:::s3-test-bucket/*"
           ],
           "Condition": {
               "StringNotEquals": {
                   "aws:PrincipalArn": ["arn:aws:iam::<account-id>:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_test_abcdef","**devops**"],
                   "aws:PrincipalServiceName": "cloudtrail.amazonaws.com"
               }
           }
       }
   ]
}

上述声明意味着除了SSO用户、包含devops和AWS CloudTrail的任何人或事物之外,拒绝所有人删除访问权限。
阅读this docs以了解在AWS中如何应用多个条件。 阅读此文档以了解您可以在AWS中使用的条件键类型
警告与预防措施:如果您正在进行测试,请尝试使用类似"Action": "s3:DeleteObject"而不是"*"的内容。如果您在设置策略时犯了错误,可能会导致所有人失去对存储桶的访问权限。只有组织根用户才能解锁存储桶。

1
就是这样。效果非常好。谢谢@Shivam Anand。 - undefined

0

如果我理解正确,我们只需要允许1个IAM用户访问存储桶。我们可以使用存储桶策略,在NetApp文档中找到了相关信息。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
      },
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
    },
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
      },
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
    }
  ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接