我正在运行 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
权限和daemon
ACL。对于其他用户,并尝试找出问题所在。经过一番折腾,我记得我创建的第一个池以用户身份运行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