跳转到内容
搜索文档

使用 Cloudflare Zero Trust 保护对 Amazon S3 存储桶的访问

最后更新 查看 MarkdownAgent 设置

本教程演示如何使用 Cloudflare Zero Trust 安全地访问 Amazon S3 存储桶,以防这些存储桶中的数据公开暴露在互联网上。您可以结合使用 Cloudflare Access 和 AWS VPC 端点。企业还可以结合使用具有专用出口 IP 的 Cloudflare Gateway 出口策略。

方法 1:通过 Cloudflare Access 和 VPC 端点

flowchart TB
    cf1[/Cloudflare One Client or clientless users/]--Access policy-->cf2{{Cloudflare}}
    cf2--Cloudflare Tunnel-->vpc1

    subgraph VPC
    vpc1[EC2 VM]-->vpc2[VPC endpoint]
    end
    vpc2-->s3_1

    subgraph S3 service
    s3_1([S3 bucket])
    end

    i1[/Users outside </br> Zero Trust/]-. "S3 access denied" .->s3_1

前提条件

1. 在 AWS 中创建 VPC 端点

  1. AWS 仪表板中,转到 Services(服务) > Networking & Content Delivery(网络和内容分发) > VPC
  2. Virtual private cloud(虚拟私有云) 下,转到 Endpoints(端点)
  3. 选择 Create endpoint(创建端点) 并为该端点命名。
  4. 选择 AWS services 作为服务类别。
  5. Services(服务) 中,搜索并选择与 VPC 位于同一区域的 S3 服务。例如,对于 AWS 区域 Europe (London) - eu-west-2,相应的 S3 服务命名为 com.amazonaws.eu-west-2.s3,类型为 Gateway。
  6. VPC 中,选择包含托管 Cloudflare Tunnel 守护程序的 EC2 虚拟机(VM)的 VPC。
  7. Route tables(路由表) 中,选择与该 VPC 关联的路由表。
  8. Policy(策略) 中,选择 Full access(完全访问)
  9. 选择 Create endpoint(创建端点)

创建 VPC 端点后,VPC 路由表中会出现一条目标为您的 VPC 端点的新条目。该条目格式为 vpce-xxxxxxxxxxxxxxxxx

2. 设置用于 VPC 访问的存储桶策略

  1. 转到 Services(服务) > Storage(存储) > S3
  2. 在 Amazon S3 中,转到 Buckets(存储桶) > <your-S3-bucket> > Permissions(权限)
  3. 禁用 Block all public access(阻止所有公开访问)
  4. Bucket policy(存储桶策略) 中,添加以下策略:
{
	"Version": "2012-10-17",
	"Id": "VPCe",
	"Statement": [
		{
			"Sid": "VPCe",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::<your-S3-bucket01>",
				"arn:aws:s3:::<your-S3-bucket01>/*"
			],
			"Condition": {
				"StringEquals": {
					"aws:SourceVpce": "<your-vpc-endpoint>"
				}
			}
		}
	]
}

您的存储桶策略将允许您的 VPC 访问您的 S3 存储桶。

3. 启用 S3 存储桶的静态网站托管

  1. 返回 Amazon S3,然后转到 Buckets(存储桶) > <your-S3-bucket01> > Properties(属性)
  2. Static website hosting(静态网站托管) 中,选择 Edit(编辑)
  3. 启用 Static website hosting(静态网站托管)
  4. 指定 S3 存储桶的索引和错误文档。
  5. 选择 Save changes(保存更改)

一个存储桶网站端点将在 http://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com 可用。由于存储桶策略,该网站端点将只能从配置了 VPC 端点的 VPC 访问。

