几年前,当我的多个网站同时被黑客入侵后,我开始研究,并在一些 SF 问题中看到了一个解决方案:PHP-FPM 池

基本上,这是我之后设计的结构:

长期以来,我一直非常有信心一切都比以前更加安全,因为如果一个网站以某种方式被黑客入侵,它永远不会影响同一主机上的其他网站。

但几个月前,我开始与一些 Docker 人员交谈,他们告诉我,我应该开始尝试使用容器并将我的解决方案迁移到完全 Docker 化的系统。他们建议我使用 Caddy。但在阅读了 Caddy 文档后,我注意到新结构如下所示:

基本上,我所看到的是,Caddy 服务器对所有文件具有完全不受限制的访问权限。与之前的 Nginx 不同,以前的 Nginx 似乎一切都是条块分割的,而在这里,如果 Caddy 服务器出现安全问题,似乎一切都可能受到损害。

我知道大多数情况下,大多数黑客攻击都来自端点上的编码错误,这意味着最薄弱的环节是隔离的 docker FPM 服务器。但如果 Caddy 被攻陷,它将泄露所有卷的完整信息

此时,我有两个问题:

  1. 由于很多人都在宣扬 Docker 是最安全的选择之一,我是不是忽略了什么?我觉得这比我以前的系统安全性稍差一些(虽然如果单个主机中的整个文件系统都受到威胁,那么主机中是否有文件权限限制就无关紧要了,因此从这个方面来看,Docker 确实更安全)

  2. 除了保持系统更新外,还有其他做法可以从文件访问/PHP 软件零日攻击角度使 Docker/Caddy/FPM 配置更安全吗?目前,我在 Caddy 和 FPM 之间有文件套接字,但我觉得将所有文件放在一个主机上会暴露太多整体信息。

4

  • 您当前的 Nginx/FPM 进程是否以相同或不同的 UID 运行?(以我有限的经验来看,PHP-FPM 无法提供静态文件,因此 Web 服务器无论如何都需要访问公共根目录;将其访问权限限制在 FPM 上是不可行的。)


    – 

  • 是的,我知道这一点,但内心从未真正理解它是如何工作的。NGINX 和 PHP-FPM 都有一个以 root 身份运行的主进程,然后分别以 nginx 和用户配置定义的用户身份运行的工作进程。我真的不知道 NGINX 工作进程如何与 nginx 用户一起访问目录中的文件,这些目录只能由与该 nginx 用户完全无关的用户:组访问。据我所知,nginx 主进程仅用于管理配置和工作进程,但我想知道它是否也用于管理那些静态文件。


    – 

  • 1
    取决于你谈论的是哪些文件?对于 PHP 脚本,Nginx 根本不访问它们;它只是将整个 HTTP 请求代理到 PHP-FPM。问题是当你有一些静态文件与 .php 文件混合在一起时……


    – 

  • 有趣:这次对话给了我一个解决问题的好主意


    – 


最佳答案
1

我找到了一个解决这个问题的方法。我主要担心的是 Caddy 或任何其他反向代理由于安全漏洞而访问 PHP 文件。

如果任何 FPM 容器中存在安全问题,也不会造成太大影响,因为它只会影响一个容器。但如果安全漏洞影响了反向代理容器,那么所有 FPM 容器共享的所有文件都将受到损害。

解决方案:对与配置元素相关的任何内容(主要是机密,如 SQL 机密)使用 docker 环境变量。然后从文件提取的角度来看,反向代理容器中的 PHP 文件将变得完全无用。

事实上,除非我错了,否则这将使一切比我以前的非docker配置更加安全。