网络安全现状(Anselm Hannemann 访谈)

Avatar of Robin Rendle
Robin Rendle

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费额度!

Anselm Hannemann 最近发布了一篇关于一些前端开发人员可能对网络安全存在误解的文章。 由于我对这些问题有很多疑问,我想到要采访 Anselm,了解他对设置 HTTPS 所面临的令人惊讶的复杂性的看法。 我们将讨论一些问题,例如生成证书以及我们如何更好地理解许多开发人员(包括我自己)对 Cloudflare 等第三方服务持有的相互矛盾的观点。

对于那些不熟悉网络安全的人来说,您能描述一下 HTTP 和 HTTPS 之间的区别吗?

当然! HTTP 和 HTTPS 之间的主要区别很简单:HTTP,或称超文本传输协议,是我们用来提供网站和传输数据的默认协议。 但是,这些信息以非保护的、未加密的方式发送。 另一方面,HTTPS 结合了 HTTP 和 TLS(这是一种加密协议),以便通过加密来保护通过网络发送的数据。

您可能想知道,如果内容已经是公开的,为什么要加密到您网站的连接。 假设您使用 CMS(如 WordPress 或 Craft)来制作您的网站。 如果您通过 HTTP 登录到后端,您的凭据将以明文形式发送到服务器。 因此,任何截取您 WiFi 或互联网连接的人都可以访问您的 CMS(这真的非常容易——想想咖啡馆中的公共 WiFi)。 不过,不仅如此,HTTPS 还可以保护您免受获取错误内容的风险。 如果 HTTPS 设置正确,黑客将无法再劫持 DNS 以在您的域上提供不同的内容。 使用 HTTPS,您的计算机上的软件也不可能注入广告或将恶意软件注入网页。

您可以将 HTTPS 视为 HTTP 的更安全的版本,它可以防止数据泄露给公众,也可以防止您成为网络钓鱼的受害者。

为什么我们需要 SSL 证书来让浏览器知道连接是安全的?

首先,虽然您会发现许多人仍然在谈论“SSL”,但今天我们使用“TLS” 作为通过 HTTPS 发送信息时的加密方法。“SSL” 是一种旧方法,不再应该使用。HTTPS 通常与证书一起使用,您可以从您的主机公司获得这些证书,以便在 HTTP 协议中创建一个安全的、加密的通道来发送数据。 为了加密数据,您需要一个私钥和一个公钥。

为了使此方法有效,您需要在您的服务器上有一个所谓的“X.509”证书,该证书包含有关站点真实性的信息,并由根证书颁发机构(Let’s Encrypt、StartSSL 或类似机构)批准。

另一方面,所有浏览器都内置了一组已知且可信的根证书颁发机构。 这样做是为了提供更方便的用户体验——用户无需查看证书并批准它即可建立与站点的连接。 您可能在某个时候看到过浏览器弹出一个窗口,询问您是否要信任网站连接,因为它正在使用未知身份。 发生这种情况是因为证书不是由官方的、可信的机构创建的。 当然,这里省略了许多复杂的细节,因此,如果您有兴趣获取有关特定功能或技术的更多信息(我们会在本文底部链接一些信息),请务必阅读更详细的资源。

浏览器需要这些证书来验证密钥是否匹配,这确保了服务器、客户端或两者之间任何内容都没有被拦截,并且(意外地或故意地)泄露了您的宝贵数据。 这听起来非常安全,但细节中存在一些问题,这些问题仍然可能允许攻击者拦截客户端和服务器之间的连接。 HTTPS 不是万能药,但它确实使获取您的信息变得更加困难。

正如您的文章所述,我也天真地以为我所要做的就是在我的服务器配置文件中将我的网站重定向到https,然后告诉 Cloudflare 切换到 HTTPS。 您能描述一下为什么情况并非如此吗?

这并不完全错误。 因此,使用 Cloudflare 等服务,事情就变得稍微复杂一些。 它们提供了许多服务,例如:DNS 托管、性能优化和安全增强功能。 但是,许多人注册 Cloudflare 是因为他们提供“免费 SSL”。 实际上,这是一个很棒的功能,因为您希望通过 HTTPS 提供所有内容,因此您的 CDN 也应该支持 HTTPS。

不幸的是,大多数人都不了解的是,他们只能为其连接的一部分提供此服务。 这意味着他们开始在自己的服务器上使用 HTTPS,然后从那里向客户端提供内容。 如果您的网站(所谓源主机)不支持 HTTPS,这意味着数据在您的源和 Cloudflare 之间完全不受保护。 更糟糕的是,这会让用户以为网站和在网站上输入的数据已加密并受到保护,而实际上并非如此。 Cloudflare 无法修改您的服务器上的设置,因此他们只能尽力使事情更安全。 您仍然需要确保为源服务器上的数据提供安全保障。 这就是大多数人无法理解的地方。

