AWS API 网关应阻止使用 TLS v1

AWS API Gateway should prevent use of TLS v1

参考AWS Cloudfront Documentation,AWS API网关支持TLS v1.0、v1.1、v1.2。

但我想将网关的加密协议限制为 TLS v1.1 和 v1.2 API。我在哪里配置这个? 我的 API 没有看到任何云端分布。网关资源页面没有指定安全协议的选项。

我的 API 在过去 2 年中使用自定义域 运行 在生产中。 知道如何将我的 API 限制为仅在 API 网关中使用 TLS V1.1 和 V1.2 协议吗?

您可以在 CloudFront 分发列表中创建 API 网关分发。如果您的 API 网关源具有 HTTPS,您可以指定在云端和 API 网关之间使用哪种类型的 TLS 协议。在 viewer/client 和 cloudfront 之间,您可以在 CloudFront 配置的常规部分 > 安全策略中指定 TLS 协议和套件。此配置仅在您将自定义 SSL 与 SNI 结合使用时可见。您可以选择:

  1. TLSv1
  2. TLSv1_2016
  3. TLSv1.1_2016
  4. TLSv1.2_2018

为了让网关 API 和额外的云前端分发正常工作,我们需要

  1. 从 AWS 控制台,在 API 网关下转到 自定义域名 并删除映射的条目。
  2. 使用
  3. 创建一个新的云端分布

云端设置

  • 源域名作为你的入口API端点https://abcdfefg.execute-api.us-east-1.amazonaws.com
  • 仅 HTTPS 的查看器协议策略
  • 源 SSL 协议为 TLSv1.2、TLSv1.1(取消选中 TLSv1)
  • 备用域名下添加 CNAME 条目以引用自定义域名
  • 和其他一些默认值 完成上述更改后,访问 https 上的自定义域名将强制执行 Cloudfront distribution.
  • 中定义的 TLS 安全设置。

我刚刚一直在广泛地研究这个问题,并且通过大量的试验和错误,我可以记录我认为是当前最佳解决方案。 suman j 的回答是 2017 年 10 月的最佳解决方案,但它确实有局限性,而且 AWS 从那时起也在不断发展。

那么限制是什么?

如果您将 Lambda 与 API 网关一起使用并删除自定义域名,则手动创建 CloudFront 分配并关联 Lambda 函数需要特定的 Lambda 版本号。也就是说,它不支持别名。这对于 CI/CD 是有问题的,因为版本号会不断变化。但是,API 网关自定义域名基本路径映射支持别名,因此最好继续使用这些别名。

那么 AWS 是如何发展的?

截至 2017 年 11 月,API Gateway 支持在自定义域名中创建区域端点。这些端点不创建 CloudFront 分配,因此优化了将您自己的 CloudFront 分配放在它们前面的策略,以防止使用 TLS v1.0。

那么我该如何设置呢?

我用来执行此操作(通过控制台)的步骤如下。请注意,您可能需要更改某些设置以支持您的特定应用程序。出于本文档的目的,假设您的 api 被命名为 api.example.com.

  1. 在 API 网关中,编辑您的自定义域名,添加区域配置,select 您的证书,然后单击保存。注意:对于区域 API,您需要使用来自与 API 相同区域的 ACM 证书。更多信息在这里:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-regional-api-custom-domain-migrate.html

  2. 复制新创建的区域端点的目标域名。 (例如d-abcdefg123.execute-api.us-east-1.amazonaws.com)

  3. 在 Route 53 或您的 DNS 提供商中,将 API 的映射从边缘优化的 CloudFront 目标域名更改为新创建的区域端点目标域名(即 d-abcdefg123.execute-api.us-东-1.amazonaws.com)。

  4. 传播 DNS 更改后,编辑自定义域名并通过单击 x 图标删除边缘优化端点。然后,这应该使您能够使用与 API 相同的 CNAME 创建一个新的 CloudFront 分配,而不会被 AWS 阻止。

  5. 在 API 网关中,创建一个新的自定义域名,域名 = regional-api.example.com,端点配置 = Regional 和 select ACM 证书。单击保存,然后根据当前 API 编辑并添加基本路径映射,然后单击保存。复制新创建的区域端点的目标域名。 (例如d-xyzabcd456.execute-api.us-east-1.amazonaws.com)

  6. 在 Route 53 或您的 DNS 提供商中,创建一个新的 CNAME 记录映射区域-api.example.com 到新创建的区域端点目标域名。 (即d-xyzabcd456.execute-api.us-east-1.amazonaws.com)

  7. 在 CloudFront 中创建一个具有以下设置的新分发:

