如何允许不使用 TLS 1.2 或更高版本的客户访问我的 Amazon S3 存储桶?

3 分钟阅读
0

我的客户不使用 TLS 1.2 或更高版本,因此他们无法访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶中的内容。如何允许这些客户使用 TLS 1.0 或 1.1 访问我的 Amazon S3 存储桶中的内容?

简短描述

AWS 正在所有 AWS API 端点上强制使用 TLS 1.2 或更高版本。要继续连接到 AWS 服务,您必须更新所有使用 TLS 1.0 或 1.1 的软件。

解决方法

Amazon CloudFront 允许使用较早的 TLS 版本,方法是将客户从您的 CloudFront 分配和 Amazon S3 之间使用的 TLS 协议中抽象出来。

使用 OAC 创建 CloudFront 分配

使用 CloudFront,您可以支持对 S3 存储桶的匿名和公共请求。或者,您可以将您的 S3 存储桶设为私有且只能通过 CloudFront 访问,方法是要求签署的请求才能访问您的 S3 存储桶。

支持对 S3 存储桶的匿名和公开请求

注意:以下示例假设您已经使用了 S3 存储桶。如果您没有 S3 存储桶,请创建一个

要创建 CloudFront 分配,请执行以下步骤:

  1. 打开 CloudFront 控制台
  2. 选择 Create Distribution (创建分配)
  3. 下,对于源域,从下拉列表中选择 S3 存储桶的 REST API 端点。
  4. 对于 Viewer Protocol Policy (查看器协议策略),请选择 Redirect HTTP to HTTPS (将 HTTP 重定向到 HTTPS)
  5. 对于允许的 HTTP 端点,选择 GET, HEAD, OPTIONS以支持读取请求**。**
  6. Origin 访问权限部分中,选择 Origin 访问控制设置(推荐)。
  7. 选择创建控件设置,然后使用默认名称。对于签名行为,选择签署请求(推荐),然后选择创建。 OAC 推荐设置会自动对查看器的请求进行身份验证。
  8. 在下拉列表中选择身份**。** 创建分配后**,**更新存储桶策略以限制对 OAC 的访问。
  9. 默认缓存行为查看器下,为查看器协议策略选择将 HTTP 重定向到 HTTPS**,**并将其他设置保留为默认设置。
  10. 缓存密钥和源请求下,选择缓存策略和源请求策略(推荐)。然后,将 CachingOptimized 用于缓存策略,将 CORS-S3Origin 用于原始请求策略
  11. 选择创建分配,然后等待其状态更新为启用

需要签名的请求才能访问您的 S3 存储桶

通过仅支持已签名的请求,为您的 S3 存储桶增加安全性。对于已签名的请求,OAC 会遵循您的身份验证参数并将其转发到 S3 源,然后后者会拒绝匿名请求。

要创建需要签名请求才能访问您的 S3 存储桶的 CloudFront 分配,请执行以下步骤:

  1. 打开 CloudFront 控制台
  2. 选择 Create Distribution (创建分配)
  3. 下,对于源域,从下拉列表中选择 S3 存储桶的 REST API 端点。
  4. 对于 Viewer Protocol Policy (查看器协议策略),请选择 Redirect HTTP to HTTPS (将 HTTP 重定向到 HTTPS)
  5. 对于允许的 HTTP 端点,选择 GET, HEAD, OPTIONS以支持读取请求**。**
  6. Origin 访问权限部分中,选择 Origin 访问控制设置(推荐)。
  7. 通过选中 Do not sign requests(不签署请求)选项,阻止所有未签署的请求。
    **注意:**阻止未签名的请求需要每个客户签署其请求,以便 S3 源可以评估权限。
  8. 创建自定义缓存策略以将客户的授权标头转发到源。
  9. 缓存密钥和源请求下,选择缓存策略和源请求策略(推荐)
  10. 选择创建策略
  11. Name(名称)部分中输入缓存策略的名称。
  12. Cache key settings(缓存键设置)下,前往 Headers(标头)并选择 Include the following headers(包括以下标头)。
  13. 在 **Add Headers(添加标头)**下,选择 Authorization(授权)
  14. 选择 Create(创建)。

控制客户的安全策略

要在 CloudFront 中控制安全策略,您必须拥有一个自定义域。最佳做法是为您的分配指定一个备用域名。使用在 AWS Certificate Manager (ACM) 中配置的自定义 SSL 证书也是最佳实践。这样做可以让您更好地控制安全策略,并允许客户继续使用 TLS 1.0。有关更多信息,请参阅查看器与 CloudFront 之间支持的协议和密码

如果您使用默认的 *.cloudfront.net 域名,则 CloudFront 会自动预置证书并将安全策略设置为允许 TLS 1.0 和 1.1。有关更多信息,请参阅分配设置

