Установка Apache в jail на примере порта apache13-modssl
1. Читаем man jail
2. Создаем директорию, которая будет корнем файловой системы jail окружения:
Код:
# 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 окружения:
Код:
# 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:
результат должен быть примерно таким:
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 на него):
Код:
#!/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