Как изолировать вложенную папку сайта?

Допустим, у меня есть сайт под 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/

Другие вопросы по тегам