如果配置了 SSL 的 Nginx 反向代理传递给没有 SSL 的 Web 服务器,会发生什么情况?

What will happen if a SSL-configured Nginx reverse proxy pass to an web server without SSL?

我使用 Nginx 来管理我的很多 Web 服务。它们监听不同的端口,但都被同域内的Nginx反向代理访问。比如访问RESTful-API服务器我可以用http://my-domain/api/,访问视频服务器我可以用http://my-domain/video.

我已经为 my-domain 生成了一个 SSL 证书并将其添加到我的 Nginx conf 中,所以我的 Nginx 服务器现在是 HTTPS -- 但那些原始服务器仍在使用 HTTP。

当我访问 https://my-domain/<path> 时会发生什么?这是否与在原始服务器上配置 SSL 一样安全?

使站点成为 HTTPS 的目标之一是防止两个端点之间传输的数据被外部方拦截以进行修改,如在中间人攻击中,或用于数据被盗并用于不良目的。在 public 互联网上,两个端点之间传输的任何数据都需要受到保护。

在专用网络上,这种需求不是很大。许多服务只在专用网络上的 HTTP 上执行 运行 就好了。但是,有几点需要考虑:

确保未使用的端口被阻止:

虽然您可能有一个 NGINX 反向代理侦听端口 443,但端口 80 是否被阻止,或者仍然可以通过 HTTP 访问网站?

服务的其他端口是否也被阻止?假设您的 Web 服务器 运行 在端口 8080 上,并且 NGINX 反向代理将某些流量转发到 localhost:8080,该站点是否仍然可以在 http://example.com:8080 or https://example.com:8080 访问?防止这种情况的一种方法是使用防火墙并阻止您不打算在其上接受流量的任何端口上的所有传入流量。如果您添加需要打开该端口的服务,您以后可以随时取消阻止它们。

同一服务器上的其他服务可以访问内部服务

接下来要考虑的是可能 运行 在服务器上安装的其他软件。虽然它在私有生态系统中,但服务器上的任何服务 运行ning 都可以访问 localhost:8080。由于反向代理和 Web 服务器之间的流量未加密,因此即使需要授权才能进行身份验证,也可以嗅探该流量 localhost:8080。流氓服务需要做的就是监视端口并等待用户登录。然后该服务可以捕获两个端点之间的所有内容。

减轻间谍软件造成的危险的一种策略是使用虚拟化将单个服务器分离为逻辑服务器,或者为不相关的事物使用不同的硬件。这至少将事情分开,这样负责应用程序 A 的人员就不会认为服务 X 可能是 运行ning 应用程序 B 团队正在使用的东西。任何不合适的地方都更有可能脱颖而出。

例如,公司网站和内部 wiki 可能不属于同一服务器。

我们通过限制服务器的工作来保持服务器上的设置和配置越简单,我们就越容易密切关注服务器上发生的事情并防止数据泄漏。

采用良好的安全措施

在服务器上使用良好的安全最佳做法。例如,不要 运行 作为 root。使用非 root 用户执行管理任务。对于任何 运行 长期存在的服务,不要 运行 它们作为 root。

例如,NGINX 能够 运行ning 作为用户 www-data。对于不同服务的特定用户,我们可以创建组并将不同的用户分配给他们,然后使用 chown 和 chmod 修改文件所有权和权限,以确保这些服务只能访问他们需要的内容,仅此而已。例如,我经常想知道为什么 NGINX 需要对日志的读取权限。从理论上讲,它确实应该只需要对它们进行写访问。如果此服务以某种方式受到损害,最坏的情况是向日志中写入一堆垃圾,但攻击者可能会发现他们在从日志中检索敏感信息时束手无策。

本地主机 SSL 证书通常仅用于开发

虽然我不建议将此用于生产,但有一些方法可以让本地主机使用 HTTPS。一种是带有自签名证书。另一个使用名为 mkcert 的工具,它可以让您成为自己的 CA(证书颁发机构)来颁发 SSL 证书。后者是一个很好的解决方案,因为浏览器和其他服务将隐含地信任生成的证书,但普遍的共识是,即使是 mkcert 的作者,也只建议将其用于开发目的,而不是生产目的。我还没有为生产中的本地主机找到一个好的解决方案。我认为它不存在,根据我的经验,我从未见过有人担心它。