Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Apache в chroot-окружении.

Рубрика: Безопасность -> Защита сервисов
Метки: | |
Четверг, 6 августа 2009 г.
Просмотров: 6840
Подписаться на комментарии по RSS

     Создание структуры каталогов.

     Первый шаг - это создание необходимой для запуска Apache структуры каталогов. Предположим, что для chroot-окружений был создан каталог /chroot. Chroot-окружение Apache будет в каталоге /chroot/httpd. Создадим в данном каталоге необходимую структуру каталогов:

# mkdir -p /chroot/httpd/dev

# mkdir -p /chroot/httpd/etc

# mkdir -p /chroot/httpd/usr/bin

# mkdir -p /chroot/httpd/usr/sbin

# mkdir -p /chroot/httpd/usr/lib

# mkdir -p /chroot/httpd/usr/libexec

# mkdir -p /chroot/httpd/usr/local/apache/bin

# mkdir -p /chroot/httpd/usr/local/apache/logs

# mkdir -p /chroot/httpd/usr/local/apache/conf

# mkdir -p /chroot/httpd/usr/share/zoneinfо

# mkdir -p /chroot/httpd/var/www

# mkdir -p /chroot/httpd/tmp

# mkdir -p /chroot/httpd/lib

     В зависимости от дистрибутива и от способа установки Apache (из пакета или из исходных кодов) структура каталогов может отличаться. Владельцем всех каталогов должен быть root, права доступа 0755:


# chown -R root.root /chroot/httpd

# chmod -R 755 /chroot/httpd

     Каталогу tmp необходимы права 777 и установка «липкого» бита:

# chmod 777 /chroot/httpd/tmp

# chmod +t /chroot/httpd/tmp

     Надо создать символьное устройство /dev/null и назначить ему корректного владельца и права доступа:

# mknod -m 666 /chroot/httpd/dev/null с 1 3

# chown root.sys /chroot/httpd/dev/null

     Копирование необходимых файлов.

     Если в этот момент Apache запущен, нужно завершите его (killall httpd). Скопируем исполнимый файл Apache, административные сценарии (находятся в /etc/apache) и конфигурационный файл:

# ср -r /etc/apache /chroot/httpd/etc

# ср /usr/sbin/httpd /chroot/httpd/usr/bin

# ср /usr/sbin/apache* /chroot/httpd/usr/sbin

     Теперь нужно скопировать дерево DocumentRoot. Его расположение можно точно узнать в файле конфиуграции (задается директивой DocumentRoot). Обычно это /var/www/htdocs или /home/httpd:

# ср -r /var/www/htdocs /chroot/httpd/var/www

     Если используется SSL, можно скопировать еще и каталог /etc/ssl:

# ср -r /etc/ssl /chroot/httpd/etc

     Не надо забывать скопировать модули, используемые Apache. Можно не тратить время на определение, нужен этот модуль или нет - можно просто скопировать все модули:

# ср -r /usr/libexec/apache /chroot/httpd/usr/libexec

     Хотя это и необязательно, все же желательно скопировать информацию о часовом поясе для того, чтобы Apache корректно работал с протоколами:

# ср /usr/share/zoneinfo/GMT /chroot/httpd/usr/share/zoneinfо

# In -s /chroot/httpd/usr/share/zoneinfo/GMT /chroot/httpd/etc/localtime

     Теперь пришла очередь копирования необходимых библиотек. Определить все необходимые библиотеки поможет программа Idd:

# ldd /chroot/httpd/usr/sbin/httpd

libm.so.6 => /lib/libm.so.6 (0x40029000)

libcrypt.so.l => /lib/libcrypt.so.l '(0x4004d000)

libdb.so.2 => /lib/libdb.so.2 (0x4007a000)

libexpat.so.O => /usr/lib/libexpat.so.0 (0x40089000)

libdl.so.2 => /lib/libdl.so.2 (0x400a8000)

libc.so.6 => /libc/libc.so.6 (0x400ab000)

/lib/ld-linux.so.2=> /lib/ld-linux.so.2 (0x400000000)

     Теперь можно скопировать следующие библиотеки, обеспечивающие поддержку сети:

/lib/libnss_compat*

/lib/libnss_dns*

/lib/libnss_files*