如果您正确地完成了第一步——在您的源服务器上启用了 HTTPS——那么事情就会好一点。 在这种情况下,您可以告诉 Cloudflare 仅通过 HTTPS 连接到您的源,并且仅通过 HTTPS 向客户端提供内容。 现在我们还有一个问题:Cloudflare 的完整 SSL 不会验证源证书——它只是使用它,因此它可能无效、自签名或恶意。 至少这意味着服务器之间的连接始终由 HTTPS 保护。 Cloudflare 还提供了所谓的“完整 SSL 严格模式”,它会验证证书本身,但这更像是“基本 SSL”,因为您无法确保客户的数据已加密并安全。

Cloudflare(或任何其他第三方服务)位于浏览器和服务器之间,并优化(即修改)内容以进行交付,或防止攻击您的服务器。 问题是数据在 Cloudflare 上时未加密。 HTTPS 适用于传输,但不是对实际发送数据的端到端加密。 这意味着所有内容在第三方服务的机器上都会暂时被解密。 即使您完全信任公司本身以及您的(和您客户的)数据,问题是另一个第三方可能会获得对这些流量优化服务器的访问权限,并读取数据或修改数据,从而导致源或客户端获得修改后的内容。

如果可以,您还应该启用 HSTS(HTTP 严格传输安全)。 您只需在您的服务器配置中添加规则以设置此标志。 如果您设置了此标志,浏览器只会通过 HTTPS 连接到指定域,持续时间为给定的时间段。 时间段应设置为非常长的时间,例如 Twitter 将其设置为 20 年,以避免在他们的服务器受到攻击时更改此规则。 您也可以选择在此规则中包含子域。

最后,为了防止您的网站因受损的根证书颁发机构而被利用,您可以设置 HPKP(HTTP 公钥固定),这将弥合 HTTPS 安全性的最后漏洞。 不幸的是,如果您在此处做错了什么,后果将非常严重,并且可能意味着您的网站将无法再访问您设置的时间段(不应该太短)。 您可以在Scott Helme 的这篇很棒的文章中阅读有关此问题以及如何设置 HPKP 的更多信息。

Let’s Encrypt 在生成证书方面似乎是朝着正确方向迈出的重要一步,但这仍然需要命令行知识。 为什么基本网络安全如此复杂? 为什么没有更简单的解决方案来解决这些问题?

哦,是的,很高兴终于看到 Let’s Encrypt 在这方面取得了进展。 HTTPS 自 1994 年就已存在,因此我很高兴看到人们终于开始努力简化设置 HTTPS 的过程。 我认为 Let’s Encrypt 只是一个开始。

谈到这项特定服务。 它刚刚进入公开测试阶段。 目前,它仅适用于 CLI,并且在没有 root 权限的情况下运行时非常有限。 因此,虽然看到事情变得更简单很棒,但仍然存在太多障碍需要克服。

我迫切期待所有主机公司开始为任何域提供免费的 HTTPS,并提供超简单且自动化的设置流程。 因为,说实话,今天正确设置 HTTPS 非常复杂,即使对于精通技术的人来说也是如此。

您认为谁应该负责网站安全?前端开发人员应该花更多时间学习这些东西吗?或者,托管公司应该负责找到更优雅的技术解决方案来解决这个问题——例如,完全不提供 HTTP 访问权限?

这是一个复杂的问题,无法轻易解决。在理想情况下,为域名正确设置 HTTPS 应该像在 Web 主机界面中点击一下,或者对于服务器管理员来说是服务器上的一个命令。我们离这个目标还有很长的路要走。在我们达到这一点之前,我们需要开发者来解决这个问题。

作为一个全栈或后端开发人员,您应该负责在服务器上设置证书。作为一个前端或全栈开发人员,您应该负责默认启用 HSTS 并强制使用 HTTPS,确保合适的 内容安全策略,以及其他安全措施。每个开发人员,无论其职位如何,都有义务确保构建的项目为用户创建一个安全且加密的环境。

关于不再提供 HTTP——当我们解决了上面描述的仍然存在的问题时,我们再讨论这个问题。在此之前,我不认为我们应该试图“弃用” HTTP,尤其是在世界上仍然存在大量的与硬件、密码支持和软件相关的遗留问题,而这些问题需要在只有 HTTPS 的世界中消失。

您能推荐一些资源,以便我可以了解更多关于网络安全的信息?

幸运的是,这些主题有许多有用的博客文章,覆盖面很广。一般来说,您应该阅读 Scott Helme 撰写的文章,以详细了解特定安全功能以及如何在您的网站上启用它们。他还创建了 securityheaders.io,这是一个工具,可以检查您的网站安全性并提供改进建议。

如果您想开始在您的网站上使用 Let's Encrypt,那么 Tim Kadlec 的 入门文章 是一个好主意,他的另一篇文章 介绍如何使用 Let's Encrypt 启用 HSTS 也值得一看。

最后,如果您想了解更多信息,请查看 Troy Hunt 撰写的安全链接列表。如果您想了解基本技术的概述,您也可以在维基百科上找到很好的解释。

感谢 Anselm!