Apache настройка · 3 min read · Dec 26, 2025

Chrooting Apache 2.4 с mod_unixd на Debian 8 (Jessie)

Этот гид объясняет, как настроить mod_unixd с Apache 2.4 на системе Debian Jessie. С помощью mod_unixd вы можете запускать Apache в безопасной chroot среде и сделать ваш сервер менее уязвимым для попыток взлома, которые пытаются использовать уязвимости в Apache или ваших установленных веб-приложениях. Модуль mod_unixd является заменой модуля mod_chroot, который использовался в старом apache 2.2.

1 Предварительная заметка

Я предполагаю, что у вас есть работающая система Debian 8 с работающим Apache, например, как показано в этом руководстве: Учебник по серверу LAMP на Debian 8 Jessie с Apache 2, PHP 5 и MariaDB. Кроме того, я предполагаю, что у вас есть один или несколько веб-сайтов, настроенных в каталоге /var/www (например, если вы используете ISPConfig).

Сервер, который я использую здесь, имеет IP-адрес 192.168.1.100 и имя хоста server1.example.com. Пожалуйста, замените эти значения на IP-адрес и имя хоста вашего сервера, где бы они ни встречались в руководстве.

2 Настройка Apache

Модуль apache mod_unixd, который предлагает функцию Chroot в Apache 2.4, является частью основных модулей Apache и статически компилируется в бинарный файл Apache на Debian 8, поэтому нам не нужно устанавливать дополнительное программное обеспечение для его использования.

Я хочу использовать каталог /var/www в качестве каталога, содержащего chroot тюрьму. Apache на Debian использует файл PID /var/run/apache2.pid; когда Apache находится в chroot к /var/www, /var/run/apache2.pid переводится в /var/www/var/run/apache2.pid. Поэтому мы создаем этот каталог сейчас:

mkdir -p /var/www/var/run  
chown -R root:root /var/www/var/run

Теперь мы должны сказать Apache, что мы хотим использовать /var/www в качестве нашего каталога chroot. Мы открываем /etc/apache2/apache2.conf и прямо под строкой PidFile добавляем строку ChrootDir:

nano /etc/apache2/apache2.conf
[...]  
#  
# PidFile: Файл, в котором сервер должен записывать свой номер  
# идентификации процесса, когда он запускается.  
# Это нужно установить в /etc/apache2/envvars  
#  
PidFile ${APACHE_PID_FILE}  
ChrootDir /var/www  
[...]  

Далее мы должны сказать нашим vhosts, что корень документа изменился (например, DocumentRoot /var/www теперь переводится в DocumentRoot /). Мы можем сделать это либо изменив директиву DocumentRoot каждого vhost, либо проще, создав символическую ссылку в файловой системе.


2.1 Первый метод: Изменение DocumentRoot

Предположим, у нас есть vhost с DocumentRoot /var/www. Теперь мы должны открыть конфигурацию vhost этого vhost и изменить DocumentRoot /var/www на DocumentRoot /. Соответственно, DocumentRoot /var/www/web1/web теперь будет переводиться в DocumentRoot /web1/web и так далее. Если вы хотите использовать этот метод, вам нужно изменить DocumentRoot для каждого отдельного vhost.

2.2 Второй метод: Создание символической ссылки в файловой системе

Этот метод проще, потому что вам нужно сделать это только один раз и не нужно изменять никакую конфигурацию vhost. Мы создаем символическую ссылку, указывающую с /var/www/var/www на /var/www:

mkdir -p /var/www/var  
cd /var/www/var  
ln -s ../../ www

Наконец, мы должны остановить Apache, создать символическую ссылку с /var/run/apache2.pid на /var/www/var/run/apache2.pid и снова запустить его:

service apache2 stop
ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid  
service apache2 start

Вот и все. Теперь вы можете вызывать свои веб-страницы, как и прежде, и они должны обслуживаться без проблем, если это статические HTML файлы или использование mod_php.

Я протестирую это сейчас с помощью страницы phpinfo(). Откройте новый файл info.php с помощью nano в корне документа по умолчанию:

nano /var/www/html/info.php

и добавьте следующее содержимое:

Сохраните файл и откройте имя хоста вашего сервера или IP-адрес в браузере, добавив /info.php. Пример:

http://192.168.1.100/info.php

Следующая страница должна появиться сейчас, когда PHP работает правильно:

Страница информации PHP.

Пока все хорошо, но как мы можем узнать, действительно ли Apache находится в chroot? Давайте попробуем получить доступ к файлу, который находится за пределами chroot, я использую /etc/hosts в качестве примера.

nano /var/www/html/testchroot.php

с этим содержимым:

' . $var;

и откройте URL для тестового файла в браузере. Результат:

Тест Chroot

Как вы можете видеть, содержимое файла /etc/hosts больше не может быть доступно из этого PHP скрипта.

Удалите тестовые файлы, если они вам больше не нужны:

rm /var/www/html/testchroot.php  
rm /var/www/html/info.php

Если вы используете CGI, например, Perl, Ruby и т. д., то вам нужно скопировать интерпретатор (например, /usr/bin/perl и т. д.) в chroot тюрьму вместе со всеми библиотеками, необходимыми для интерпретатора. Вы можете узнать о необходимых библиотеках с помощью команды ldd, например:

ldd /usr/bin/perl
root@server1:/var/www/html# ldd /usr/bin/perl  
linux-vdso.so.1 (0x00007ffe951f4000)  
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)  
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)  
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)  
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)  
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)  
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)  
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)  
root@server1:/var/www/html#

или используйте инструменты jailkit для создания тюремной среды. Если вы скопировали все необходимые файлы, но страница все еще не работает, вам следует взглянуть на журнал ошибок Apache /var/log/apache2/error.log. Обычно он говорит вам, где проблема.

3 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.