Поиск по сайту:

Chrooting Apache 2.4 с mod_unixd в Debian 8 (Джесси)


Это руководство существует для этих версий ОС

  • Debian 8 (Джесси)
  • Debian 4 (Etch)

На этой странице

  1. 1 Предварительное примечание
  2. 2 Настройка Apache
    1. 2.1 Первый способ: изменение корня документа
    2. 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/