4. 向 Cloudflare Tunnel 添加已发布的应用程序

  1. 在 Cloudflare 仪表板中,转到 Networking(网络) > Tunnels(隧道)

    Go to Tunnels ↗
  2. 选择您的隧道,然后转到 Routes(路由) 选项卡。

  3. 选择 Add route(添加路由),然后选择 Published application(已发布应用程序)

  4. 输入您组织用来访问 S3 存储桶的子域。例如, s3-bucket.<your-domain>.com

  5. Service URL(服务 URL) 中,输入 http://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com

  6. Additional application settings(其他应用程序设置) > HTTP Settings(HTTP 设置) 中,将 HTTP Host Header(HTTP 主机标头) 输入为 <your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com

  7. 选择 Save hostname(保存主机名)

您的 Cloudflare Tunnel 将使用您的公共主机名终止于 AWS VPC 处。

5. 使用 Access 策略限制 S3 访问

  1. 转到 Access controls(访问控制)> Applications(应用程序)
  2. 选择 Create new application(创建新应用程序)
  3. 选择 Self-hosted and private(自托管和私有)
  4. 选择 **Add public hostname(添加公共主机名)**并输入您的隧道使用的公共主机名。例如,s3-bucket.<your-domain>.com
  5. 添加 Access 策略以确定哪些用户和应用程序可以访问您的存储桶。您可以选择创建一个服务令牌 (service token) 策略来自动对到您的 S3 存储桶的访问进行身份验证。
  6. 按照其余自托管应用程序创建步骤发布该应用程序。

通过 Cloudflare Access 成功进行身份验证的用户和应用程序可以在 https://s3-bucket.<your-domain>.com 访问您的 S3 存储桶。

方法 2:通过 Cloudflare Gateway 出口策略

flowchart TB
    cf1[/Cloudflare One Client users/]--Egress policy-->cf2{{Cloudflare}}
    cf2--Egress with dedicated IP-->i1[Internet]
    i1-->s3_1

    subgraph S3 Service
    s3_1([S3 bucket])
    end

    i2[/Users outside </br> Zero Trust/]-. "IPs denied" .->s3_1

前提条件

  • 具有专用出口 IP 的 Cloudflare Zero Trust 账户
  • 要受 Cloudflare Zero Trust 保护的 S3 存储桶

1. 设置存储桶策略以将访问限制在特定的 IP 地址

  1. AWS 仪表板中,转到 Services(服务) > Storage(存储) > S3
  2. 转到 Buckets(存储桶) > <your-S3-bucket02> > Permissions(权限)
  3. 禁用 Block all public access(阻止所有公开访问)
  4. Bucket policy(存储桶策略) 中,添加以下策略:
{
	"Version": "2012-10-17",
	"Id": "SourceIP",
	"Statement": [
		{
			"Sid": "SourceIP",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::<your-S3-bucket02>",
				"arn:aws:s3:::<your-S3-bucket02>/*"
			],
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": "<your-dedicated-ip>/32"
				}
			}
		}
	]
}

2. 启用 S3 存储桶的静态网站托管

  1. 返回您的存储桶,然后转到 Properties(属性)
  2. Static website hosting(静态网站托管) 中,选择 Edit(编辑)
  3. 启用 Static website hosting(静态网站托管)
  4. 指定 S3 存储桶的索引和错误文档。
  5. 选择 Save changes(保存更改)

一个存储桶网站端点将在 http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.com 可用。由于存储桶策略,该网站端点将只能被来自所指定的专用出口 IP 的流量所访问。

3. 设置专用出口 IP 策略

  1. Cloudflare 仪表板中,转到 Zero Trust > Traffic policies(流量策略) > Egress policies(出口策略)。选择 Add a policy(添加策略)
  2. 创建一条策略,指定 Gateway 应将专用出口 IP 分配给哪些代理流量。有关更多信息,请参阅出口策略
  3. Select an egress IP(选择出口 IP) 中,选择 Use dedicated Cloudflare egress IPs(使用专用 Cloudflare 出口 IP)。选择在您的存储桶策略中定义的专用出口 IP。
  4. 选择 Create policy(创建策略)

由 Gateway 代理并分配了您指定出口 IP 的流量可以在 http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.com 访问您的 S3 存储桶。

这篇文档对您有帮助吗?