Apache в chroot-окружении.
Метки: Apache | chroot | Fedora
Четверг, 6 августа 2009 г.
Просмотров: 2791
Подписаться на комментарии по RSS
Создание структуры каталогов.
Первый шаг - это создание необходимой для запуска Apache структуры каталогов. Предположим, что для chroot-окружений был создан каталог /chroot. Chroot-окружение Apache будет в каталоге /chroot/httpd. Создадим в данном каталоге необходимую структуру каталогов:
# 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:
# chmod -R 755 /chroot/httpd
Каталогу tmp необходимы права 777 и установка «липкого» бита:
# chmod +t /chroot/httpd/tmp
Надо создать символьное устройство /dev/null и назначить ему корректного владельца и права доступа:
# chown root.sys /chroot/httpd/dev/null
Копирование необходимых файлов.
Если в этот момент Apache запущен, нужно завершите его (killall httpd). Скопируем исполнимый файл Apache, административные сценарии (находятся в /etc/apache) и конфигурационный файл:
# ср /usr/sbin/httpd /chroot/httpd/usr/bin
# ср /usr/sbin/apache* /chroot/httpd/usr/sbin
Теперь нужно скопировать дерево DocumentRoot. Его расположение можно точно узнать в файле конфиуграции (задается директивой DocumentRoot). Обычно это /var/www/htdocs или /home/httpd:
Если используется SSL, можно скопировать еще и каталог /etc/ssl:
Не надо забывать скопировать модули, используемые Apache. Можно не тратить время на определение, нужен этот модуль или нет - можно просто скопировать все модули:
Хотя это и необязательно, все же желательно скопировать информацию о часовом поясе для того, чтобы Apache корректно работал с протоколами:
# In -s /chroot/httpd/usr/share/zoneinfo/GMT /chroot/httpd/etc/localtime
Теперь пришла очередь копирования необходимых библиотек. Определить все необходимые библиотеки поможет программа Idd:
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_dns*
/lib/libnss_files*
/lib/libnsl
А из каталога /etc понадобятся следующие файлы:
/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:
В Red Hat в файле надо изменить строку:
SYSLOGD_OPTIONS="-m О"
так:
SYSLOGD_OPTIONS="-m 0 -a /chroot/httpd/var/log"
В остальных дистрибутивах можно будет модифицировать сценарий инициализации. Следующий пример взят с дистрибутива Slackware:
}
Строку №5 нужно изменить так:
После всех этих изменений, надо перезапустить syslogd (kill -HUP <PID>).
Осталось только изменить сценарий запуска Apache, настроив его на запуск в chroot-окружении.
Рекомендуется установить систему Grsecurity, закрывающую потенциальную «дыру» в chroot-окружении Linux: дело в том, что системный вызов chroot() не изменяет текущий каталог после изменения корневого каталога, благодаря чему можно легко выйти из «песочницы». Если Grsecurity устанавливать не хочется, то перед запуском Apache в chroot-окружении надо выполнить вызов chdir() самостоятельно.
В Red Hat/Fedora файл инициализации Apache называется /etc/rc.d/init.d/httpd. Вот фрагмент кода, вызывающего демон:
echo -n $"Starting Sprog: "
daemon $httpd 'moduleargs" $OPTIONS
RETVAL=$?
echo [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd
return $RETVAL }
Нужно добавить новые команды:
Отредактируем функцию start():
echo -n $"Starting $prog: "
chdir /chroot/httpd
daemon /usr/sbin/chroot /chroot/httpd$httpd "moduleargs" $OPTIONS
RETVAL=$?
Перезапуск Apache.
Теперь, когда все находится на своем месте, нужно запустить сценарий инициализации для запуска Apache в chroot окружении. Если все было сделано правильно, то все заработает с первого раза. Но даже в данном случае пару часов нужно просматривать протоколы Web-сервера - не исключено, что сперва сервер нормально запустится, но уже через полчаса возникнет ошибка и его функционирование будет остановлено. Если не можете понять причину останова сервера, надо попробовать трассировку системных вызовов:
Возможно, проблема заключается в отсутствии какой-то библиотеки. После того, как убедитесь, что Apache корректно работает в chroot-окружении, можно удалить обычную (не chroot) копию.