Apache и разные режимы вызова PHP — какие права на файлы нужны?
Сегодня мы рассмотрим различные режимы вызова PHP и использование различных worker-ов популярного вэбсервера Apache с точки зрения необходимых прав доступа для файлов и каталогов. Отметим, что обычно требуются разные права для чтения (то есть — исполнения PHP-кода и отдачи объектов) и для записи (например, для загрузки изображений и изменения файлов средствами CMS). Пожалуйста, внимательно изучите принципы формирования прав (например, прочитайте отличную статью на Wikipedia), чтобы было понятно, например, что означают права файла 640 (u=rw,g=r,o=). Отметим, что ниже значения прав доступа указаны, скажем так, “примерно” — действительно, с ними все будет работать, но есть потенциал для тонкой настройки, если пользователь разобрался с правами, процессами и масками.
Обычный вариант — Apache+mod_php
Это обычный, стандартный вариант. Apache работает от пользователя apache или аналогичного (www, httpd, apache22 — имя пользователя зависит от используемой ОС). Соответственно, PHP код интерпретируется модулем с правами данного пользователя. В этом случае для исполнения кода достаточно прав на чтение файлов и входа в директории. Это можно представить, как xx4 (a+r) для файлов и xx5 (a+x) для директорий. Расшифруем значения — мы даем возможность всем пользователям (поле a) права на чтение файлов (+r), а для директорий — на чтение и переход в них (+x).
Для записи файлов (загрузки, записи в файлы кэширования и проч.) необходимо либо дать для необходимого файла/директории соответствующие права (xx6 для файлов, xx7 для директорий), либо сменить владельца файла/каталога на пользователя, с правами которого работает apache. Второй способ единственно возможен, если есть права суперпользователя — в UNIX-системах пользователь, отличный от root, не может сменить владельца файлов.
Резюме — Apache+mod_php
- запрос приходит к сайту пользователя ivan
- вэбсервер работает с правами пользователя apache (либо аналогичного httpd, apache22, www)
- php работает с правами пользователя apache
Apache-itk+mod_php
В подобных конфигурациях используются модифицированный код Apache, позволяющий менять пользователя, с правами которого работает процесс, в зависимости от виртуального хоста. Это позволяет при запросе к виртуальному вэбсерверу пользователя ivan запустить отдельный процесс вэбсервера с правами пользователя ivan. В данном случае все упрощается — для чтения достаточно минимальных прав (444 для файлов, 555 для директорий). Отметим, что не только PHP исполняется, но и абсолютно все операции в рамках запроса производятся с правами пользователя ivan.
Резюме — Apache-itk+mod_php
- запрос приходит к сайту пользователя ivan
- вэбсервер работает с правами пользователя ivan
- php работает с правами пользователя ivan
Apache+FastCGI
Использование схемы с FastCGI (или с CGI) наиболее популярно в том случае, если есть необходимость получить не только достойную производительность, но и контроль за выделяемыми для сайта или пользователя ресурсами. Наиболее часто в реализации данной конфигурации используется специальный модуль к вэбсерверу mod_fcgid. Запрос поступает к Apache, который работает с правами пользователя www (как в “стандартном” варианте, см. выше). Если запрос может быть обработан внутренними средствами apache (допустим — чтение png-файла с диска и вывод прочитанных данных в ответе на http-запрос), это происходит. В том случае, если нужно выполнить соответствующий скрипт — запрос передается соответствующему интерпретатору, который работает независимо от вэбсервера. В наиболее распространенном случае (если используется apache с mod_fcgid и PHP), код PHP исполняется с правами пользователя-владельца виртуального хоста.
Таким образом, картинки и прочие “простые” файлы должны быть доступны для чтения вэбсервером (права, как минимум, 444 на файлы и 555 на директории), php-файлы могут иметь права 400, а для загрузки файлов или редактирования достаточно, чтобы пользователь ivan мог изменять или создавать файлы в необходимой директории.
Резюме — Apache+FastCGI
- запрос приходит к сайту пользователя ivan
- вэбсервер работает с правами пользователя apache
- php работает с правами пользователя ivan
Apache-ITK+FastCGI
К сожалению, данная конфигурация нежизнеспособна по техническим причинам. Не стоит использовать одновременно apache-itk и mod_fcgid, вэбсервер не сможет запускать корректно интерпретатор PHP.