Опыт установки apache в chroot

Grifon аватар

chroot — операция изменения корневого каталога в Unix-подобных операционных системах. Программа, запущенная с изменённым корневым каталогом, будет иметь доступ только к файлам, содержащимся в данном каталоге. Программа, корень которой был перенесён в другой каталог, не может обращаться к файлам вне этого каталога. Это обеспечивает удобный способ помещения в «sandbox» («песочницу») тестовой, ненадёжной или любой другой потенциально опасной программы.

Буду рассматривать на примере дистрибутива openSUSE 11.1. В других делается аналогично с поправкой на размещение и менеджер пакетов.
Опять скажу, почему я пишу то, что уже много раз описано. Потому, что там, где писали, на сколько я нашёл, авторы статей упоминали о том, что их руководство только для «простой» установки, т.е., грубо говоря, их веб-сервер будет обрабатывать статические страницы.
Мне же нужен сервер, который работает в свою полную функциональность с поддержкой скриптовых языков.
Для сервисов в OpenSUSE есть каталог /srv, в нём и будем создавать пациента.
Сначала сделал корневую систему каталогов внутри /srv/apache.

# mkdir -p /srv/apache/{bin,sbin,usr/bin,usr/sbin,etc,lib,usr/lib,lib64,usr/lib64,etc,dev,var,var/run}

В общем, неплохо было бы делать её на отдельном разделе диска (как у меня).
Нашёл список пакетов для переноса:

# rpm -qa |grep apache
apache2-2.2.10-2.5
apache2-utils-2.2.10-2.5
apache2-mod_perl-2.0.4-40.12
apache2-mod_php5-5.2.11-0.1.1
apache2-prefork-2.2.10-2.5

Далее, используя заметку, я сделал другой скрипт. Его назначение - скопировать пакет и необходимые для него библиотеки в окружение chroot.
Способ запуска такой:

movechroot.sh имя_пакета каталог_chroot

перенёс апач:

movechroot.sh apache2 /srv/apache
movechroot.sh apache2-mod_perl /srv/apache
movechroot.sh apache2-mod_php5 /srv/apache
movechroot.sh apache2-prefork /srv/apache

Далее, скопировал нужные файлы устройств (ключ -a обязателен!):

cp -a /dev/{null,random,urandom} /srv/apache/dev/

Перенёс файлы конфигурации:

cp -au /etc/apache2/ /srv/apache/etc

Создал так же необходимые файлы в etc:

# grep ^root /etc/passwd >> /srv/apache/etc/passwd
# grep ^root /etc/shadow >> /srv/apache/etc/shadow
# grep ^wwwrun /etc/passwd >> /srv/apache/etc/passwd
# grep ^wwwrun /etc/shadow >> /srv/apache/etc/shadow
# grep ^root /etc/group >> /srv/apache/etc/group
# grep www /etc/group >> /srv/apache/etc/group
# cp -a /etc/{resolv.conf,localtime,ld.so.*} /srv/apache/etc/

Всё тем же скриптом ldddeps.sh нашёл зависимости для библиотек nss. Эти библиотеки нужны для корректной работы DNS, соответствия имён пользователей и групп в uid и обратно.

# lddeps.sh /lib64/{libnss_files*,libnss_dns*,libnss_compat.*}
/lib64/libnss_files-2.9.so
  /lib64/libc.so.6
    /lib64/ld-linux-x86-64.so.2
/lib64/libnss_files.so.2
/lib64/libnss_dns-2.9.so
  /lib64/libresolv.so.2
/lib64/libnss_dns.so.2
/lib64/libnss_compat.so.2
  /lib64/libnsl.so.1

Cкопировал их в /srv/apache/lib64.
Запустил команду

ldconfig -r /srv/apache

Её нужно выполнять после каждой установки библиотек в chroot.
После проделанных действий (на самом деле их было много - правильных и не правильных, так что если что-то пропустил, не судите. Тут пишу основные шаги), апач запускался следующей командой:

chroot /srv/apache /usr/sbin/httpd2-prefork

Запуск апача может быть подредактировал в /etc/init.d/apache2. Очень советую сделать резервную копию.
Подобным образом переносится php:

for pkg in $(rpm -qa|grep php); do sh findlibs.sh $pkg /srv/apache; done

Останется дать права на некоторые каталоги:

mkdir /srv/apache/var/lib/php5/
chmod 1777 /srv/apache/var/lib/php5/

Ну вот так и заработало.
Перенёс каталог с сайтами:

mv /srv/www /srv/apache/srv/www
ln -sf /srv/apache/srv/www /srv/

Тестирование.
Создал файл /srv/apache/srv/www/htdocs/phptest.php:

<?php
    print "<html><body>";
    print str_replace("\n", "<br>", file_get_contents("/etc/passwd"));
    print "</html></body>";
?>

Запустив этот сценарий из браузера получил:

Окно не уменьшил, чтобы было видно, что ниже ничего нет.
Ссылки:

  1. http://www.opennet.ru/base/sec/apache2_chroot.txt.html
  2. http://www.google.ru/search?q=apache+chroot
  3. http://ru.wikipedia.org/wiki/Chroot

Fellah аватар

Чувствую, рабочий день начну с перевода апача в песочницу :)

Полностью согласен с тобой, что нужен отдельный раздел диска либо механизм квотирования, ведь chroot не помешает забить текущую директорию до краёв и вызвать Denied of service.

Manefesto аватар

клетками пользуейтсе, и редирект.
и неуперся вам чрут никуда

Grifon аватар

Статьи только приветствуются. Можешь раскрыть свой вариант

advokat аватар

chroot я до сих пор не понимаю зачем?

при тестировании понециально опасных программ и прочего я использую отдельный компутер...
зачем мучиться в chroot.

На тот случай если злобный хацкер поимеет твой сервер через уязвимости апач/пхп/майскуэль.

advokat аватар

если злобный хацкер он и так поимеет :)
отказ от работы apache|php|mysql в chroot как спасет ?

Основная машина останется не тронутой

Grifon аватар

Во-первых, web-сервер - это не тестирование программ, а реально работающий сервер с сайтом. Во-вторых, если этот сервер стоит на компьютере, который используется не только для предоставления web-услуг, chroot скрывает остальную часть от проникновения средствами потенциально уязвимых скриптов. В-третьих, изолируется не только система от сервера, но и сервер от системы. Поясню. Сервер не видит лишние библиотеки и утилиты. В том числе - bash. То есть, например, популярные phpshell и r57shell просто не работают! Ну и, наконец, это даёт возможность проследить источник взлома и минимизировать его последствия, так как нужно будет только восстановить корректный каталог с файлами сайта.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".