Chrooting Apache 2.4 с mod_unixd в Debian 8 (Джесси)
Это руководство существует для этих версий ОС
- Debian 8 (Джесси)
- Debian 4 (Etch)
На этой странице
- 1 Предварительное примечание
- 2 Настройка Apache
- 2.1 Первый способ: изменение корня документа
- 2.2 Второй метод: создание символической ссылки в файловой системе
В этом руководстве объясняется, как настроить mod_unixd с Apache 2.4 в системе Debian Jessie. С помощью mod_unixd вы можете запускать Apache в защищенной среде chroot и сделать свой сервер менее уязвимым для попыток взлома, которые пытаются использовать уязвимости в Apache или ваших установленных веб-приложениях. Модуль mod_unixd является заменой модуля mod_chroot, который использовался в старом apache 2.2.
1 Предварительное примечание
Я предполагаю, что у вас есть работающая система Debian 8 с работающим Apache, например. как показано в этом руководстве: Руководство по серверу Debian 8 Jessie LAMP с Apache 2, PHP 5 и MariaDB. Кроме того, я предполагаю, что у вас есть один или несколько веб-сайтов, настроенных в каталоге /var/www (например, если вы используете ISPConfig).
Используемый здесь сервер имеет IP-адрес 192.168.1.100 и имя хоста server1.example.com. Пожалуйста, замените эти значения IP-адресом и именем хоста вашего сервера, где бы они ни встречались в руководстве.
2 Настройка Апача
Модуль apache mod_unixd, который предлагает функцию Chroot в Apache 2.4, является частью основных модулей Apache и статически скомпилирован в двоичный файл Apache в Debian 8, поэтому нам не нужно устанавливать дополнительное программное обеспечение для его использования.
Я хочу использовать каталог /var/www в качестве каталога, содержащего тюрьму chroot. Debians Apache использует файл PID /var/run/apache2.pid; когда Apache привязан к /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: The file in which the server should record its process # identification number when it starts. # This needs to be set in /etc/apache2/envvars # PidFile ${APACHE_PID_FILE} ChrootDir /var/www [...]
Затем мы должны сообщить нашим виртуальным хостам, что корень документа изменился (например, DocumentRoot /var/www теперь преобразуется в DocumentRoot/). Мы можем сделать это либо изменив директиву DocumentRoot каждого виртуального хоста, либо, что проще, создав символическую ссылку в файловой системе.
2.1 Первый способ: изменение DocumentRoot
Предположим, у нас есть виртуальный хост с DocumentRoot /var/www. Теперь мы должны открыть конфигурацию виртуального хоста этого виртуального хоста и изменить DocumentRoot /var/www на DocumentRoot/. Соответственно, DocumentRoot /var/www/web1/web теперь будет транслироваться в DocumentRoot /web1/web и так далее. Если вы хотите использовать этот метод, вы должны изменить DocumentRoot для каждого отдельного виртуального хоста.
2.2 Второй метод: создание символической ссылки в файловой системе
Этот метод проще, потому что вам нужно сделать это только один раз и не нужно изменять конфигурацию виртуального хоста. Мы создаем символическую ссылку, указывающую с /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
и добавьте следующее содержимое:
<php
phpinfo();Сохраните файл и откройте в браузере имя хоста вашего сервера или IP-адрес, а затем /info.php. Пример:
Следующая страница должна появиться, когда PHP работает правильно:
Пока все хорошо, но как узнать, действительно ли Apache chroot? Давайте попробуем получить доступ к файлу, находящемуся за пределами chroot, например, я буду использовать здесь /etc/hosts.
nano /var/www/html/testchroot.php
с этим содержанием:
<?php
$var = file_get_contents('/etc/hosts');
echo 'The content of /etc/hosts is: <br />' . $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/perl
:/var/www/html#
или используйте инструменты джейлкита для создания джейл-окружения. Если вы скопировали все необходимые файлы, но страница по-прежнему не работает, посмотрите журнал ошибок 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/