我使用php-fpm自定义编译的Apache 2.4.17运行FreeBSD 10.2。 默认池( [www]
,几乎是一个股票php-fpm设置)在用户/组nobody
/ nobody
。 Apache在用户/组daemon
/ daemon
。 它可以很好地连接到一个插槽,有几个不同的站点都运行在库存池中。 他们是低优先级的网站使用PHP的东西,如显示时间。
从长远来看,我想制定一些更好的特权分离。 我在用户rcuser
,group rcuser
(基本上是一个普通的FreeBSD shell帐户)拥有的单独的虚拟主机上创build了一个roundcube安装池。 根据习惯,我将networking虚拟主机放在/usr/vhosts/
,所以这个网站会通过/usr/vhosts/webmail/htdocs/
存储到/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可以访问它,我在每个文件和目录上创build了一个ACL,为daemon
等价地访问/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 {} \;
想到这将工作,但它没有工作,给我一个文件没有find错误,当我试图加载Roundcube。
接下来我尝试的是让other
权限读取文件和rx访问目录。 这工作。 Roundcube运行良好,但这显然意味着其他用户可以读取其中的文件并查找敏感信息,如MySQL密码。 不是真的想要我想要的。
所以,我做的下一件事是find /usr/vhosts/webmail/ -exec chmod o-rwx {} \;
删除宽松的权限,但保持原始的rcuser
权限和daemon
ACL完好无损。 为其他用户,并尝试找出问题所在。 我记得我创build的第一个池以用户nobody
身份运行,并find /usr/vhosts/webmail/ -exec -exec setfacl -m user:nobody:rx {} \;
。 这工作。 出于某种原因,php-fpm希望用户nobody
在第二个池的目录中读取和执行访问。
所以, ps -maux
显示php-fpm正在正确的用户rcuser
下运行这个池。 这对我来说并不是世界上最大的问题,但是我不确定当我开始在客户端站点上部署这个php-fpm设置时可能会产生什么样的安全隐患。 另外,一个额外的和看似无关的ACL担心是一个烦恼。
有什么我可以做,使用户nobody
不需要此ACL?
噢,好吧,我很高兴把这一切都写出来,因为我觉得这是一个答案。 使用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 {} \;
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