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

Идеальная схема разрешений для нескольких сайтов Apache / PHP

Я размещаю несколько сайтов с одного сервера, где каждый сайт имеет свой собственный каталог пользователей и www в их домашнем каталоге. В настоящее время наш веб-сервер работает от имени пользователя nobody (99). Мы заметили, что для запуска нескольких популярных скриптов и движков им требуется доступ на запись к их собственным файлам.

Поскольку домашний каталог принадлежит пользователю, а не никому (99), какова лучшая политика или изменение в конфигурации хостинга, которое:

Спасибо за совет!

Вам следует подумать о расширенных ACL. Команда setfacl, поддерживаемая FreeBSD и Linux, позволяет вам определять более 1 пользователя / группы, которые имеют доступ к каждому файлу / каталогу. Затем вы можете дать пользователю / группе none разрешение на выполнение / home / home / user. затем читать и писать только в корне документов тех сайтов, где это требуется.

В противном случае вы можете просто изменить группу домашнего каталога каждого пользователя на none и использовать разрешения 710 для / home / username, а затем chown user: nobody и chmod 770 в корне документа.

Помните, что пользователю «никто» потребуется разрешение «выполнить» для каждого каталога между / и корнем документа (либо просмотреть конкретное разрешение, либо поле «другое»), а затем прочитать (и, возможно, записать) в корень документа. Вы можете запретить всем другим пользователям читать или выполнять каталог пользователей или корневой каталог документов. Нередко можно увидеть / home, где никто, кроме root, не имеет доступа на чтение, а все пользователи имеют только выполнение. тогда они могут попасть в / home / username, но не могут получить список других пользователей, существующих на сервере.

Вероятно, самый простой способ сделать это - использовать mpm-itk - для этого потребуется переключить mpms, что снижает производительность. Однако это позволит вам настроить другого пользователя для Apache для использования на VirtualHost и не потребует никаких других изменений конфигурации. Я опробовал его, он довольно прост в использовании, а производительность не снижается. какой ужас. YMMV конечно ...

Доверяют ли друг другу пользователи этих нескольких сайтов? Если это так, пользователям довольно легко справиться с этим самостоятельно. Все, что нужно сделать пользователю, это сделать соответствующий каталог доступным для всех / для записи с помощью

chmod o+wx dir
chmod o+w dir/files_webserver_should_edit*

Если пользователь хочет быть уверенным, что у него есть доступ к файлам, созданным в этом каталоге, он также может запустить

chmod g+s dir

так что файлы, созданные веб-сервером, никому не принадлежат, но находятся в группе пользователя (хотя сценарий PHP должен обязательно создавать файлы с групповым доступом). o+s сделает файлы принадлежащими пользователю, но это может запретить веб-серверу доступ к файлам, которые он создал, если права доступа к файлу неверны. Если некоторые файлы не должны быть доступны для записи веб-сервером, вы можете пойти дальше и

chmod o+t dir
chmod g-w dir/files_not_to_be_altered*

Если у пользователя есть доступ на запись к каталогу, но не к файлу в этом каталоге, он может удалить файл из каталога и создать новый, к которому у него ДЕЙСТВИТЕЛЬНО есть доступ на запись. Бит залипания (o + t) не позволяет пользователю удалить из каталога файл, которым он не владеет. С их помощью сценарий PHP может создавать новые файлы, а также обновлять и удалять файлы, которые они создают (так как они будут принадлежать «никому»), но не может редактировать «files_not_to_be_altered» и не может удалять их, поскольку они принадлежат «пользователь»).

Это дает пользователю контроль над тем, какие каталоги фактически доступны для записи веб-серверу, и не требует доступа root, поскольку он не меняет владельца.

Если пользователи не доверяют друг другу, тогда вам потребуется небольшое вмешательство root. Структуру каталогов каждого веб-сайта нужно будет изменить один раз, чтобы передать его право собственности:
Примечание: в этих инструкциях предполагается, что ничья группа также является никто, но в некоторых системах используется группа nogroup.

chown -R user:nobody /some/website
chmod -R g+rX,o-rwx /some/website

(заглавная X добавляет x доступ к каталогам)

Это сделает дерево каталогов доступным для пользователя и никого и лишит всех доступа. Пользователи могут действовать оттуда самостоятельно, предоставляя g+w доступ где угодно, но им придется использовать u+s вместо того g+s чтобы обеспечить им доступ к файлам, созданным веб-сервером. o+t будет работать по назначению.

Кроме того, у вас могут быть другие серверы, использующие none / nogroup ... для минимизации альтернативных методов атаки (эксплойт в какой-то другой службе, работающей, поскольку никто не дает злоумышленнику возможность писать на этих веб-сайтах) в большинстве систем есть выделенный пользователь веб-сервера / группа, под которой работает только веб-сервер.

chown -R :nobody root_of_all_sites
chmod g+rw -R root_of_all_sites

в основном вы делаете группы сайтов доступными для записи и никому не назначаете группу для чтения и записи в нее. вам может потребоваться периодически устанавливать это (если пользователи загружают новые файлы или используют другой механизм для этого - umask и т. д.)

Для достижения наилучшей производительности вы должны запускать сценарии PHP от имени отдельного пользователя и разделять файлы так, чтобы пользователь Apache имел к ним доступ только для чтения.

Самый простой - использовать SuPHP: http://www.suphp.org/

Другой вариант - запустить PHP в режиме CGI и убедиться, что Apache настроен на exec () для каждого CGI под своим собственным идентификатором пользователя. Инструкции здесь:

http://php.net/manual/en/security.cgi-bin.php