PDA

Просмотр полной версии : mod_security chrooting Apache 2.2.* trouble


Dronga
27.11.2007, 18:44
Кто сталкивался с необходимостью загнать апач в chroot окружение, тот меня поймет.

Если использовать системные средства (chroot, jail), то гемороя ровно в два раза больше, нежели при использовании SecChrootDir (директива mod_security). Убедился на собственном опыте c Apache 1.37.*. Но времена первого апача уходят и возникла необходимость перехода на Apache 2.2.* с которым проблем оказалось больше. Устанавливаем апач, устанавливаем mod_security, конфигурируем. Стартуем апач, смотрим localhost и видим It's work! Всё замечательно, но:
myhost# cat httpd-error.log
[Tue Nov 27 17:41:12 2007] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Tue Nov 27 17:41:13 2007] [notice] mod_security: chroot checkpoint #1 (pid=579 ppid=574)
[Tue Nov 27 17:41:13 2007] [notice] mod_security/1.9.4 configured - Apache/2.2.3 (FreeBSD) mod_ssl/2.2.3 OpenSSL/0.9.7e-p1 DAV/2
[Tue Nov 27 17:41:14 2007] [notice] Digest: generating secret for digest authentication ...
[Tue Nov 27 17:41:14 2007] [notice] Digest: done
[Tue Nov 27 17:41:15 2007] [notice] mod_security: chroot checkpoint #2 (pid=589 ppid=1)
[Tue Nov 27 17:41:15 2007] [notice] mod_security: chroot successful, path=/chroot/apache
[Tue Nov 27 17:41:15 2007] [notice] Microsoft-IIS/5.0 configured -- resuming normal operations
[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child
[Tue Nov 27 17:41:15 2007] [error] (2)No such file or directory: Failed to child-init auditlog mutex
[Tue Nov 27 17:41:15 2007] [warn] (2)No such file or directory: Cannot reinit SSLMutex
[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child
[Tue Nov 27 17:41:15 2007] [error] (2)No such file or directory: Failed to child-init auditlog mutex
[Tue Nov 27 17:41:15 2007] [warn] (2)No such file or directory: Cannot reinit SSLMutex
[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child
[Tue Nov 27 17:41:15 2007] [error] (2)No such file or directory: Failed to child-init auditlog mutex
[Tue Nov 27 17:41:15 2007] [warn] (2)No such file or directory: Cannot reinit SSLMutex
[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child
[Tue Nov 27 17:41:15 2007] [error] (2)No such file or directory: Failed to child-init auditlog mutex
[Tue Nov 27 17:41:15 2007] [warn] (2)No such file or directory: Cannot reinit SSLMutex
[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child
[Tue Nov 27 17:41:15 2007] [error] (2)No such file or directory: Failed to child-init auditlog mutex
[Tue Nov 27 17:41:15 2007] [warn] (2)No such file or directory: Cannot reinit SSLMutex
Кто сталкивался??? Если надо конфиги - выложу.

groundhog
27.11.2007, 19:09
Выкладывай конфиги...

ZaCo
29.11.2007, 01:26
>>[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child

я так понимаю модуль сообщает о невозможности записи в лог файл. почему так происходит?

>>для ясности скажу что /usr/local/etc/apache22 есть симлинк на /chroot/apache/usr/local/etc/apache22

судя по ошибкам мне кажется ты сделал ровно наоборот:) тем не менее, делать символическую ссылку из недоступного, после chroot, каталога в новый нелепо. симлинк это всего лишь файл с именем файла на который он ссылается и атрибутом того, что он не есть непосредственный файл, а симлинк:) поэтому каталог так же будет недоступен: если уж и делать, то жесткую ссылку (man ln). только вроде на каталог ее сделать не удастся.. вообще тут достаточно проблем, связанных с ограничением апача, например мне будет интересно знать как ты будешь с таким апачем запускать скрипты и тд ну не считая тупой установки всего в /chroot :) зачем тебе апач так "запирать"?

Dronga
29.11.2007, 17:08
>>[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in child
я так понимаю модуль сообщает о невозможности записи в лог файл. почему так происходит?Интуиция?? =) Скажу больше, если rewrite_module ZaCoмментировать ;) то ошибка исчезает. Как от неё избавиться?? Где под встроенный rewrite_module узнать о директивах, касаемо файла лога?? Аналогично с SSL.

Например мне будет интересно знать как ты будешь с таким апачем запускать скрипты и тд ну не считая тупой установки всего в /chroot :) зачем тебе апач так "запирать"?
Тут самое интересное) Если апач так не "запереть", то получим практически свободный серф по файловой системе сервера с правами на чтение (FreeBSD в данном случае, права по умолчанию при установке на большинстве файлов 755) средствами PHP + дополнительная защита от разного рода ошибок в функциях PHP и проч. В OpenBSD Apache по умолчанию загоняется в chroot окружение, но OpenBSD не решает ряд других задач связанных с маршрутизацией трафика. Все скрипты прекрасно себя чувствуют. Установка всего в /chroot на самом деле далеко не тупая.. Использование именно chroot это однозначно гемморой, поэтому mod_security рулит. А в чем разница??? А разница в том что при chroot [что] [в какой папке] необходимо иметь подобие системы в /chroot (очеень много гемора с /dev /var/run, passwd и прочими основными системными файлами/папками..), а mod_security требуются лишь основные бинарники и собственно данные.
/usr/local/etc/apache22 есть симлинк на /chroot/apache/usr/local/etc/apache22
судя по ошибкам мне кажется ты сделал ровно наоборот:) тем не менее, делать символическую ссылку из недоступного, после chroot, каталога в новый нелепо.
только вроде на каталог ее сделать не удастся.. Ну я не знаю как тебе доказать что это работающий симлинк =) myhost# cd /usr/local/etc/apache22/
myhost# pwd
/chroot/apache/usr/local/etc/apache22

