Я настроил веб-сервер Apache 2.2 с помощью suEXEC, выполнив пару руководств после прочтения официальной документации. Я помещу здесь краткое резюме:
# Install and enable Apache, suEXEC, FastCGI and PHP5
aptitude install apache2-mpm-worker libapache2-mod-fcgid apache2-suexec php5-cgi
a2enmod fcgid suexec actions
# Create a user with its directory configured to host a website
adduser -s/bin/false --home /var/www/crm --ingroup ftpclients crm
mkdir -p /var/www/crm/public_html
# Assign permissions after copying the website
chown -R crm:ftpclients /var/www/crm
find /var/www/crm -type -f -exec chmod 0640 {} \;
find /var/www/crm -type -d -exec chmod 0750 {} \;
# Customize FastCGI module
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 20
PHP_Fix_Pathinfo_Enable 1
</IfModule>
# Customize PHP ini at /etc/php5/cgi/php.ini
cgi.fix_pathinfo=1
# Setup FastCGI wrapper for PHP
mkdir -p /var/www/php-fcgi-scripts/crm
touch /var/www/php-fcgi-scripts/crm/php-fcgi-starter # see content below
chown www-data:www-data /var/www/php-fcgi-scripts
chown -R crm:ftpclients /var/www/php-fcgi-scripts/crm
chmod 0755 /var/www/php-fcgi-scripts/crm/php-fcgi-starter
# Contents of php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
# Create virtual host
<VirtualHost *:80>
ServerAdmin me@example.com
ServerName crm.example.com
DocumentRoot /var/www/crm/public_html
ErrorLog /var/log/apache2/crm.log
CustomLog /var/log/apache2/crm.log combined
<IfModule mod_fcgid.c>
SuexecUserGroup crm ftpclients
<Directory /var/www/crm/public_html>
Options +ExecCGI +FollowSymlinks
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/crm/php-fcgi-starter .php
</Directory>
</IfModule>
</VirtualHost>
При всем этом PHP работает нормально, но Apache возвращает ответ 403 для каждого ресурса: файлов CSS, изображений и т. Д. Мне пришлось изменить разрешения на 644 и 755, чтобы разрешить доступ к контенту.
Мой вопрос: разве suEXEC не должен запускать Apache от имени указанного пользователя (crm
в таком случае)? Почему тогда необходимо ослаблять разрешения для доступа к каталогам и изображениям?
Я казнил ps aux
и видел, что crm
на самом деле является владельцем нескольких /usr/lib/cgi-bin/php
процессы.
Apache использует suexec только для запуска внешних процессов. Важно отметить, что весь другой доступ к файлам по-прежнему осуществляется работником httpd, который в большинстве случаев работает как учетная запись apache (независимо от того, что есть в вашей системе). Возможно, что даже сценарии CGI должны быть доступны для чтения учетной записи apache; Я не уверен, сколько проверок безопасности, выполняемых suexec, выполняется до того, как он изменится на целевую учетную запись пользователя. PHP работает, потому что он выполняется через сценарий оболочки, поэтому только оболочка должна быть доступна для чтения всем.
Чтобы действительно добиться ожидаемого поведения, вам нужно будет использовать mpm-itk и вы должны знать, что mpm-itk имеет более слабую модель безопасности, чем стандартные MPM Apache. (Одна из причин, по которой процессы Apache запускаются от имени выделенного пользователя, заключается в том, что уязвимость в системе безопасности в коде Apache не может быть легко превращена в корневую уязвимость на машине. Для достижения своих целей mpm-itk запускает основной процесс Apache как root, что делает всю вашу систему более уязвимой для эксплойтов, обнаруженных в ее коде.)