如何编写授予对其他所有人的存储桶的读取访问权限的AWS IAM策略?

时间:2019-11-09 01:53:31

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

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

(是否授予我帐户中的 public 存储桶访问权限无关紧要。如果我需要授予访问权限,我可以明确地做到这一点。但是我不能授予访问权限明确地传递给世界上每个公共存储桶。)

我可以编写一个看起来像这样的节来授予对世界上所有存储桶的读取权限:

    {
      "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/*"
            ]
        }
    ]
}

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

1 个答案:

答案 0 :(得分:0)

  

如何编写拒绝访问我帐户中非命名存储桶的策略?

你不知道。 IAM策略默认为拒绝。

  

我如何授予对所有公共可读存储桶的读取权限?

你不知道。无需其他权限或政策即可访问公共存储桶。

但是,在使用公共存储桶访问时,您可能会遇到问题,并且应将您对公共存储桶的请求设为 unsigned

要与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))