Назад | Перейти на главную страницу

Проблема безопасности Apache с VirtualHosts

Я установил Apache 2.2 + php 5.3.3 на CentOS 6.6 и запустил виртуальные хосты с настройкой их корней документов, например / var / www / domainFoldername, и конфигурацией их виртуальных хостов в httpd.conf, например:

<VirtualHost IP:80>
ServerName www.example.com:80
ServerAdmin admin@example.com
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. Итак, в настоящее время это очень небезопасно, и я хочу защитить эти вещи.

Вам необходимо, чтобы Apache запускал сценарии как разные учетные записи пользователей Linux, в зависимости от того, к какому VirtualHost осуществляется доступ. Для этого есть несколько решений, например suPHP, suEXEC и другие. Убедитесь, что вы не пытаетесь запустить PHP как модуль Apache (например, mod_php), потому что тогда он будет работать как пользователь Apache, который имеет разрешение на доступ к любому каталогу пользователя. Затем вам просто нужно убедиться, что каждая учетная запись пользователя VirtualHost не может получить доступ к другим каталогам VirtualHosts, и только учетная запись пользователя Apache может.

Чтобы еще больше изолировать ситуацию, если вы хотите, чтобы каждый Apache VirtualHost запускался как отдельный пользователь, а не только сценарии, вы можете использовать что-то вроде MPM ITK (хотя за счет скорости, а также за счет некоторых других проблем безопасности, упомянутых в «Причудах» и предупреждения »на своей домашней странице).

Возможно, вы захотите проверить CloudLinux (я думаю, вы можете обновить его до CentOS на месте) и его предложения CageFS и mod_lsapi, поскольку комбинация этих двух обеспечивает хорошую безопасность и производительность.

Еще одно замечание: убедитесь, что вы реализовали защиту от атак по символическим ссылкам, чтобы один сайт не читал файлы с другого с помощью уловки Apache (CloudLinux имеет модификацию ядра, которая обеспечивает защиту от этого, и есть и другие решения, такие как запрет FollowSymLinks все вместе - см. https://documentation.cpanel.net/display/EA/Symlink+Race+Condition+Protection если вы хотите узнать больше о различных подходах).