Изоляция виртуальных хостов Apache от остальной системы

11

Я настраиваю веб-сервер, на котором будет размещаться несколько различных веб-сайтов, таких как Apache VirtualHosts, каждый из которых будет иметь возможность запускать скрипты (в первую очередь PHP, возможно, другие).

Мой вопрос заключается в том, как изолировать каждый из этих виртуальных хостов друг от друга и от остальной части системы? Я не хочу, чтобы, например, веб-сайт X читал конфигурацию веб-сайта Y или какой-либо из «личных» файлов сервера.

На данный момент я настроил VirtualHosts с FastCGI, PHP и SUExec, как описано здесь ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), но SUExec только запрещает пользователям редактировать / выполнять файлы, отличные от их собственных - пользователи по-прежнему могут читать конфиденциальную информацию, такую ​​как файлы конфигурации.

Я думал об удалении глобального разрешения на чтение UNIX для всех файлов на сервере, так как это решило бы вышеуказанную проблему, но я не уверен, что смогу сделать это безопасно, не нарушая функцию сервера.

Я также изучил использование chroot, но кажется, что это можно сделать только для каждого сервера, а не для каждого виртуального хоста.

Я ищу любые предложения, которые изолируют мои VirtualHosts от остальной части системы.

PS Я работаю на сервере Ubuntu 12.04

Мой ОТВЕТ: Я закончил с тем, что почти выполнил свою текущую конфигурацию, но выполнил тюрьму chroot для всех виртуальных хостов, например, включил тюрьму chroot /var/wwwи затем имел все пользовательские данные в подпапках, каждая с правами группы / других r / w / x. отключен. Этот вариант был желателен тем более, что все это возможно без каких-либо изменений в исходном коде.

Я выбрал ответ @Chris, потому что он был тщательно написан, а также рассматривал FTP и SELinux

JesperB
источник

Ответы:

4

Это можно сделать, включив модуль mod_users в Apache.

Вам нужно будет настроить UserDir в вашей конфигурации apache. Я предлагаю вам сделать это в отдельном конфигурационном файле и включить его. Оберните включить в

<IfModule mod_users.c>
   Include conf/extra/userdir.conf
</IfModule>

Я могу дать вам весь учебник, но он должен помочь вам начать настройку Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Подсказка: если вы используете SELinux (и вы должны это сделать), вы должны предоставить Apache доступ на чтение к домам пользователей. Вы можете сделать это, установив:

sudo setsebool -P httpd_enable_homedirs=On

Также необходимы права доступа к файлам для каталога пользователя dirs public_html и разрешения rx для родительских каталогов вплоть до root.

Очевидно, вам нужно настроить chroot для пользователей, например, в vsftpd. Установка:

apt-get vsftpd

Для настройки chroot откройте /etc/vsftpd/vsftpd.conf с помощью vi или nano. Найти и раскомментировать или добавить: chroot_local_user = yes

Вы можете получить то же поведение для sftp, которое я рекомендую по FTP, открыть / etc / ssh / sshd_config и добавить блок Match и эту строку:

Subsystem   sftp    internal-sftp

Match Group web_users
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match

Это выполнит поиск любого пользователя в группе web_users . Также вам нужно будет запретить доступ к оболочке, установив ее в / sbin / nologin:

useradd -G "web_users" -s /sbin/nologin new_user

Если это общедоступный производственный сервер, я также настоятельно рекомендую вам применить некоторую защиту к ОС, OpenSSH, Apache, PHP, vsftpd и применить некоторые строгие iptables и TCP-оболочки. Я рекомендую вам оставить SELinux на месте тоже.

Крис
источник
3
Я не вижу, как mod_userdirпредлагает виртуальный хостинг отдельных доменов. Кроме того, у меня есть опасения по поводу безопасности с точки зрения изоляции, поскольку я не могу найти что-либо об этом между пользовательскими каталогами в Apache. Просто кажется, что не предлагать эту функцию.
gertvdijk
6

Предлагаю посмотреть suphpили PHP-FPM .

Это в основном позволит интерпретатору PHP 'su' для определенного пользователя, настроенного для этого VirtualHost. Это позволит вам использовать общие разрешения файловой системы для изоляции каждого VirtualHost.

Я бы порекомендовал FPM из соображений производительности. На главной странице это то, что вас больше всего интересует:

Также представляют интерес параметры пользователя и группы для каждого пула, которые позволяют вам запускать этот конкретный пул fpm под заданным uid и gid; до свидания suphp!

gertvdijk
источник
4

Посмотри в chroot.

Некоторые отправные точки:

Apache chroot сделал просто

Среда Chroot для Apache (Debian)

Apache Chroot Jail: виртуальный хостинг

tacotuesday
источник
1
Я посмотрел на эти ссылки, но не похоже, что я могу использовать chroot для каждого виртуального хоста. Может быть, я должен определить глобальный каталог www для chroot в подобном /var/www, и чтобы все хосты находились там в подкаталоге, в каждом из этих подкаталогов было удалено глобальное разрешение на выполнение / чтение?
JesperB
Мое главное было chroot, и вы можете сделать это для каждого виртуального сервера. Вот пример. В этом случае они используют mod_chroot.
Tacotuesday