(Примечание: если вы знакомы с настройками 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
Чтобы разрешить доступ к этим веб-сайтам, следующий VirtualHost настроен в 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
это 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 и поиск MySQL в DBD на самом деле плохо взаимодействуют:
/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
Я не уверен, понял ли я ваш вопрос, но если вы пытаетесь ограничить выполнение и доступ между разными пользователями, одновременно удаляя разрешение на чтение у других и разрешая www-данным доступ к этим файлам, вы можете попробовать сделать следующее:
Suphp олицетворяет выполнение скрипта с помощью setuid, он будет основан на разрешениях файловой системы после сравнения со значением suPHP_UserGroup. Использование расширенных списков управления доступом позволит пользователю www-data получить доступ ко всем файлам, но не разрешит выполнение сценариев php, поскольку это не указано в директиве suPHP_UserGroup.
Вам нужно будет добавить параметр acl в файловую систему / home (можно добавить его в fstab и перемонтировать файловую систему) перед добавлением расширенных списков управления доступом к файлам и папкам.
Вы можете получить больше информации о setfacl на его странице руководства (http://linuxcommand.org/man_pages/setfacl1.html), он довольно полный.