限制访问Cloudflare IP地址的S3桶策略

7

我将使用Cloudflare作为我的S3网站存储桶的代理,以确保用户无法直接使用存储桶URL访问网站。

  • 我已经设置了一个S3存储桶用于静态网站托管,并使用自定义域名:www.mydomain.com并上传了我的index.html文件。

  • 我拥有一个CNAME记录与www.mydomain.com->www.mydomain.com.s3-website-us-west-1.amazonaws.com和启用了Cloudflare Proxy

问题: 我正在尝试应用一个存储桶策略来拒绝访问我的网站存储桶,除非请求源自一系列Cloudflare IP地址。我正在遵循官方AWS文档进行操作,但每次尝试访问我的网站时,都会出现Forbidden 403 Access Denied错误。

这是我的存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudflareGetObject",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::ACCOUNT_ID:user/Administrator",
                    "arn:aws:iam::ACCOUNT_ID:root"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::www.mydomain.com/*",
                "arn:aws:s3:::www.mydomain.com"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "2c0f:f248::/32",
                        "2a06:98c0::/29",
                        "2803:f800::/32",
                        "2606:4700::/32",
                        "2405:b500::/32",
                        "2405:8100::/32",
                        "2400:cb00::/32",
                        "198.41.128.0/17",
                        "197.234.240.0/22",
                        "190.93.240.0/20",
                        "188.114.96.0/20",
                        "173.245.48.0/20",
                        "172.64.0.0/13",
                        "162.158.0.0/15",
                        "141.101.64.0/18",
                        "131.0.72.0/22",
                        "108.162.192.0/18",
                        "104.16.0.0/12",
                        "103.31.4.0/22",
                        "103.22.200.0/22",
                        "103.21.244.0/22"
                    ]
                }
            }
        }
    ]
}

您是否也有一个允许权限的地方,可以是授予权限的ACL或桶策略中的Allow-Statement?否则,默认情况下将被拒绝访问。 - Maurice
1个回答

3
默认情况下,AWS拒绝所有请求。来源 您的策略本身不授予管理员[或任何其他用户]访问权限,它只是将其从明确拒绝的原则列表中省略。要允许他访问资源,另一个策略声明必须明确使用“效果”:“允许”来允许访问。来源 现在,我们必须创建两个策略声明:第一个是允许,第二个是拒绝。然后,最好只有一个策略仅针对特定IP具有“允许”的权限。
最好不要让简单的事情变得复杂,例如使用Not Principal和NotIPAddress进行拒绝。即使AWS说:

很少有场景需要使用NotPrincipal,我们建议您在决定使用NotPrincipal之前探索其他授权选项。来源

现在,问题来了,“如何将Cloudflare IP添加到白名单中?”。我们可以采用简单的方法。以下是策略示例,请将其中的“bucket name”和“Cloudflare IPs”替换为您自己的信息。我已经测试过并且运行正常。
{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowCloudFlareIP",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:getObject",
        "Resource": [
            "arn:aws:s3:::my-poc-bucket",
            "arn:aws:s3:::my-poc-bucket/*"
        ],
        "Condition": {
            "IpAddress": {
                "aws:SourceIp": [
                    "IP1/32",
                    "IP2/32"
                ]
            }
        }
    }
 ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接