在阅读了官方文档之后,我已经使用suEXEC配置了Apache2.2Web服务器。我将在这里做一个简短的总结:
# 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进程的所有者。
发布于 2013-05-07 12:58:18
Apache只使用suexec运行外部进程。需要注意的是,所有其他文件访问仍然是由httpd工作人员完成的,在大多数情况下,它都是作为apache帐户运行的(不管您的系统上有什么)。即使是CGI脚本也可能需要apache帐户读取;我不确定suexec执行的安全检查中有多少是在它更改到目标用户帐户之前完成的。PHP之所以有效,是因为它是通过包装器脚本执行的,所以只有包装器才需要具有可读性。
要真正实现您所期望的行为,您需要使用mpm-itk,并且您应该意识到MPMs的安全性模型比标准Apache要弱。( Apache进程作为专用用户运行的部分原因是,Apache代码中的安全漏洞很难转化为机器上的根危害。为了实现其目标,mpm将主要的Apache进程作为root运行,这使得整个系统更容易受到代码中发现的漏洞的攻击。)
https://serverfault.com/questions/454558
复制相似问题