Бета-версия modSecurity для Nginx

    ModSecurity — популярный бесплатный Web Application Firewall (WAF) с открытыми исходными кодами. Долгое время существовал только в виде модуля к веб-серверу Apache.

    Позже, понимая, что мир меняется, разработчики сделали т.н. standalone реализацию, которую можно встроить в любое приложение. И хотя, библиотека всё еще в глубокой бете и целиком завязана на APR, некоторое время назад появилась версия modSecurity для IIS.

    Сейчас схема фронтенд-бэкенд стала де-факто стандартом, и логично перенести функционал внешней безопасности приложения на фронтенд, что привело к необходимости запуска ModSecurity под, пожалуй, лучшим на сегодняшний день веб-сервере с функционалом реверс-прокси — Nginx.

    Архитектура Nginx такова, что модули подключаются в момент компиляции, а вызов обработчиков может происходить на различных фазах обработки запроса. В данный момент в модуле реализована обработка GET и POST запросов, в том числе запросов с большим размером тела(в отличие от naxsi), что потребовало установки собственного location handler'а.
    Из-за этого, схема подключения модуля выглядит так:
    Без modSecurity:
    location / {
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header Host $host;
               proxy_redirect off;
               proxy_pass http://localhost:8080;
    }
    

    С подключенным modSecurity:
    location / {
               // включаем модуль, в off будет слать запросы на location указанный в ModSecurityPass
               ModSecurityEnabled on;
               // конфиг mod_security, здесь подразумевается, что лежит рядом с nginx.conf
               ModSecurityConfig modsecurity.conf; 
               //named location, на который уйдет запрос, успешно прошедший проверку
               ModSecurityPass @backend; 
    }
    
    location @backend {
               // стандартный конфиг
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header Host $host;
               proxy_redirect off;
               proxy_pass http://localhost:8080;
    }
    


    Что реализовано в текущей версии:
    • Обработка GET и POST запросов(в том числе chunked)
    • Блокировка запросов

    Что не реализовано:
    • Обработка ответов
    • «Защита от дурака»


    Модуль доступен в svn, отзывы, рекомендации, баг-репорты и патчи очень приветствуются.

    Спасибо Игорю Сысоеву и Валерию Холодкову, авторам веб-сервера и дополнений, исходный код которых используется в модуле.
    • +25
    • 11,9k
    • 8
    Поделиться публикацией

    Комментарии 8

      +4
      Присоединяюсь к благодарностям.

      Несколько лет назад мигрировали с apache на nginx на наших серверах после одного DDOS, под которым apache сжирал процессор и память на 100%. Тогда куча ботов отправляли GET запрос на 80 порт, apache должен был просто c помощью mod_rewrite переправлять на 443 порт. Отключили apache на 80 порту и поставили на этот порт nginx. В результате, под такой же нагрузкой nginx использовал всего 2% CPU!

      Но были у нас сервера с apache, где требовался mod_security, особенно в зонах PCI DSS Level 1.

      У тут несколько недель назад узнали, что в mod_security в экспериментальной ветке появилась поддержка mod_security. Не выдержали. Стали пробовать. nginx с mod_security падал. Стали править код mod_security, особенно модуль для nginx. И когда все заработало и ошибок при тестировани не наблюдалось — было решено использовать на production. Как раз в это время был аудит одной из зон с PCI DSS Level 1. Аудитору из acertigo очень понравилось это решение, несмотря на экспериментальный статус.

      Кстати, до вчерашнего дня модуль modsecurity для nginx из trunk был нерабочим.
        +4
        Проводились ли нагрузочные испытания? Какой оверхед по сравнению с голым nginx при прочих равных настройках?
          0
          Во-во, присоединяюсь, очень интересно!
            0
            испытаний пока не проводилось — на первом этапе хочется сделать «чтобы работало», а дальше оптимизировать.
            судя по архитектуре modsecurity — просадка будет очень большая, но все-равно меньше чем с apache ;)

            –2
            Блин лучше бы реврайт правила от апача прикрутили бы
              0
              правильно, зачем безопасность — лучше мы реврайте «красиво» будет писать, а то что сайт хакают — ну и пусть
                0
                Да в nginx есть nasix по моему называется, аналог мод секурити.
              0
              Кто использовал naxsi и modsecurity, поделитесь впечатлениями, что удобеней. В проде используем naxsi.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое