Я размещаю несколько сайтов с одного сервера, где каждый сайт имеет свой собственный каталог пользователей и 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 под своим собственным идентификатором пользователя. Инструкции здесь: