suPHP и Apache DBD: изменить только GID
(Примечание: если вы знакомы с настройками suPHP и хотите пропустить детали вопроса, в конце вы найдете краткое объяснение того, чего я пытаюсь достичь)
В настоящее время я настраиваю машину для размещения нескольких веб-сайтов, принадлежащих нескольким пользователям. Для удобства эти пользователи хранятся в базе данных MySQL. libnss-mysql
а также pam-mysql
используются для соединения этого бэкэнда и Linux, что позволяет этим пользователям входить в систему и использовать сервисы машины. Каждый пользователь, хранящийся в базе данных MySQL, принадлежит users
группа.
Каждый из этих пользователей получает домашний каталог под /home/users
, Например, пользователь test
файлы можно найти в /home/users/test
, Этот каталог имеет следующие права собственности / разрешения:
drwx--x--- test www-data /home/users/test
Аналогичным образом, индекс веб-сайта (и другие файлы) отображают следующие разрешения:
-rw-r----- test www-data /home/users/test/index.php
-rw-r----- test www-data /home/users/test/robots.txt
Чтобы разрешить доступ к этим веб-сайтам, следующий виртуальный хост настроен в Apache, используя DBD и полагаясь на серверную часть MySQL.
<VirtualHost *:80>
ServerName *
DBDriver mysql
DBDParams host=localhost,user=user,pass=pass,dbname=db
DBDocRoot "SELECT document_root FROM users WHERE domain=%s" HOSTNAME
</VirtualHost>
Если домен связан с test
is example.com, Apache будет использовать DBD для сопоставления этого домена с /home/users/test
и предоставить его содержимое. Например, example.com/index.php передаст индекс интерпретатору PHP, а example.com/robots.txt заставит Apache доставить файл в виде статического содержимого.
Теперь, чтобы защитить своих пользователей друг от друга, я хотел бы ограничить права их PHP-скриптов. При вышеуказанной настройке PHP-скрипты проходят через Apache и интерпретируются mod_php
, Дело в том, что процесс Apache запущен www-data:www-data
, который дает доступ ко всем домам к любому сценарию.
Чтобы предотвратить это, я решил установить suPHP, но вот моя проблема: поиск suPHP и DBD MySQL на самом деле плохо взаимодействует:
- Если я компилирую suPHP в параноидальном режиме, я должен установить статического пользователя и группу для всех запросов. Тем не менее, сценарии в
/home/users/test
должен быть запущен какtest:users
в то время как те, в/home/users/othertest
должен быть запущен какothertest:users
,
Вот где проблема возникает в конфигурации:
<VirtualHost *:80>
ServerName *
suPHP_Engine on
# The user is stored in the database, it can't be set statically.
suPHP_UserGroup ??user?? users
DBDriver mysql
DBDParams host=localhost,user=user,pass=pass,dbname=db
DBDocRoot "SELECT document_root FROM users WHERE domain=%s" HOSTNAME
</VirtualHost>
Если я скомпилирую suPHP в режиме владельца, то все PHP-скрипты выполняются как
test:www-data
вместоtest:users
, Это также обеспечит привилегии во всех домашних каталогах.Если я установлю все файлы на
test:users
владение в/home/users/test
(и использовать режим владельца), тогда веб-сервер больше не сможет получить к нему доступ, даже для доставки статического содержимого.
В общем
Можно ли как-то комбинировать DBD MySQL и suPHP и добиться чего-то между параноидальным режимом и режимом владельца? Мне нужно изменить исполняющую группу с www-data
в users
(режим параноика), но исполняющий пользователь должен быть владельцем сценария (режим владельца). Простым способом:
# The following script must be interpreted as test:users.
-rw-r----- test www-data /home/users/test/index.php
# The following script must be interpreted as othertest:users.
-rw-r----- othertest www-data /home/users/test/index.php
1 ответ
Я не уверен, что понял ваш вопрос, но если вы пытаетесь ограничить выполнение и доступ между разными пользователями, одновременно удаляя разрешение на чтение у других и позволяя www-данным получать доступ к этим файлам, вы можете попытаться сделать следующее:
- Компилировать suphp с параноидальным сетид-режимом
- Используйте конфигурацию виртуального хоста и разрешения, которые у вас уже есть
- Используйте расширенные acls для предоставления разрешения на чтение пользователю www-data в указанных папках (setfacL)
Suphp олицетворяет выполнение скрипта с помощью setuid, он будет основан на разрешениях файловой системы после сравнения со значением suPHP_UserGroup. Использование расширенных acls позволит пользователю www-data получить доступ ко всем файлам, но не разрешит выполнение скриптов php, так как это не указано в директиве suPHP_UserGroup.
Вам нужно будет добавить опцию acl в вашей файловой системе /home (добавьте ее в fstab и перемонтируйте файловую систему), прежде чем добавлять расширенные acl для файлов и папок.
Вы можете получить больше информации о setfacl на его man-странице ( http://linuxcommand.org/man_pages/setfacl1.html), она довольно полная.