拒绝除特定范围外的所有 IP 访问 AWS S3

Deny access to AWS S3 to all IPs except specific ranges

我有一个 S3 存储桶 ("myBucket"),只有一个用户可以访问它,我们称它为 "s3user"。我有一个附加到该用户的 IAM 策略,如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::myBucket"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": "*"
        }
    ]
}

我将此 IAM 策略附加到用户 "s3User",授予对 "myBucket" 的只读访问权限。到目前为止一切顺利。

现在,我添加了第二个策略,但现在不是 IAM 策略而是 S3 存储桶策略,如下所示:

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myBucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.2.3.4/27",
                        "2.3.4.1/28",
                        "5.6.7.8/29"
                    ]
                }
            }
        }
    ]
}

我预计此显式拒绝将拒绝所有不是来自指定源 IP 范围的请求。但是,它仍然让我列出来自其他 IP 的存储桶的内容。好像bucket policy一点效果都没有。

根据 this AWS S3 article,当你有多个策略时,它们都会被应用并且显式拒绝优先于显式允许,所以我认为这个 应该 有效,但事实并非如此。

知道为什么我无法拒绝基于源 IP 地址的存储桶请求吗?

谢谢!

您应该更新 Deny 策略以包括对存储桶本身执行的操作,而不是其内容 (/*):

{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "DenyOutsideIPfromBucket",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::myBucket/*", "arn:aws:s3:::myBucket"],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.2.3.4/27",
                        "2.3.4.1/28",
                        "5.6.7.8/29"
                    ]
                }
            }
        }
    ]
}

当然,如果只有拥有 IAM 策略的用户才能访问存储桶,您可以简单地在原始 IAM 策略上添加一个 IpAddress 条件,这样他们就只能使用来自给定的 IP 地址集。这将避免需要 Deny 政策。