为 CloudFront 分配配置备用域名,请执行以下步骤:

  1. 登录至 AWS 管理控制台并打开 CloudFront 控制台
  2. 选择要更新的分配 ID
  3. General(常规)选项卡上,选择 Edit(编辑)。
  4. 对于 Alternate Domain Names (CNAMEs) (备用域名 [别名记录]),请选择 Add item(添加项目),并输入您的域名。
    **注意:**最好使用自定义规范名称记录(CNAME)来访问资源。使用 CNAME 可以更好地控制路由,并为您的客户提供更好的过渡。
  5. 对于 Custom SSL Certificate(自定义 SSL 证书),从涵盖别名记录的下拉列表中选择要分发给分配的自定义 SSL 证书。
    **注意:**有关安装证书的更多信息,请参阅如何将 CloudFront 分配配置为使用 SSL/TLS 证书?
  6. 选择创建分配,然后等待其状态更新为启用

创建分配后,必须允许 OAC 访问您的存储桶。完成以下步骤:

  1. 导航到 CloudFront 控制台页面,然后打开您的 CloudFront 分配。
  2. 选择 Origins 选项卡,选择您的来源,然后单击 Edit(编辑)。
  3. 选择复制策略,打开存储桶权限,然后更新您的存储桶策略。
  4. 打开转到 S3 存储桶权限页面。
  5. 存储桶策略下方,选择编辑。粘贴您之前复制的策略,然后选择 Save(保存)。如果您的存储桶策略需要的不仅仅是从 S3 中读取数据,则可以添加所需的 API。

如果您使用自定义域名,请将 DNS 条目更改为使用新的 CloudFront 分配 URL。如果您不使用自定义域名,则必须向用户提供新的 CloudFront 分配 URL。此外,您必须更新任何使用旧 URL 的客户端或设备软件。

如果您使用 AWS 开发工具包访问 Amazon S3 对象,则必须更改代码以使用常规 HTTPS 端点。另外,请确保使用新的 CloudFront 网址。如果对象不是公开的,需要更好的控制,那么您可以提供带有签名 URL 和签名 Cookie 的私有内容

使用 S3 预签名 URL 访问对象

如果您的工作流程依赖于 S3 预签名 URL,则使用 CloudFront 分配将您的查询中继到 S3 源。首先,为您想要的对象生成一个预签名 URL。然后,将 URL 中的主机替换为 CloudFront 端点,以通过 CloudFront 传送呼叫并自动升级加密协议。要测试和生成预签名 URL,请运行以下 CLI 命令:

aws s3 presign s3://BUCKET_NAME/test.jpg

示例输出:

https://bucket_name.s3.us-east-1.amazonaws.com/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=%5b...%5d%2F20220901%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=%5b...%5d&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature">https://BUCKET_NAME.s3.us-east-1.amazonaws.com/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=[...]%2F20220901%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=[...]&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature    =[...]

现在,将 S3 URL 更改为新的 CloudFront 端点。例如,替换以下 S3 URL:

BUCKET_NAME.s3.eu-west-1.amazonaws.com

使用这个端点:

https://DISTRIBUTION_ID.cloudfront.net.

示例输出:

https://<DISTRIBUTION_ID>.cloudfront.net /test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=[...]%2F20220901%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=[...]&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=[...]

要使用预签名网址,请应用以下 CloudFront 设置:

  1. 将 OAC 签名行为设置为不签署请求
  2. 将 CloudFront 分配源请求策略设置为源请求设置Headers – None; Cookies – None; Query strings – All
  3. 将缓存策略设置为 Headers – None; Cookies – None; Query strings – None

在 AWS CloudTrail 中,从 S3 预签名 URL 下载的 GET 请求显示为生成预签名 URL 的身份。

如果您使用 AWS 开发工具包访问 S3 对象,则必须更改代码以使用预签名 URL。改用常规 HTTPS 请求,然后使用新的 CloudFront URL。

确认您使用的是适用于 Amazon S3 的现代加密协议

要测试您的新策略,请使用以下示例 curl 命令使用特定的传统协议发出 HTTPS 请求:

curl https://${CloudFront_Domain}/image.png -v --tlsv1.0 --tls-max 1.0

示例 curl 命令使用 TLS 1.0 向 CloudFront 发出请求。这将使用 TLS 1.2 连接到 S3 源并成功下载文件。

最佳做法是使用 AWS CloudTrail Lake 来识别与 AWS 服务端点的较旧 TLS 连接。您可以配置 CloudTrail Lake 事件数据存储以捕获管理事件或数据事件。CloudTrail Lake 中相应的 CloudTrail 事件显示了 TLS 版本 1.2,这证实了您的客户使用现代安全策略连接到 Amazon S3。


AWS 官方
AWS 官方已更新 5 个月前