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 stopln -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. Пример:
Следующая страница должна появиться сейчас, когда PHP работает правильно:

Пока все хорошо, но как мы можем узнать, действительно ли Apache находится в chroot? Давайте попробуем получить доступ к файлу, который находится за пределами chroot, я использую /etc/hosts в качестве примера.
nano /var/www/html/testchroot.phpс этим содержимым:
' . $var;и откройте URL для тестового файла в браузере. Результат:

Как вы можете видеть, содержимое файла /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/perlroot@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 Ссылки
- mod_unixd: https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
- Apache: http://httpd.apache.org/
- Debian: http://www.debian.org/
Get new posts in your inbox
No spam. Unsubscribe anytime.