mod_security chrooting Apache 2.2.* trouble

Discussion in 'Безопасность и Анонимность' started by Dronga, 27 Nov 2007.

Thread Status:
Not open for further replies.
  1. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    Кто сталкивался с необходимостью загнать апач в chroot окружение, тот меня поймет.

    Если использовать системные средства (chroot, jail), то гемороя ровно в два раза больше, нежели при использовании SecChrootDir (директива mod_security). Убедился на собственном опыте c Apache 1.37.*. Но времена первого апача уходят и возникла необходимость перехода на Apache 2.2.* с которым проблем оказалось больше. Устанавливаем апач, устанавливаем mod_security, конфигурируем. Стартуем апач, смотрим localhost и видим It's work! Всё замечательно, но:
    Кто сталкивался??? Если надо конфиги - выложу.
     
  2. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Выкладывай конфиги...
     
  3. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>[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 :) зачем тебе апач так "запирать"?
     
  4. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    Интуиция?? =) Скажу больше, если rewrite_module ZaCoмментировать ;) то ошибка исчезает. Как от неё избавиться?? Где под встроенный rewrite_module узнать о директивах, касаемо файла лога?? Аналогично с SSL.

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

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

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

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>Скажу больше, если 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 [куда] [откуда]
    гг наоборот

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

    Dumkopff Elder - Старейшина

    Joined:
    5 Apr 2006
    Messages:
    60
    Likes Received:
    25
    Reputations:
    0
    и все таки интересно в чем было решение, если оно конечно было найдено...
     
  7. Dronga

    Dronga ВАША реклама ТУТ!!

    Joined:
    1 Jul 2005
    Messages:
    575
    Likes Received:
    239
    Reputations:
    249
    Конечно оно было найдено. Опытным путем выяснилось что Апач 2.2 имеет совсем другую модель инициализации модулей. Значит по текстам ошибок..
    Это от лукавого как говорится =) Просто модуль SSL инициализируется, а инициализировать и нечего.. Там ряд параметров идут вне <IfModule>.. Решилось просто настройкой SSL для Apache 2.2.*
    То что после скрипта получилось (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 ;) Не суть =)
    Едем дальше.
    Это самое западло... Также опытным путем было выяснено что ошибка генерируется собственно mod_security.. Снос соответствующих директив не помог из чего сделан вывод о несовместимости заявленного функционала mod_security с Apache 2.2.6. Как я могу запихнуть через mod_security всё в чрут окружение, если он сам там работать не может?? =) Снёс пока что, хотя штука хорошая.. Обязательно вернусь к этой теме в статьях ;)
    На тот момент основной задач было загнать всё в чрут.. mod_security не спас, системный chroot также отказался всё это приютить.. Очередь дошла до mod_chroot найденного в портах cd /usr/ports; make search name=chroot; Вот так и познакомились =) Поставил, с опытом предыдущих ошибок всё заработало быстро... Осталась лишь:
    Тут долго парился.. Очевидно что проблема во встроенном модуле rewrite. Начал играться с директивами RewriteLog, RewriteLogLevel.. Даже когда явно указываешь что не нужен тебе лог, он всё равно его делает... Самое интересное, что создает он его вне чрут окружения, а потом ищет в чрут окружении.. Кончилось всё правкой исходного кода =) Модуль реально не понимает RewriteLogLevel 0, это очевидный баг, ибо порты обновил (можно зарелизить от имени АНТИЧАТА кому интересно ;), поэтому
    Ну или как вам там удобно.. Комментируем строчки которые генерят ошибку и собственно функцию её вызывающую (файл большой, ищем по тексту ошибки)
    Code:
    #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
     
    #7 Dronga, 9 Dec 2007
    Last edited: 9 Dec 2007
    4 people like this.
Thread Status:
Not open for further replies.