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), она довольно полная.

Другие вопросы по тегам