如何允许不使用 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. 选择创建分配
  3. 下,对于源域,从下拉列表中选择 S3 桶的 REST API 端点。
  4. 对于查看器协议策略,选择将 HTTP 重定向到 HTTPS
  5. 对于允许的 HTTP 端点,选择 ** GET、HEAD、OPTIONS** 以支持读取请求。
  6. 源访问部分中,选择源访问控制设置(推荐)。
  7. 选择**创建控件设置,然后使用默认名称。对于签名行为,选择签署请求(推荐),然后选择创建。**OAC 推荐设置会自动对查看器的请求进行身份验证。
  8. 在下拉列表中选择身份。创建分配后,更新桶策略以限制对 OAC 的访问。
  9. 默认缓存行为查看器下,为查看器协议策略选择将 HTTP 重定向到 HTTPS,并将其他设置保留为默认设置。
  10. 缓存键和源请求下,选择缓存策略和源请求策略(推荐)。然后,对于缓存策略,使用 CachingOptimized,对于源请求策略,使用 CORS-S3Origin
  11. 选择创建分配,然后等待其状态更新为已启用

需要提供已签名的请求才能访问您的 S3 桶

仅支持已签名的请求,从而为您的 S3 桶提高安全性。使用已签名的请求,OAC 会遵循您的身份验证参数并将其转发到 S3 源,然后该源会拒绝匿名请求。

要创建需要已签名的请求才能访问您的 S3 桶的 CloudFront 分配,请按照以下步骤操作:

  1. 打开 CloudFront 控制台
  2. 选择创建分配
  3. 下,对于源域,从下拉列表中选择 S3 桶的 REST API 端点。
  4. 对于查看器协议策略,选择将 HTTP 重定向到 HTTPS
  5. 对于允许的 HTTP 端点,选择 ** GET、HEAD、OPTIONS** 以支持读取请求。
  6. 源访问部分中,选择源访问控制设置(推荐)。
  7. 选中不签署请求选项,阻止所有未签名的请求。
    **注意:**阻止未签名的请求需要每个客户签署其请求,以便 S3 源可以评估权限。
  8. 创建自定义缓存策略,将客户的授权标头转发到源。
  9. 缓存键和源请求下,选择缓存策略和源请求策略(推荐)
  10. 选择创建策略
  11. 名称部分输入缓存策略的名称。
  12. 缓存键设置下,转到标头,然后选择包含以下标头
  13. 添加标头下,选择授权
  14. 选择创建

控制客户的安全策略

要控制 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. 常规选项卡上,选择编辑
  4. 对于备用域名(CNAME),选择添加项目,然后输入您的域名。
    **注意:**最佳做法是使用自定义规范名称记录(CNAME)来访问您的资源。使用 CNAME 可以更好地控制路由,并为您的客户提供更好的过渡方式。
  5. 对于自定义 SSL 证书,从涵盖您的 CNAME 的下拉列表中选择要分配给分配的自定义 SSL 证书。
    **注意:**有关安装证书的详细信息,请参阅如何配置我的 CloudFront 分配以使用 SSL/TLS 证书?
  6. 选择创建分配,然后等待其状态更新为已启用

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

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

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

如果您使用 AWS SDK 访问 Amazon S3 对象,则必须更改代码以使用常规 HTTPS 端点。此外,请确保使用新的 CloudFront URL。如果对象不是公共对象且需要更好的控制措施,则可以使用签名 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=[...]

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

  1. 将 OAC 签名行为设置为不签署请求
  2. 将 CloudFront 分配源请求策略设置为源请求设置标头 – 无;Cookie – 无;查询字符串 – 全部
  3. 将缓存策略设置为标头 – 无;Cookie – 无;查询字符串 – 无

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

如果您使用 AWS SDK 访问 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 官方已更新 1 年前