本教程演示如何使用 Cloudflare Zero Trust 安全地访问 Amazon S3 存储桶,以防这些存储桶中的数据公开暴露在互联网上。您可以结合使用 Cloudflare Access 和 AWS VPC 端点。企业还可以结合使用具有专用出口 IP 的 Cloudflare Gateway 出口策略。
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
- 要受 Cloudflare Zero Trust 保护的 S3 存储桶
- 具有一个托管 Cloudflare Tunnel 守护程序的 EC2 虚拟机 (VM) 的 AWS VPC
- 在同一个 AWS 区域 ↗中配置的 S3 存储桶和 AWS VPC
- 在 AWS 仪表板 ↗中,转到 Services(服务) > Networking & Content Delivery(网络和内容分发) > VPC。
- 在 Virtual private cloud(虚拟私有云) 下,转到 Endpoints(端点)。
- 选择 Create endpoint(创建端点) 并为该端点命名。
- 选择 AWS services 作为服务类别。
- 在 Services(服务) 中,搜索并选择与 VPC 位于同一区域的 S3 服务。例如,对于 AWS 区域 Europe (London) - eu-west-2,相应的 S3 服务命名为
com.amazonaws.eu-west-2.s3,类型为 Gateway。 - 在 VPC 中,选择包含托管 Cloudflare Tunnel 守护程序的 EC2 虚拟机(VM)的 VPC。
- 在 Route tables(路由表) 中,选择与该 VPC 关联的路由表。
- 在 Policy(策略) 中,选择 Full access(完全访问)。
- 选择 Create endpoint(创建端点)。
创建 VPC 端点后,VPC 路由表中会出现一条目标为您的 VPC 端点的新条目。该条目格式为 vpce-xxxxxxxxxxxxxxxxx。
- 转到 Services(服务) > Storage(存储) > S3。
- 在 Amazon S3 中,转到 Buckets(存储桶) > <your-S3-bucket> > Permissions(权限)。
- 禁用 Block all public access(阻止所有公开访问)。
- 在 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 存储桶。
- 返回 Amazon S3,然后转到 Buckets(存储桶) > <your-S3-bucket01> > Properties(属性)。
- 在 Static website hosting(静态网站托管) 中,选择 Edit(编辑)。
- 启用 Static website hosting(静态网站托管)。
- 指定 S3 存储桶的索引和错误文档。
- 选择 Save changes(保存更改)。
一个存储桶网站端点将在 http://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com 可用。由于存储桶策略,该网站端点将只能从配置了 VPC 端点的 VPC 访问。
-
在 Cloudflare 仪表板中,转到 Networking(网络) > Tunnels(隧道)。
Go to Tunnels ↗ -
选择您的隧道,然后转到 Routes(路由) 选项卡。
-
选择 Add route(添加路由),然后选择 Published application(已发布应用程序)。
-
输入您组织用来访问 S3 存储桶的子域。例如,
s3-bucket.<your-domain>.com。 -
在 Service URL(服务 URL) 中,输入
http://<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com。 -
在 Additional application settings(其他应用程序设置) > HTTP Settings(HTTP 设置) 中,将 HTTP Host Header(HTTP 主机标头) 输入为
<your-S3-bucket01>.s3-website.<aws-region>.amazonaws.com。 -
选择 Save hostname(保存主机名)。
您的 Cloudflare Tunnel 将使用您的公共主机名终止于 AWS VPC 处。
- 转到 Access controls(访问控制)> Applications(应用程序)。
- 选择 Create new application(创建新应用程序)。
- 选择 Self-hosted and private(自托管和私有)。
- 选择 **Add public hostname(添加公共主机名)**并输入您的隧道使用的公共主机名。例如,
s3-bucket.<your-domain>.com。 - 添加 Access 策略以确定哪些用户和应用程序可以访问您的存储桶。您可以选择创建一个服务令牌 (service token) 策略来自动对到您的 S3 存储桶的访问进行身份验证。
- 按照其余自托管应用程序创建步骤发布该应用程序。
通过 Cloudflare Access 成功进行身份验证的用户和应用程序可以在 https://s3-bucket.<your-domain>.com 访问您的 S3 存储桶。
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 存储桶
- 在 AWS 仪表板 ↗中,转到 Services(服务) > Storage(存储) > S3。
- 转到 Buckets(存储桶) > <your-S3-bucket02> > Permissions(权限)。
- 禁用 Block all public access(阻止所有公开访问)。
- 在 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"
}
}
}
]
}- 返回您的存储桶,然后转到 Properties(属性)。
- 在 Static website hosting(静态网站托管) 中,选择 Edit(编辑)。
- 启用 Static website hosting(静态网站托管)。
- 指定 S3 存储桶的索引和错误文档。
- 选择 Save changes(保存更改)。
一个存储桶网站端点将在 http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.com 可用。由于存储桶策略,该网站端点将只能被来自所指定的专用出口 IP 的流量所访问。
- 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Traffic policies(流量策略) > Egress policies(出口策略)。选择 Add a policy(添加策略)。
- 创建一条策略,指定 Gateway 应将专用出口 IP 分配给哪些代理流量。有关更多信息,请参阅出口策略。
- 在 Select an egress IP(选择出口 IP) 中,选择 Use dedicated Cloudflare egress IPs(使用专用 Cloudflare 出口 IP)。选择在您的存储桶策略中定义的专用出口 IP。
- 选择 Create policy(创建策略)。
由 Gateway 代理并分配了您指定出口 IP 的流量可以在 http://<your-S3-bucket02>.s3-website.<aws-region>.amazonaws.com 访问您的 S3 存储桶。