第八章:HSTS和CAA

曾几何时,需要TLS和X.509证书的网站是特殊的。理论上,用户注意到地址栏中的锁图标,并说:“啊哈!这是一家高档、值得信赖的机构,我可以向他们信任我的信用卡。” —— 证书意味着等级。

ACME和免费CA的出现使证书无处不在。每个人都可以使用这个锁图标,没有预算,甚至没有借口。即使是我们这些小作者也在我们的网站上使用TLS。Web浏览器开始将没有TLS的网站标记为“不安全”,不管这意味着什么。小锁图标再次毫无意义,可以安全地忽略。

然而,无处不在的TLS证书仍然为攻击者留下漏洞。解决这些差距的两个工具是HTTP严格传输安全(HTTP Strict Transport Security —— HSTS)和证书颁发机构授权(Certification Authority Authorization —— CAA)记录。这两种协议都不在TLS中运行,而是利用其他协议来支持TLS。

第八章:HSTS和CAAHTTP严格传输安全HSTS缺点部署HSTSHSTS Preload证书颁发机构授权

HTTP严格传输安全

降级攻击(downgrade attack)是指攻击者强制客户端的TLS连接使用损坏的(broken)算法、损坏的TLS版本或回退到未加密的通信。最著名的降级攻击是中间人攻击(man-in-the-middle),攻击者将受害者引导到攻击者运行的非TLS版本的网站,并将用户请求代理到真实的网站,在此过程中捕获所有数据。用户可能甚至不会注意到该网站不再使用TLS,大多数注意到它不存在的人都会对此不以为然。即使你的服务器将所有HTTP连接重定向到HTTPS,也可以由能够控制你的客户端的人来代替你的重定向。

HTTP严格传输安全( HTTP Strict Transport Security —— HSTS)旨在通过通知客户端不存在非TLS版本的站点来抵御这些降级攻击。当web服务器向客户端发送HSTS响应头时,它告诉客户端只能通过TLS访问此站点。客户端会自动将任何非TLS请求重写为仅TLS。如果有人试图使用该客户端访问网站的HTTP版本,客户端会拒绝。当入侵者设置了他们的非TLS版本的网站并将受害者引导到那里时,浏览器会拒绝它。希望来自恼怒用户的电子邮件会提醒你有人在攻击你。

客户端将此标头以及Cookie和图像等其他每个站点的数据缓存数天。如果客户端刷新其缓存,它也会丢失HSTS设置。

HSTS缺点

启用HSTS后,您就可以提交了。缓存该标头的客户端将仅使用TLS连接到您的站点。如果你的证书有问题,很难。在处理此问题时,您可以将您的网站设置为vanilla HTTP,但之前访问过您的网站并缓存了HSTS标头的客户端将拒绝连接。您必须先解决TLS问题。您可能需要刷新浏览器缓存来调试该问题。

客户端将HSTS应用于主机上的每个网站,而不仅仅是主网站。如果我在运行 https://mwl.io ,但我也有未加密的网站 http://mwl.io:8080 ,打开HSTS会破坏我未加密的网站。即使用户手动键入 http:// ,客户端也会在其请求前放置 https:// 。一些应用程序使用专用web服务器在高编号端口上提供管理接口。如果这些web服务器不能使用TLS并且不接受证书,则您的客户端无法使用它们。但是,您可以使用同一IP地址的备用主机名来访问这些端口。

includeSubDomains 打开的情况下启用 https://mwl.io 的HSTS,意味着告诉浏览器只能在 www.mwl.iounencrypted.mwl.iomwl.io 的所有其他子域上使用HTTPS。

部署HSTS

在Apache和nginx等流行的web服务器上配置HSTS很简单。HTTP响应标头 Strict-Transport-Security 建立HSTS。它有三个子值。前两个,max-ageincludeSubDomains ,是最关键的。 max-age 值告诉客户端缓存头的秒数。一旦标头过期,客户端可能会再次尝试未加密的连接。 includeSubDomains 值告诉客户端头应用于所有子域。如果 mwl.io 发送HSTS, includeSubDomains 值告诉客户端HSTS也适用于 www.mwl.iohackersite.mwl.io 。使用这两个值部署HSTS。

