Как изолировать вложенную папку сайта?
Допустим, у меня есть сайт под www.example.com
и хотел бы также иметь блог в подпапке, например www.example.com/blog/
, Как я могу изолировать эту папку, чтобы любой скрипт, работающий внутри нее, не мог касаться каких-либо файлов за ее пределами?
Изменить: добавлена информация ниже.
Текущая конфигурация использует Apache с Suexec и php-fastcgi:
<VirtualHost X.X.X.X:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/example/public_html
ScriptAlias /cgi-bin/ /home/example/cgi-bin/
DirectoryIndex index.html index.htm index.php
RemoveHandler .php
php_admin_value engine Off
IPCCommTimeout 301
FcgidMaxRequestLen 1073741824
SuexecUserGroup "#1000" "#1000"
<Directory /home/example/public_html>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
AddType application/x-httpd-php .php
AddHandler fcgid-script .php
FCGIWrapper /home/example/fcgi-bin/php5.fcgi .php
</Directory>
<Directory /home/example/cgi-bin>
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
</Directory>
</VirtualHost>
/home/example/fcgi-bin/php5.fcgi содержит:
#!/bin/bash
PHPRC=$PWD/../etc/php5
export PHPRC
umask 022
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=99999
export PHP_FCGI_MAX_REQUESTS
SCRIPT_FILENAME=$PATH_TRANSLATED
export SCRIPT_FILENAME
exec /usr/bin/php5-cgi
Из того, что я знаю, SuexecUserGroup
может использоваться только в конфигурации сервера или в контексте виртуального хоста, поэтому его нельзя указать в контексте каталога. Какие варианты у меня есть?
2 ответа
Вы могли бы иметь example.com/blog
перенаправить на vhost blog.example.com
, Затем вы можете использовать, например, suphp для запуска сценариев в этом vhost как совершенно другой пользователь. Это должно дать вам изоляцию, которую вы хотите.
То, что вы хотите, не совсем возможно, но некоторые вещи следует учитывать:
использовать Apache's
Alias
директива: это позволяет/blog/
URL должен находиться в другом месте файловой системы, а не в том же каталоге, что и другой веб-контент.Вместо mod_php, который запускает PHP-скрипты в качестве UID веб-сервера, который одинаков для всего содержимого сайта, используйте PHP в режиме CGI (например, php-fpm) с другим контекстом UID для сайта блога. suexec похож на CGI-скрипты.
Использование обратного прокси для
/blog/
URL совершенно другого веб-сервера (экземпляра) для вашего блога:ProxyPass /blog/ http://blog.example.org:81/blog/
ProxyPassReverse /blog/ http://blog.example.org:81/blog/