Запуск Apache в jail environment под FreeBSD
В данной статье будет рассмотрена установка Apache в jail на примере порта apache13-modssl. На момент написания статьи это была версия apache+mod_ssl-1.3.28+2.8.15.
1. Читаем man jail(8) до полного понимания, что же jail из себя представляет.
# man jail
2. Создаем директорию, которая будет корнем файловой системы jail environment:
# mkdir -p /usr/jails/apache
3. Устанавливаем apache13-modssl из портов в эту директорию:
# cd /usr/ports/www/apache13-modssl
# make PREFIX=/usr/jails/apache install clean
4. Редактируем конфигурационный файл /usr/jails/apache/etc/apache/httpd.conf. Необходимо понимать, что корнем файловой системы для процессов в jail будет каталог /usr/jails/apache, и соответственно поправить все нужные пути. Например, вместо директивы
ServerRoot "/usr/local"
необходимо написать
ServerRoot "/"
, а вместо
DocumentRoot "/usr/local/www/data"
ввести
DocumentRoot "/www/data"
Автоматизировать этот процесс можно при помощи потокового редактора sed(1), например, так:
# cat /usr/jails/apache/etc/apache/httpd.conf | sed -e 's//usr/local////g' > temp.conf
# mv temp.conf /usr/jails/apache/etc/apache/httpd.conf
5. Создаем необходимые для работы каталоги.
# cd /usr/jails/apache
# mkdir -p dev usr/libexec usr/lib var/log var/run
6. Необходимо скопировать в jail environment все необходимые исполняемому файлу httpd библиотеки. Определить нужные помогут утилита strings(1). Утилита strings выводит все текстовые строки из указанного файла. Поскольку нас интересуют только shared library, используем grep(1) для отсечения лишних строк:
# strings /usr/jails/apache/sbin/httpd | grep ".so"
Вывод команды будет примерно таким:
/usr/libexec/ld-elf.so.1
libcrypt.so.2
libmm.so.13
libc.so.4
Найдя в системе при помощи find(1) или locate(1) эти библиотеки, скопируем их в каталоги jail environment:
# cd /usr/jails/apache
# cp /usr/libexec/ld-elf.so.1 usr/libexec
# cp /usr/lib/libcrypt.so.2 usr/lib
# cp /usr/local/lib/libmm.so.13 usr/lib
# cp /usr/lib/libc.so.4 usr/lib
Если Вы намерены использовать OpenSSL, понадобятся также следующие библиотеки:
# cp /usr/lib/libssl.so.3 usr/lib
# cp /usr/lib/libcrypto.so.3 usr/lib
7. Копируем нужные файлы из каталога /etc:
# cd /usr/jails/apache
# cp /etc/passwd /etc/group /etc/spwd.db etc
# cp /etc/resolv.conf etc
8. Чтобы иметь доступ к jail, назначим на один из ip-интерфейсов alias командой ifconfig(8):
# ifconfig xl0 alias 10.0.0.10/32
Пропишем этот IP в /usr/jails/apache/etc/hosts, дабы избежать лишних запросов к DNS:
# echo "10.0.0.10 test.mydomain.org" > /usr/jails/apache/etc/hosts
9. Запускаем Apache в jail:
# jail /usr/jails/apache test.mydomain.org 10.0.0.10 /sbin/httpd -DSSL -f /etc/apache/httpd.conf
Проверяем, запустился ли httpd:
# ps x | grep httpd
результат должен быть примерно таким:
20617 ?? SsJ 0:00,07 /sbin/httpd -DSSL -f /etc/apache/httpd.conf
Флаг J указывает на то, что процесс запущен в jail.
Проверяем доступность HTTP-сервера:
# telnet 10.0.0.3 80
Trying 10.0.0.3...
Connected to 10.0.0.3.
Escape character is '^]'.
Если процессы httpd по какой-то причине не запустились, причину следует искать в логе (по умолчанию в нашем примере это файл /usr/jails/apache/var/log/httpd-error.log).
10. Осталось настроить запуск jailed-httpd при загрузке системы. Можно создать простой скрипт /usr/local/etc/rc.d/apache.sh (не забыть сделать chmod +x на него):
<_CUT_>
#!/bin/sh
IFACE=xl0 # Jail IP interface name
case "$1" in
start)
ifconfig $IFACE alias 10.0.0.10/32
jail /usr/jails/apache test.mydomain.org 10.0.0.10 /sbin/httpd -DSSL -f /etc/apache/httpd.conf && echo -n ' apache'
;;
stop)
ifconfig $IFACE -alias 10.0.0.10
kill `cat /usr/jails/apache/var/run/httpd.pid` && echo -n ' apache'
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
;;
esac
exit 0
<_CUT_>
--
Читать: man: jail(8), chroot(2), httpd(8), grep(1), find(1), strings(1), rc.conf(5);
Apache documentation.
--
(c) Sergey V. Belov (aka Argail) 2003 mailto: argail@csite.ru
argail.csite.ru/unixdocs/freebsd/Apache_in_jail_on_FreeBSD.html
 |