如果您正在部署一个新网站,请立即对其进行HSTS,并在测试期间修复任何问题。将 max-age 设置为31536000秒(一年),并设置 includeSubDomains 。这里有一个Apache的例子。

在现有网站上启用HSTS更棘手。跳上HSTS列车,一路向前踩油门,感觉很诱人。你的网站已经运行TLS,为什么你不想一直使用它?在客户端缓存连接信息就像在疯狂的悬崖上爬绳子。一切都很顺利,直到你爬到一半,有人剪断了绳子。

我强烈建议你假设你现有的网站和互联网上的其他网站一样糟糕,部署HSTS会暴露出以前未知的问题。如果您组织的网站停机五分钟,会发生什么?一个小时?一天?当您首次在现有站点上部署HSTS时,将 max-age 设置为可生存的值。还设置了 includeSubDomains 。如果子域上的HSTS会破坏您的网站,您想立即知道。在实际负载下运行至少两次 max-age 。如果没有显示,则将其增加到一天、一周或一个月。

最后一个值 preload 告诉客户端该站点在Chrome预加载列表中。我们将在下一节讨论这个问题。在您准备将网站提交到该列表之前,切勿启用 preload

HSTS Preload

HSTS的一个问题是,它只有在客户第一次联系网站时才会生效。第一次访问我的网站的人可能会遭受中间人攻击,HSTS不会阻止它,因为客户端没有缓存头部列表。

Chrome包含一个始终使用HSTS的网站列表。它被称为 preload 列表,因为它被预加载到浏览器中。预加载列表中的主机的最小 max-age 为一年。许多其他浏览器使用Chrome列表;它已经成为事实上的标准。使用预加载列表的浏览器永远不会尝试访问网站的HTTP版本;它们始终且仅连接到TLS站点。

您可以将您的网站添加到此列表中。有一个网络表单。不过,一旦你被列入名单,你就永远在上面。是的,Chrome有一个表单可以将您从列表中删除。Chrome尊重该列表,但删除数月内不会到达Chrome用户,也可能永远不会到达其他浏览器的用户。将预加载列表视为单向行程。我的网站多年来一直使用TLS,而且我还没有将其中的大部分提交到预加载列表中。

一旦您要求Chrome将您的网站添加到预加载列表中,请将 preload 标头添加到HSTS配置中。

证书颁发机构授权

入侵者可能会尝试为您域中的主机获取X.509证书。无知或漠不关心的员工可能会试图从不符合您监管合规性的CA获得证书。证书颁发机构授权(Certification Authority Authorization —— CAA)DNS记录是CA可以为域颁发证书的公开声明。

当CA收到证书请求时,它会检查域中的CAA记录。如果CAA记录存在并指定了该CA,则可以颁发证书。但是,如果CAA记录指定了其他CA,则证书请求将被拒绝。如今,由于没有CAA记录,CA可以颁发证书。该记录最终将成为强制性的,因此我鼓励您在恶意git利用其缺失之前立即部署它们。如果您的证书颁发机构尊重CAA记录,他们会提供如何格式化记录的文档,让您使用他们的服务,而不是其他服务。

CAA记录具有如下格式:

mwl.io. IN CAA 0 keyword value

TLS的主要关键字是 issueissuewild 。对于这两种情况,该值都是证书颁发机构的正式名称。

issue 关键字表示允许指定的CA为此域颁发证书。如果您使用多个CA,则该区域需要多个问题记录。

issuewild 关键字表示指定的CA可以为此域颁发通配符证书。如果您使用通配符证书和标准证书,则需要 issueissuewild 语句。

要防止任何人颁发与该关键字匹配的证书,请使用分号。

该值必须与CA精确匹配。最简单的方法是查看CA的网站。

这是 mwl.io 的CAA记录。我允许一个CA —— Let's Encrypt颁发证书。我明确禁止颁发通配符证书。

在这里,Let's Encrypt可能会颁发标准证书,但不会颁发通配符证书。只有Miracle Max可以颁发通配符证书:

主机名继承域的记录,除非被其他CAA记录明确覆盖。

CAA记录可以帮助您实施组织策略,并可能防止入侵者对您的网络进行更深入的控制。如果您使用DNSSEC保护您的记录,它们最有效。

现在让我们看看如何调查TLS问题。