用于限制访问 Cloudflare IP 地址的 S3 存储桶策略

JCC*_*CCS 7 amazon-s3 amazon-web-services cloudflare

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

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

  • 我有一条启用了->和 CloudflareCNAME的记录。www.mydomain.comwww.mydomain.com.s3-website-us-west-1.amazonaws.comProxy

问题:我尝试应用存储桶策略来Deny访问我的网站存储桶,除非请求源自一系列Cloudflare IP 地址。我按照官方 AWS 文档执行此操作,但每次尝试访问我的网站时,都会收到Forbidden 403 AccessDenied错误。

这是我的存储桶政策:

{
    "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"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

小智 3

默认情况下,AWS 拒绝所有请求。来源

您的策略本身不会授予管理员[或任何其他用户]访问权限,它只是将其从明确拒绝的主体列表中删除。为了允许他访问资源,另一个策略声明必须使用“Effect”:“Allow”显式允许访问。 来源

现在,我们必须创建两个策略声明:- 第一个是允许,第二个是拒绝。那么,最好只有一项策略“仅允许”特定 IP。

最好不要使简单的事情复杂化,例如将 Deny 与 Not Primary 和 NotIPAddress 一起使用。甚至 AWS 也表示:

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

现在,问题来了如何将 Cloudflare IP 列入白名单???

让我们采用一个简单的方法。以下是政策。替换您的存储桶名称和 Cloudflare Ip。我已经测试过并且它正在运行。

{
"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"
                ]
            }
        }
    }
 ]
}
Run Code Online (Sandbox Code Playgroud)