我已经在 CentOS 6.6 上设置了 Apache 2.2+php 5.3.3,并且正在运行虚拟主机,其文档根目录设置为 /var/www/domainFoldername,其虚拟主机配置在 httpd.conf 中如下:
<VirtualHost IP:80>
ServerName www.example.com:80
ServerAdmin [email protected]
DocumentRoot /var/www/ExampleFolder/web
ServerAlias example.com
ServerAlias *.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteCond %{HTTP_HOST} ^(.*).example.com$
DirectoryIndex index.html index.htm index.php
ErrorLog /var/www/ExampleFolder/log/error.log
TransferLog /var/www/ExampleFolder/log/access.log
AddType application/x-httpd-php .php
php_admin_flag safe_mode Off
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 402 /error/forbidden.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /404.php
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html
</VirtualHost>
我也在使用 ACL,并通过脚本为文件上传权限问题授予了 apache 对 /var/www 的写访问权限。我面临的问题是安全性。我可以从域运行脚本example.com
,并让其访问存在于另一个域目录中的文件。我认为属于域的脚本example.com
应该只能访问 内的文件/var/www/example/
,而不能访问 内的文件/var/www/someotherdomain
。所以,目前它非常不安全,我想保护这些东西。
答案1
您需要让 Apache 根据所访问的 VirtualHost 以不同的 Linux 用户帐户运行脚本。对此有多种解决方案,例如 suPHP、suEXEC 等。确保您没有尝试将 PHP 作为 Apache 模块(即 mod_php)运行,因为这样它将以有权访问任何用户目录的 Apache 用户身份运行。然后,您只需确保每个 VirtualHost 的用户帐户都无法访问其他 VirtualHost 的目录,只有 Apache 的用户帐户可以访问。
如果您希望每个 Apache VirtualHost 都以自己的用户身份运行而不仅仅是脚本,那么为了进一步隔离,您可以使用 MPM ITK 之类的东西(尽管会以速度为代价,同时也会牺牲一些其他安全问题,如其主页的“怪癖和警告”部分所述)。
您可能想要查看 CloudLinux(我认为您可以将 CentOS 就地升级到它),以及它的 CageFS 和 mod_lsapi 产品,因为这两者的组合提供了良好的安全性和性能。
另一个注意事项是确保实施符号链接攻击保护,以防止一个站点通过 Apache 技巧读取另一个站点的文件(CloudLinux 有一个内核修改,可以提供针对这种情况的保护,还有其他解决方案,例如完全禁止FollowSymLinks
- 请参阅https://documentation.cpanel.net/display/EA/Symlink+Race+Condition+Protection如果您想了解更多有关各种方法的信息)。