Я запускаю FreeBSD 10.2 со скомпилированным Apache 2.4.17 с php-fpm. Пул по умолчанию ([www]
, почти стандартная установка php-fpm) выполнялась для пользователя / группы nobody
/nobody
. Apache работает для пользователя / группы daemon
/daemon
. Он отлично работает при подключении к сокету с несколькими разными сайтами, работающими в пуле запасов. Это сайты с низким приоритетом, использующие PHP для таких вещей, как отображение времени.
В конечном итоге я хочу разработать лучшее разделение привилегий. Я создал пул для установки roundcube на отдельном виртуальном хосте, принадлежащем пользователю rcuser
, группа rcuser
(в основном обычная учетная запись оболочки FreeBSD). По привычке я размещаю веб-хосты в /usr/vhosts/
, поэтому этот сайт переходит на /usr/vhosts/webmail/
с самим приложением, хранящимся в /usr/vhosts/webmail/htdocs/
. Все дерево веб-почты принадлежит пользователю и группе 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
эквивалентный доступ к /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 {} \;
Подумал, что это сработает, но это не сработало, и при попытке загрузить Roundcube я получил ошибку «файл не найден».
Следующее, что я попробовал, - это дать 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?
О, хорошо, что я все это написал, потому что я думаю, что это вдохновило на ответ. Пул по умолчанию использовал 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