【问题标题】:Allow Athena query to S3 bucket允许 Athena 查询 S3 存储桶
【发布时间】:2019-08-26 23:36:13
【问题描述】:

我有这个存储桶策略,它可以正常工作。唯一的问题是它不允许雅典娜查询。如何将其修改为所有 athena?

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::13cols/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "18.72.1.2/32",
                        "11.119.2.8/32",
                        "12.939.49.346/32",
                        "4.26.2.219/32"
                    ]
                }
            }
        }
    ]
}

我知道这个链接...

https://docs.aws.amazon.com/athena/latest/ug/managed-policies.html

但不确定如何将其与当前政策合并。

【问题讨论】:

    标签: amazon-s3 amazon-athena


    【解决方案1】:

    您有一个存储桶策略,它的范围仅限于存储桶,并适用于尝试对该存储桶进行操作的任何用户或角色。您引用的链接是关于用户和角色策略的,仅适用于特定用户。当用户或角色对存储桶进行操作时,他们的策略和存储桶策略的组合决定了他们可以做什么。

    用户或角色策略与桶策略的组合不是联合,更像是一个交集。我的意思是,如果用户或角色策略不授予说s3:GetObject,则存储桶策略授予该操作并不重要。用户或角色策略存储桶策略都必须授予它。当您将委托人考虑在内时,它实际上会更加复杂 - 但您的存储桶策略适用于所有人,所以这里不是这种情况。

    您说您的策略有效,但不允许来自 Athena 的查询。这是真的,因为它是一个存储桶策略,它不授予任何用户或角色任何东西,它只是指定用户或角色将被允许做什么,如果他们被允许访问存储桶。此外,您的政策只是否认事情。明确拒绝并不意味着允许其他所有事情,它只是意味着即使其他事情允许您的政策中提到的事情,您的政策也会推翻这一点(在这种情况下:即使用户或角色政策允许 s3:GetObject 您的政策也会拒绝如果源 IP 与上述之一匹配,则采取该行动——我想这是你的意图)。

    您用于运行 Athena 查询的用户或角色必须有权

    1. 在 Athena 中运行查询,
    2. 在 Glue 中访问目录对象(即数据库和表)
    3. 访问可存储查询结果的 S3 存储桶,以及
    4. 访问 S3 存储桶和需要读取以运行查询的对象。

    您链接到的托管策略将有助于 1-3,但您必须编写 4。执行查询时,IAM 将评估 1-4 以及存储桶策略,以查看是否允许用户或角色运行查询。

    【讨论】:

      【解决方案2】:

      没错。您的存储桶政策规定:如果传入请求不是来自这些 IP 地址之一,则不要让任何人对此 S3 存储桶执行任何操作。

      因此,即使 Athena 查询是由允许访问存储桶的人运行的,上述策略也会阻止他们,因为 Athena 没有通过这些 IP 地址之一进入。

      为避免这种情况,您应该找到授予人们访问权限的任何策略,并将 IP 地址限制放在 那些 策略上,以便他们说 “允许这些人访问存储桶,但仅限如果它们来自这些 IP 地址之一”。 这样,它纯粹是一个 Allow 策略,而不是 AllowDeny

      然后,Allow 存储桶访问正在运行 Athena 查询的用户,但不要通过 IP 地址限制它们(因为 Athena 请求不会来自您的 IP 地址范围)。

      【讨论】:

      • 我不认为这是正确的。无论您是在用户/角色级别允许 IP,还是在存储桶级别拒绝它们,最终结果都应该相同,操作应该具有相同的评估上下文,不是吗?为什么 aws:SourceIp 仅仅因为它匹配的规则在存储桶策略中就评估为不同的值?
      • 问题是上述策略拒绝给定 IP 地址之外的任何请求。不幸的是,Athena 查询在这些 IP 地址之外。因此,解决方法是使用拒绝策略,而是限制通过允许策略授予的权限,这些策略首先授予访问权限。
      【解决方案3】:

      Athena 不支持限制或允许访问 Amazon S3 基于 aws:SourceIp 条件键的资源。

      这里的每个 AWS Athena 文档: https://docs.aws.amazon.com/athena/latest/ug/s3-permissions.html

      【讨论】:

        【解决方案4】:

        我认为您可以添加一个新条件来允许来自 Athena 的请求,如下所示。

        {
            "Version": "2008-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Deny",
                    "Principal": {
                        "AWS": "*"
                    },
                    "Action": "s3:*",
                    "Resource": "arn:aws:s3:::13cols/*",
                    "Condition": {
                        "ForAnyValue:StringEquals": { 
                           "aws:CalledVia": "athena.amazonaws.com"
                        }
                        "NotIpAddress": {
                            "aws:SourceIp": [
                                "18.72.1.2/32",
                                "11.119.2.8/32",
                                "12.939.49.346/32",
                                "4.26.2.219/32"
                            ]
                        }
                    }
                }
            ]
        }
        

        我的评论基于以下文档: https://docs.aws.amazon.com/athena/latest/ug/security-iam-athena-calledvia.html https://docs.aws.amazon.com/athena/latest/ug/s3-permissions.html

        【讨论】:

          猜你喜欢
          • 2019-10-06
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 2020-09-19
          • 1970-01-01
          • 1970-01-01
          • 2016-12-28
          • 1970-01-01
          相关资源
          最近更新 更多