权限问题:为什么我的第二个 php-fpm 池中需要用户 nobody?

权限问题:为什么我的第二个 php-fpm 池中需要用户 nobody?

我正在运行 FreeBSD 10.2,带有自定义编译的带有 php-fpm 的 Apache 2.4.17。默认池([www],几乎是常规的 php-fpm 设置)在 user/group nobody/上运行nobody。Apache 在 user/group daemon/上运行daemon。它可以很好地连接到套接字,其中几个不同的站点都在常规池中运行。它们是使用 PHP 进行显示时间等操作的低优先级站点。

从长远来看,我想制定一些更好的权限分离方案。我在用户rcuser、组rcuser(基本上是常规的 FreeBSD shell 帐户)拥有的单独虚拟主机上为 roundcube 安装创建了一个池。按照习惯,我将 Web 虚拟主机停放在 中/usr/vhosts/,因此此站点转到/usr/vhosts/webmail/,应用程序本身存储在 中/usr/vhosts/webmail/htdocs/。整个 Webmail 树属于用户和组 rcuser。此树中的目录均具有 750 个权限,文件具有 640 个权限。池如下所示:

[rcuser]
user = rcuser
group = rcuser
listen = /var/run/php5-fpm-rcuser.sock
listen.owner = rcuser
listen.group = rcuser
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.min_spare_servers = 1
pm.start_servers = 2
pm.max_spare_servers = 3

为了让 Apache 能够访问它,我在每个文件和目录上创建了一个 ACL,赋予它及其子目录daemon同等的访问权限。基本上,这意味着这样做, 我认为这样做可行,但它没有奏效,当我尝试加载 Roundcube 时,出现了文件未找到错误。/usr/vhosts/webmail/find /usr/vhosts/webmail/ -type d -exec setfacl -m user:daemon:rwx {} \;find webmail/ -type f -exec setfacl -m user:daemon:rw {} \;

我接下来尝试的是授予other权限位对文件的读取权限和对目录的 rx 访问权限。这有效。Roundcube 工作得很好,但这显然意味着其他用户可以读取其中的文件并找到敏感信息,例如 MySQL 密码。这不是我想要的。

因此,我接下来要做的就是find /usr/vhosts/webmail/ -exec chmod o-rwx {} \;删除自由权限,但保留原始rcuser权限和daemonACL。对于其他用户,并尝试找出问题所在。经过一番折腾,我记得我创建的第一个池以用户身份运行nobody并执行了find /usr/vhosts/webmail/ -exec -exec setfacl -m user:nobody:r-x {} \;。这有效。出于某种原因,php-fpm 希望用户nobody对第二个池的目录具有读取和执行访问权限。

因此,ps -maux显示 php-fpm 正在以正确的用户身份运行此池rcuser。这对我来说不是世界上最大的问题,但当我开始在客户站点上部署此 php-fpm 设置时,我不确定它可能会带来什么安全隐患。此外,担心额外的、看似无关的 ACL 也是一件烦人的事情。

我能做些什么让用户nobody不需要这个 ACL?

答案1

哦,好吧,很高兴我把这些都写了出来,因为我认为它启发了一个答案。默认池使用 TCP,我希望我的新池使用 UNIX 域套接字。所以,我遇到了一个小语法问题。我不小心在 Apache 的代理设置行中包含了一些额外的废话。

ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm-rcuser.sock|fcgi://localhost:9000/usr/vhosts/webmail/htdocs/$1"

本来应该

ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm-rcuser.sock|fcgi://localhost/usr/vhosts/webmail/htdocs/"

它正在连接到第一个池,即使第二个池运行正常。该:9000端口指定和$1线路末端的部分必须到达。

因此,我修复了 Apache 并运行:

find webmail/ -exec setfacl -b {} \;清除 ACL 权限,然后find webmail/ -type d -exec setfacl -m user:daemon:rwx {} \;; find webmail/ -type f -exec setfacl -m user:daemon:rw {} \;按照我想要的方式设置它们。

这个设置看起来不错,所以希望它有一天能帮助那些正在努力解决 Apache vhost 权限问题的人。

我的长期目标是不再需要运行 FTPS 服务器或使用php_admin_value open_basedir

相关内容