Более того, ee /usr/local/etc/apache22/httpd.conf тоже работает ;) Так что man ln не ко мне ;) ln -s [куда] [откуда]

Специфика такая.. Для запуска использую симлинк, чтобы апач запускался уже в чрут-окружении, то есть мне даже /rc.d/apache22 по идее не надо править. И ничего нет плохого в том, что два или более пути ведут в одно место. То что из чрута просится в /usr/local/etc/apache22 и то что из реальной системы просится туда же попадают в одно место. Гланое чтобы в обратную сторону такого эффекта не было ;) Симлинк для того и сделан чтобы не было конфликтов.

Подчеркиваю, что вся эта связка с первым апачем себя прекрасно чувствовала и работала без каких-либо нареканий.

ZaCo
04.12.2007, 12:27
>>Скажу больше, если rewrite_module ZaCoмментировать то ошибка исчезает. Как от неё избавиться??

ну наверное он не может сделать вызов flock на файл логов, тк файла нет) путь к файлу задается через rewritelog. про ссл в гугле посмотри, я думаю аналогично:)

>>Тут самое интересное) Если апач так не "запереть", то получим практически
>>свободный серф по файловой системе сервера с правами на чтение (FreeBSD в
>>данном случае, права по умолчанию при установке на большинстве файлов 755)

а чего? это архитектура системы такая. очень мало людей пока жалуются на такую в общем случае неполноценную систему прав, хотя конечно было бы удобно если в следующих дистрибутивах как линукс, так и бсд включали нечто вроде selinux. в твоем случае, если хочется делать супербезопасный веб-сервер задача сводится к извращенному построению ОС со своими правами уровня апача, а точнее процесса апача, а учитывая то, что на это способен только рут (ну по-хорошему естественно:), я про setuid, setgid) так выгибаться не стоит.

>>Установка всего в /chroot на самом деле далеко не тупая..

я не говорил о бездумности решения загонять апач в чрут, наоборот. я имел ввиду, что, например, если у тебя в планах поддерживать cgi, то тебе придется устанавливать все с --prefix=/chroot/usr/local ну это то еще ладно, а если приложению потребуется вызов внешней утилиты? ясное дело копировать bin глупо, потому что чему-нибудь понадобиться что-нибудь и из lib каталога, короче говоря, так можно проще сделать cp -R * /chroot только это совсем нелепый вариант :) так я и спрашиваю, как ты собираешься после чрут организовавыть доступ к тому что было? а не проще ли вообще в чрут не загонять? хотя естественно, если цги не требуется это почти не нужно.. для пхп-сайта чрут лучшее решение однозначно, только не забудь

ln /tmp/mysql.socket /chroot/tmp
/chroot/var/log имеется?

>>Ну я не знаю как тебе доказать что это работающий симлинк =)
да нет, я просто подумал что в чруте у тебя симлинк на /usr/local/etc/apache22)

