【问题标题】:How do I write an AWS IAM policy that grants read access to everyone else's buckets?如何编写 AWS IAM 策略来授予对其他所有人的存储桶的读取访问权限?
【发布时间】:2020-03-05 15:05:18
【问题描述】:

我正在为我的 Kubernetes 工作人员编写 IAM 政策。我希望他们对某个 S3 存储桶具有读/写访问权限,不能访问我的帐户中 中的其他 S3 存储桶,但可以读取 任何存储桶,即 可公开阅读(例如s3://1000genomes/ 存储桶,以及亚马逊或其他人已放置公共数据的其他存储桶)。

(是否授予或拒绝访问我帐户中的公共存储桶无关紧要。如果我需要授予对某个存储桶的访问权限,我可以明确地这样做。但我不能授予访问权限明确地指向世界上的每个公共存储桶。)

我可以编写一个如下所示的节来授予对世界上所有存储桶的读取权限:

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

我还可以编写一个授予对我的帐户上我想要允许访问的特定命名存储桶的访问权限,并将名称填写为*

但是如何编写拒绝访问我帐户上不是命名存储桶的存储桶的策略?或者,如果我采用不同的方法,我如何为不在我账户上的所有存储桶编写授权?我可以在那些额外的冒号之间放一些东西来做到这一点吗?我试过同时使用 ResourceNotResource,但 AWS 拒绝了。

作为参考,我的政策如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::vg-k8s",
                "arn:aws:s3:::vg-k8s/*",
            ]
        }
    ]
}

在我的节点组上实施该策略后,我无法从节点访问s3://1000genomes。要专门访问该存储桶,我可以将其更改为:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::vg-k8s",
                "arn:aws:s3:::vg-k8s/*",
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::1000genomes",
                "arn:aws:s3:::1000genomes/*"
            ]
        }
    ]
}

但我需要一种方法来做到这一点,以便我涵盖所有公共存储桶,而不仅仅是我列出的那些,而且我不涵盖我帐户中的非公共存储桶。

【问题讨论】:

  • 编写一个对所有存储桶都具有 ALLOW 的策略,然后在您的存储桶上显式地拒绝。
  • @hephalump 我怎样才能拒绝我的所有存储桶,除了我想要允许的存储桶?我可以拒绝我的所有个存储桶,但是拒绝将胜出,我将无法访问我的任何个存储桶。

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


【解决方案1】:

如何编写一个策略来拒绝访问我账户上不是指定存储桶的存储桶?

你没有。 IAM 策略默认被拒绝。

如何授予对任何公开可读的存储桶的读取权限?

你没有。访问公共存储桶不需要额外的权限或策略。

但是,您可能会在访问公共存储桶时遇到问题,应该向公共存储桶提出请求未签名

要从 awscli 与公共存储桶交互,请使用:

aws s3 ls s3://1000genomes/ --no-sign-request

要从 boto3 执行相同操作,请使用:

import boto3
from botocore import UNSIGNED
from botocore.config import Config
s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED))

【讨论】:

  • 不幸的是,这与我观察到的行为不符。从作为受组策略约束的用户运行的节点中,我不能aws s3 ls s3://1000genomes/,除非我将公共存储桶arn:aws:s3:::1000genomes 添加到允许访问存储桶的策略中。一旦我这样做了,我就可以访问它了。
  • 试试aws s3 ls s3://1000genomes/ --no-sign-request
  • 我授予了对1000genomes 的显式访问权限,但是对于我还没有为 (landsat-pds) 这样做的存储桶,这似乎有效。我可以使用 --no-sign-request 列出存储桶,但不能没有。不幸的是,我不确定如何修改我的应用程序(它使用 boto)来知道它何时应该和不应该签署请求。 @jarmod,有没有办法在 IAM 策略级别解决这个问题,这样即使签名的请求也能通过?
  • 我不知道有什么方法可以在策略级别完全按照您的意愿行事。理想情况下,您的应用程序可能会被告知它正在处理一个公共存储桶,如果这不可能,那么可能只是在您获得 AccessDenied 后重试未签名的基本操作。不理想,我会答应你的。如果我找到更好的选择会更新。
猜你喜欢
  • 2017-01-01
  • 2022-01-17
  • 2020-08-22
  • 2017-11-01
  • 1970-01-01
  • 2013-10-31
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多