跳转到内容
搜索文档

使用 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 存储桶。

这篇文档对您有帮助吗?