使网站成为 HTTPS 的目标之一是防止两个端点之间传输的数据被外部方拦截,从而被修改,如中间人攻击,或者使数据不被被盗并用于不良目的。在公共互联网上,两个端点之间传输的任何数据都需要受到保护。
在专用网络上,这种需求并不是那么大。许多服务确实只在专用网络上的 HTTP 上运行就可以了。但是,有几点需要考虑:
确保未使用的端口被阻塞:
虽然您可能有一个 NGINX 反向代理在端口 443 上侦听,但端口 80 是否被阻止,或者仍然可以通过 HTTP 访问这些站点?
服务的其他端口是否也被阻止?假设您的 Web 服务器运行在 8080 端口上,并且 NGINX 反向代理将某些流量转发到 localhost:8080,该站点仍然可以通过http://example.com:8080 或https://example.com:8080 访问吗?防止这种情况的一种方法是使用防火墙并阻止您不打算接受流量的任何端口上的所有传入流量。如果您添加了需要打开该端口的服务,您以后可以随时取消阻止它们。
同一服务器上的其他服务可以访问内部服务
下一个考虑因素与可能在服务器上运行的其他软件有关。虽然它在私有生态系统中,但在服务器上运行的任何服务都可以访问 localhost:8080。由于反向代理和 Web 服务器之间的流量没有加密,即使需要授权来验证 localhost:8080,也可以嗅探该流量。流氓服务需要做的就是监视端口并等待用户登录。然后该服务可以捕获两个端点之间的所有内容。
减轻间谍软件造成的危险的一种策略是使用虚拟化将单个服务器分成逻辑服务器,或者对不相关的事物使用不同的硬件。这至少将事情分开,以便负责应用程序 A 的人不会认为服务 X 可能是运行应用程序 B 的团队正在使用的东西。任何不合适的地方都更有可能脱颖而出。
例如,公司网站和内部 wiki 可能不属于同一台服务器。
通过限制服务器的工作,我们可以越简单地在服务器上进行设置和配置,我们就越容易关注服务器上发生的事情并防止数据泄露。
使用良好的安全实践
在服务器上使用良好的安全最佳实践。例如,不要以 root 身份运行。使用非 root 用户执行管理任务。对于任何长期运行的服务,请勿以 root 身份运行它们。
例如,NGINX 能够以用户 www-data 的身份运行。对于不同服务的特定用户,我们可以创建组并将不同的用户分配给他们,然后使用 chown 和 chmod 修改文件所有权和权限,以确保这些服务只能访问他们需要的内容,仅此而已。例如,我经常想知道为什么 NGINX 需要对日志的读取权限。从理论上讲,它真的应该只需要对它们进行写访问。如果此服务以某种方式受到损害,它可能做的最糟糕的事情就是将一堆垃圾写入日志,但攻击者可能会发现他们在从他们那里检索敏感信息时会束手无策。
localhost SSL 证书通常仅用于开发
虽然我不建议将其用于生产,但有一些方法可以让 localhost 使用 HTTPS。一种是带有自签名证书。另一个使用名为mkcert 的工具,它可以让您成为自己的 CA(证书颁发机构)来颁发 SSL 证书。后者是一个很好的解决方案,因为浏览器和其他服务将隐式信任生成的证书,但即使是 mkcert 的作者,普遍的共识是,这仅推荐用于开发目的,而不是生产目的。我还没有为生产中的 localhost 找到一个好的解决方案。我认为它不存在,根据我的经验,我从未见过有人担心它。