/lib/libnsl

     А из каталога /etc понадобятся следующие файлы:

/etc/hosts

/etc/hosts.conf

/etc/resolv.conf

/etc/nsswitch.conf

/etc/passwd

/etc/shadow

     Конфигурирование «песочницы».

     Основная работа уже сделана, теперь осталось настроить все скопированные файлы. Первым делом надо открыть файл /chroot/httpd/etc/ passwd и удалить из него учтенные записи всех пользователей. Аналогично надо поступить с файлом /chroot/httpd/etc/shadow. Зачем это было сделано думаю, можно не объяснять.

     После данного нужно изменить syslogd так, чтобы он отслеживал каталог /chroot/httpd/var/log (по умолчанию он работает только с /var/log): это нужно сделать с помощью файла /etc/rc.d/init.d/syslog или /etc/rc.d/rc.syslog - в зависимости от вашего дистрибутива.

     В Red Hat/Fedora этот процесс проще благодаря наличию конфигурационного файла /etc/sysconfig/syslog, а в не RH-совместимых дистрибутивах придется вручную отредактировать сценарий инициализации. Нужно добавить дополнительную опцию для syslog:

-a /chroot/httpd/var/log

     В Red Hat в файле надо изменить строку:

SYSLOGD_OPTIONS="-m О"

так:

SYSLOGD_OPTIONS="-m 0 -a /chroot/httpd/var/log"

     В остальных дистрибутивах можно будет модифицировать сценарий инициализации. Следующий пример взят с дистрибутива Slackware:

 

syslogd_start() {     if [ -x /usr/sbin/syslogd -a -x /usr/sbin/klogd ]; then

     echo -n "Starting sysklod daemons: "

     echo -n " /usr/sbin/syslogd"

     /usr/sbin/syslogd

     sleep 1

     echo -n " /usr/sbin/klogd -c 3 -x"

     # '-c 3' = display level 'error' on higher messages on console

     # '-x' = turn off broken EIP translation /usr/sbin/klogd -c -3

     fi

  }

     Строку №5 нужно изменить так:

echo -n " /usr/sbin/syslogd -a /chroot/httpd/var/log"

     После всех этих изменений, надо перезапустить syslogd (kill -HUP <PID>).

     Осталось только изменить сценарий запуска Apache, настроив его на запуск в chroot-окружении.

     Рекомендуется установить систему Grsecurity, закрывающую потенциальную «дыру» в chroot-окружении Linux: дело в том, что системный вызов chroot() не изменяет текущий каталог после изменения корневого каталога, благодаря чему можно легко выйти из «песочницы». Если Grsecurity устанавливать не хочется, то перед запуском Apache в chroot-окружении надо выполнить вызов chdir() самостоятельно.

     В Red Hat/Fedora файл инициализации Apache называется /etc/rc.d/init.d/httpd. Вот фрагмент кода, вызывающего демон:

start () {

echo -n $"Starting Sprog: "

daemon $httpd 'moduleargs" $OPTIONS

RETVAL=$?

echo [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd

return $RETVAL }

     Нужно добавить новые команды:

chdir /chroot/httpd; /usr/sbin/chroot /chroot/httpd /usr/sbin/httpd

     Отредактируем функцию start():

start () {

echo -n $"Starting $prog: "

chdir /chroot/httpd

daemon /usr/sbin/chroot /chroot/httpd$httpd "moduleargs" $OPTIONS

RETVAL=$?

     Перезапуск Apache.

     Теперь, когда все находится на своем месте, нужно запустить сценарий инициализации для запуска Apache в chroot окружении. Если все было сделано правильно, то все заработает с первого раза. Но даже в данном случае пару часов нужно просматривать протоколы Web-сервера - не исключено, что сперва сервер нормально запустится, но уже через полчаса возникнет ошибка и его функционирование будет остановлено. Если не можете понять причину останова сервера, надо попробовать трассировку системных вызовов:

# strace chroot /chroot/httpd /usr/sbin/httpd 2> httpd.strace

     Возможно, проблема заключается в отсутствии какой-то библиотеки. После того, как убедитесь, что Apache корректно работает в chroot-окружении, можно удалить обычную (не chroot) копию.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена.

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



(обязательно)