【问题标题】:AWS policy interpretationAWS 政策解读
【发布时间】:2021-01-26 13:12:06
【问题描述】:

我试图了解条件 "home/${aws:userid}/*" 的必要性。这个条件其实感觉在 "arn:aws:s3:::bucket-name/home/${aws:userid}/*" .中已经满足了

当我们在第三条语句中为该用户允许所有 s3 操作时。那么为什么我们需要专门为该用户允许 s3:listbuckets 呢?

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket-name",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "home/",
                        "home/${aws:userid}/*"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name/home/${aws:userid}",
                "arn:aws:s3:::bucket-name/home/${aws:userid}/*"
            ]
        }
    ]
}

参考https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_federated-home-directory-console.html

【问题讨论】:

    标签: amazon-web-services permissions policy


    【解决方案1】:

    s3:ListBucket 是存储桶级权限,而arn:aws:s3:::bucket-name/home/${aws:userid}/* 是通配符object ARN,而不是bucket ARN。

    授予 s3:ListBucket 的尝试不会匹配任何不是存储桶 ARN 的 Resource,因此 s3:* 授予(仅包括对象 ARN)实际上不允许列出对象。

    因此,此示例策略不包含任何冗余。

    如果这个实现看起来仍然有点违反直觉或者可能令人费解,那么如果您考虑一下 S3 API 如何在线上工作,它确实会变得更加清晰。 ListObjects API action(以及较新的ListObjectsV2)是针对存储桶提交的——请求中没有路径……或者更准确地说,HTTP请求中的路径总是¹/……和查询字符串包含prefix= 和对象键前缀,请求的列表将被锚定。

    虽然底层 API 的工作方式与 IAM 策略的工作方式之间没有强制性关联,但 s3:prefix 条件键用于控制 ListObjects 的 prefix 参数的使用确实是有意义的,而不是对象级 ARN,并且存储桶(不是对象键或通配符模式)是正在访问的资源。


    ¹ 总是/ 除非它是/${bucket},因为旧的不推荐使用的路径样式URL 在一个或两个错误开始之后是finally being phased out,至少对于新存储桶。请求 URI 的路径组件中表示的资源始终是存储桶本身,而不是存储桶加上键前缀。

    【讨论】:

      【解决方案2】:

      资源不同。在第三条语句中,用户只能访问bucket-name/home/${aws:userid}。这意味着当用户进入 S3 控制台并单击存储桶 bucket-name 时,它将被拒绝访问。因此用户将无法列出存储桶内容,也不会看到那里有home 文件夹。他们也不会看到bucket-name/home 中有一个包含他们用户名的文件夹。

      因此,为了克服这个问题,有第二个语句,它允许列出“bucket-nameand thenbucket-name/home”的所有内容。这样,用户可以在 S3 控制台中轻松导航以访问他们的实际主文件夹。

      如果没有第二条语句,用户将不得不在浏览器中输入其主文件夹的 url 才能直接访问它,这对用户来说不是很友好。

      【讨论】:

      • 感谢您的回复。我同意浏览需要 " "" 、 "home/"。但是资源 arn:aws:s3:::bucket-name 结合条件 "home/${aws:userid}/*" 给出相同的结果资源不是吗?
      • arn:aws:s3:::bucket-name 以“home/${aws:userid}/*”为前缀与“arn:aws:s3:::bucket-name/”相同home/${aws:userid}/*" 不是吗?
      • @gkbinary 是的。这似乎是多余的,但这必须得到验证。该策略非常简单,可以在 s3 控制台中进行测试。
      • @gkbinary 不,它不是多余的。 s3:ListBucket 是存储桶级权限,而 arn:aws:s3:::bucket-name/home/${aws:userid}/* 是通配符 object ARN,而不是 bucket ARN。如果在Resource 中指定了任何路径,则授予s3:ListBucket 的尝试将不匹配,因此s3:* 此处不允许您假设的对象列表。
      • @Michael - sqlbot 非常感谢。准确的答案。
      猜你喜欢
      • 1970-01-01
      • 2020-05-24
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多