允许 Athena 查询到 S3 存储桶

Allow Athena query to S3 bucket

我有这个存储桶策略并且它工作正常。唯一的问题是它不允许 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"
                    ]
                }
            }
        }
    ]
}

我知道这个 link...

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

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

您有一个存储桶策略,它的范围是存储桶,适用于任何试图对该存储桶进行操作的用户或角色。您所指的 link 是关于用户和角色策略,仅适用于特定用户。当用户或角色对存储桶进行操作时,他们的策略和存储桶策略的组合决定了他们被允许做什么。

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

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

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

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

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

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

因此,即使允许访问存储桶的人正在 运行 进行 Athena 查询,上述策略也会阻止他们,因为 Athena 不会进入其中一个 IP 地址。

为避免这种情况,您应该找到授予人们访问权限的任何策略,并对 那些 策略设置 IP 地址限制,以便他们说 "Allow these people to access the bucket but only if they are coming from one of these IP addresses". 这样,它就是一个纯粹的 Allow 策略,而不是 AllowDeny.

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

Athena does not support restricting or allowing access to Amazon S3 resources based on the aws:SourceIp condition key.

根据此处的 AWS Athena 文档: https://docs.aws.amazon.com/athena/latest/ug/s3-permissions.html

我认为您可以添加一个新条件来允许来自 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