如何在启用 suEXEC 的情况下避免 Apache 中的“403 Forbidden”响应

如何在启用 suEXEC 的情况下避免 Apache 中的“403 Forbidden”响应

在阅读了官方文档后,我按照几个教程使用 suEXEC 配置了 Apache 2.2 Web 服务器。我在这里做一个简短的总结:

# 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 [email protected]
  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

答案1

Apache 仅使用 suexec 来运行外部进程。需要注意的是,所有其他文件访问仍由 httpd 工作程序完成,在大多数情况下,该工作程序以 apache 帐户(无论您的系统上是什么)的身份运行。甚至 CGI 脚本也可能需要 apache 帐户可读;我不确定 suexec 在更改为目标用户帐户之前执行了多少次安全检查。PHP 之所以有效,是因为它通过包装器脚本执行,因此只有包装器需要是世界可读的。

为了真正实现您期望的行为,您需要使用mpm-itk您应该知道,mpm-itk 的安全模型比标准 Apache MPM 更弱。(Apache 进程以专用用户身份运行的部分原因是,Apache 代码中的安全漏洞不能轻易转化为机器上的 root 攻击。为了实现其目标,mpm-itk 以 root 身份运行主 Apache 进程,这使得您的整个系统更容易受到在其代码中发现的漏洞的攻击。)

相关内容