来源设置:

  Origin Domain Name = regional-api.example.com
   

  After entering the above the following hidden fields should then be displayed:   

  Origin SSL Protocols = TLSv1.2 & TLSv1.1

  Origin Protocol Policy = HTTPS Only

默认缓存行为设置: (这些值是调用 API 的应用正常工作所需的值)

  Viewer Protocol Policy = Redirect HTTP to HTTPS
    

  Allowed HTTP Methods = GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE

  Cached HTTP Methods = OPTIONS

  Cache Based on Selected Request Headers = Whitelist
    

  Whitelist Headers = Authorization   


  Object Caching = Customize  

  Minimum TTL = 0

  Maximum TTL = 0

  Default TTL = 0 

  Forward Cookies = All
      

  Query String Forwarding and Caching = Forward all, cache based on all
    

  Smooth Streaming = No

  Restrict Viewer Access (Use Signed URLs or Signed Cookies) = No
    

  Compress Objects Automatically = No 
   

  Lambda Function Associations = None

 

分发设置:

  Price Class = Use All Edge Locations
   

  AWS WAF Web ACL = None
     

  Alternate Domain Names (CNAMEs) = test-api.example.com
     

  SSL Certificate = Custom SSL Certificate (example.com)
   

  Custom SSL Client Support = Only Clients that Support Server Name Indication (SNI)
    

  Security Policy = TLSv1.1_2016 (recommended)
   

支持的 HTTP 版本 = HTTP/2、HTTP/1.1、HTTP/1.0

  1. 在等待 CloudFront 分配创建完成时(平均 40 分钟),在 Route 53 或您的 DNS 提供商中创建一个新的 CNAME 记录映射 test-api.example.com 到新创建的 CloudFront域名(例如d123abcdefg.cloudfront.net)

  2. 分发创建完成后,根据 test-api.example.com

  3. 全面测试您的应用程序
  4. 如果测试一切正常,则将新 CloudFront 的备用域名 (CNAME) 更新为 = api.example.com。 (注意 - 这不会使其“生效”,为此需要进行以下 DNS 更改)

  5. 分发更新完成后(平均 40 分钟),然后在 Route 53 或您的 DNS 提供商中,将 api.example.com 的 CNAME 记录映射更新为新创建的 CloudFront 域名(即d123abcdefg.cloudfront.net)

  6. 如果一切正常,您现在可以删除 Route 53 / DNS CNA test-api.example.com 记录并删除 api.example.com API 网关自定义域名.

  7. 对于奖励积分,如果使用 Route 53,建议使用 A 和 AAAA 记录别名,而不是上面 Route 53 步骤(我已经完成)的 CNAME。这会略微降低成本,在一定程度上隐藏底层 CloudFront 分布并启用 IPv6 支持。

希望对您有所帮助! :-)

AWS 已宣布现在可以针对 edge-optimised API 网关实施进行配置:

对于看到此消息的任何人,您现在可以在 API 网关中为您的自定义域设置最低 TLS 版本 1.2:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-custom-domain-tls-version.html

截至目前,您可以通过为您的自定义域指定安全策略来实施最低 TLS 版本。支持的安全策略是 TLS1.0 和 TLS 1.2

  • TLS版本的最低版本API网关安全策略支持为TLSv1.0

  • 通过自定义域名推荐的安全策略是 TLSv1.2

  • 为了更好地控制 TLS 版本,请在您的帐户中创建 CloudFront 分配并使用区域 API 网关端点作为源。

最低 TLS 版本 1.3 只能通过自定义 CloudFront 分发。

参考:https://cloudnamaste.com/minimum-tls-version-for-api-gateway/