Назад | Перейти на главную страницу

Проблема с разрешениями: почему в моем втором пуле php-fpm пользователь не нужен?

Я запускаю 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