>>Так что man ln не ко мне;) ln -s [куда] [откуда]
гг наоборот

>>Подчеркиваю, что вся эта связка с первым апачем себя прекрасно чувствовала и работала без каких-либо нареканий.
если у тебя посещаемость не вот какая огромная, то оставь первый..

Dumkopff
09.12.2007, 00:45
и все таки интересно в чем было решение, если оно конечно было найдено...

Dronga
09.12.2007, 14:54
Конечно оно было найдено. Опытным путем выяснилось что Апач 2.2 имеет совсем другую модель инициализации модулей. Значит по текстам ошибок..
[Tue Nov 27 17:41:15 2007] [warn] (2)No such file or directory: Cannot reinit SSLMutex Это от лукавого как говорится =) Просто модуль SSL инициализируется, а инициализировать и нечего.. Там ряд параметров идут вне <IfModule>.. Решилось просто настройкой SSL для Apache 2.2.*openssl genrsa -des3 -rand /dev/random -out server.key 1024
openssl rsa -in server.key -out server.pem
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey ./server.key -out server.crt То что после скрипта получилось (4 файла) делаем cp server.* /usr/local/etc/apache22; chmod 400 /usr/local/etc/apache22/server.*
Теперь ee /usr/local/etc/apache22/httpd.conf Ищем строчку с httpd-ssl.conf и раскоментируем. Всё отлично.. Там по умолчанию все пути под нашу картину заточены. Единственное, в etra/httpd-ssl.conf можно по желанию определить действие на запрос ввода PASSPHRASE. 100% работает на FreeBSD 6.2.
А мне Егорыч+++ на канале рассказывал про cd /usr/ports/www/apache22; make secure; =) Это на первом апаче было или даже для порта Apache-SSL ;) Не суть =)
Едем дальше.[Tue Nov 27 17:41:15 2007] [error] (2)No such file or directory: Failed to child-init auditlog mutexЭто самое западло... Также опытным путем было выяснено что ошибка генерируется собственно mod_security.. Снос соответствующих директив не помог из чего сделан вывод о несовместимости заявленного функционала mod_security с Apache 2.2.6. Как я могу запихнуть через mod_security всё в чрут окружение, если он сам там работать не может?? =) Снёс пока что, хотя штука хорошая.. Обязательно вернусь к этой теме в статьях ;)
На тот момент основной задач было загнать всё в чрут.. mod_security не спас, системный chroot также отказался всё это приютить.. Очередь дошла до mod_chroot найденного в портах cd /usr/ports; make search name=chroot; Вот так и познакомились =) Поставил, с опытом предыдущих ошибок всё заработало быстро... Осталась лишь:[Tue Nov 27 17:41:15 2007] [crit] (2)No such file or directory: mod_rewrite: could not init rewrite log lock in childТут долго парился.. Очевидно что проблема во встроенном модуле rewrite. Начал играться с директивами RewriteLog, RewriteLogLevel.. Даже когда явно указываешь что не нужен тебе лог, он всё равно его делает... Самое интересное, что создает он его вне чрут окружения, а потом ищет в чрут окружении.. Кончилось всё правкой исходного кода =) Модуль реально не понимает RewriteLogLevel 0, это очевидный баг, ибо порты обновил (можно зарелизить от имени АНТИЧАТА кому интересно ;), поэтому cd /usr/ports/www/apache22/
make
ee /usr/ports/www/apache22/work/httpd-2.2.6/modules/mappers/mod_rewrite.c
Ну или как вам там удобно.. Комментируем строчки которые генерят ошибку и собственно функцию её вызывающую (файл большой, ищем по тексту ошибки)
#ifndef REWRITELOG_DISABLED
/* PATCHED WITH ANTICHAT POWER HERE
rv = apr_global_mutex_child_init(&rewrite_log_lock, NULL, p);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,
"mod_rewrite: could not init rewrite log lock in
child");
}
THEN CONTINUE */
#endif

Далее если апач ещё не был установлен make install, а если трабла уже на руках, то make deinstall; make reinstall;

Вот и всё. Имею чрут, всё работает, и хакеры целые и сервер доволен ;)
PS. В асю прислали:
- Что тяжелее - килограмм земляники или килограмм гвоздей?
- Тяжелее будет высрать гвозди
(с)sql.ru