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

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

Чтобы разрешить доступ к этим веб-сайтам, следующий 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 на самом деле плохо взаимодействуют:

Вот где возникает проблема в конфигурации:

<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>

В целом

Есть ли способ объединить 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 с параноидальным setid-режимом
  • Используйте конфигурацию виртуального хоста и разрешения, которые у вас уже есть
  • Используйте расширенные списки контроля доступа, чтобы предоставить пользователю www-data разрешение на чтение в указанных папках (setfacL)

Suphp олицетворяет выполнение скрипта с помощью setuid, он будет основан на разрешениях файловой системы после сравнения со значением suPHP_UserGroup. Использование расширенных списков управления доступом позволит пользователю www-data получить доступ ко всем файлам, но не разрешит выполнение сценариев php, поскольку это не указано в директиве suPHP_UserGroup.

Вам нужно будет добавить параметр acl в файловую систему / home (можно добавить его в fstab и перемонтировать файловую систему) перед добавлением расширенных списков управления доступом к файлам и папкам.

Вы можете получить больше информации о setfacl на его странице руководства (http://linuxcommand.org/man_pages/setfacl1.html), он довольно полный.