Виртуальный хостинг, PHP как модуль Apache
Добавлено: 2007-09-18 15:16:16
На этом сайте нашёл как настроить подобное, что PHP работает через CGI. Однако хотелось бы заставить PHP работать как модуль Apache. Частично задача решена, но остались явные дыры в безопасности и кой-какой глюк. Итак о реализации.
Пользователи заводятся в системе как обычно, без каких либо особенностей, разве что их домашние папки помещаются на отдельный раздел. Во-первых, это помогает избежать проблем в работе сервера из-за переполнения раздела, во-вторых, позволяет обезопасить сервер, т.к. данный раздел должен быть смонтирован с опцией SUIDDIR (зачем поясню позже).
Все домашние папки пользователей имеют права 4770, т.е. работает SUIIDDIR, полный доступ для пользователя, полный поступ для группы, всем остальным запрет. Папки пользователя принадлежат ему, а вот группа указывается www, т.е. той, от имени которой работает Apache. Т.о. всем пользователи и Apache (в том числе и PHP) имею права работать с файлами и папками. При чём при создании файлов и папок с домашнем каталоге мы имеем владельца для них user:www за счёт SUIDDIR.
Теперь о работе Apache. PHP работает в обычном режиме, т.е. фактически от www:www. Safe_mode можем не включать, разграничение пользователей происходит за счёт open_basedir. Тут поджидает первая засада, которую я так и не преодолел: при вызове внешних приложений они запускаются от имени www:www, что нам абсолютно ненужно. Выходов два:
1. Запрещать полностью запуск внешних программ.
2. Пропатчить PHP таким образом, чтобы при вызове внешних программ он запускал их через suexec (меня интересует имено этот вариант).
Работа CGI производится в обычном режиме, в настройках вируальных хостов используются директивы User и Group. Вот тут вторая засада. Поскольку мы используем нестандартные права на папки пользователей user:www suexec отказывается работать, т.к. видит, что группа чужая. Следовательно патчим suexec.c таким образом, чтобы не проводить проверку группы, либо сравнивать её не с текущим пользователем, а с gid пользователя Apache. Задача не такая сложная, тем более файл где копать нужно я уже указал.
Да, ещё нужно не забыть перед запуском Apache дать команду umask 007, дабы создаваемые файлы имели права типа 660, т.е. с запретом работы с файлом никому, кроме user и group.
Теперь о глюке, который также не смог преодолеть. Каким то странным образом при загрузке файлов на сервер файл принимается благополучно во временную папку при этом приобретая атрибуты user:www 0700. Вот тут то и есть засада - PHP после загрузки ничего не может сделать с файлом, поскольку для группы www возникает запрет. Откуда появилась umask 077 я так и не понял. При этом файлы, создаваемые PHP имею правильные атрибуты.
Итак, подводя итог, напишу о нерешённых проблемах:
1. Требуется патч для PHP, чтобы вызов внешних программ производился через suexec.
2. Требуется патч для правильной реализации Upload файлов.
Пользователи заводятся в системе как обычно, без каких либо особенностей, разве что их домашние папки помещаются на отдельный раздел. Во-первых, это помогает избежать проблем в работе сервера из-за переполнения раздела, во-вторых, позволяет обезопасить сервер, т.к. данный раздел должен быть смонтирован с опцией SUIDDIR (зачем поясню позже).
Все домашние папки пользователей имеют права 4770, т.е. работает SUIIDDIR, полный доступ для пользователя, полный поступ для группы, всем остальным запрет. Папки пользователя принадлежат ему, а вот группа указывается www, т.е. той, от имени которой работает Apache. Т.о. всем пользователи и Apache (в том числе и PHP) имею права работать с файлами и папками. При чём при создании файлов и папок с домашнем каталоге мы имеем владельца для них user:www за счёт SUIDDIR.
Теперь о работе Apache. PHP работает в обычном режиме, т.е. фактически от www:www. Safe_mode можем не включать, разграничение пользователей происходит за счёт open_basedir. Тут поджидает первая засада, которую я так и не преодолел: при вызове внешних приложений они запускаются от имени www:www, что нам абсолютно ненужно. Выходов два:
1. Запрещать полностью запуск внешних программ.
2. Пропатчить PHP таким образом, чтобы при вызове внешних программ он запускал их через suexec (меня интересует имено этот вариант).
Работа CGI производится в обычном режиме, в настройках вируальных хостов используются директивы User и Group. Вот тут вторая засада. Поскольку мы используем нестандартные права на папки пользователей user:www suexec отказывается работать, т.к. видит, что группа чужая. Следовательно патчим suexec.c таким образом, чтобы не проводить проверку группы, либо сравнивать её не с текущим пользователем, а с gid пользователя Apache. Задача не такая сложная, тем более файл где копать нужно я уже указал.
Да, ещё нужно не забыть перед запуском Apache дать команду umask 007, дабы создаваемые файлы имели права типа 660, т.е. с запретом работы с файлом никому, кроме user и group.
Теперь о глюке, который также не смог преодолеть. Каким то странным образом при загрузке файлов на сервер файл принимается благополучно во временную папку при этом приобретая атрибуты user:www 0700. Вот тут то и есть засада - PHP после загрузки ничего не может сделать с файлом, поскольку для группы www возникает запрет. Откуда появилась umask 077 я так и не понял. При этом файлы, создаваемые PHP имею правильные атрибуты.
Итак, подводя итог, напишу о нерешённых проблемах:
1. Требуется патч для PHP, чтобы вызов внешних программ производился через suexec.
2. Требуется патч для правильной реализации Upload файлов.