Нужна помощь с логами Modsecurity – DetectionOnly vs On (Enforce)

Вопрос или проблема

Мне нужна помощь с логами ModSecurity в нашей среде Kubernetes. У нас есть контроллер входящего трафика, и весь трафик проходит через него. Я включил ModSecurity/OWASP с помощью конфигурационных карт, и конфигурация работает как положено. Я получаю логи с кодами состояния 200 и 403, где это применимо.

В настоящее время я установил ModSecurity в режиме DetectionOnly. Однако я пытаюсь выяснить, какие запросы будут блокироваться, когда я переключу SecRuleEngine на On (режим Enforce). После просмотра логов мне трудно определить разницу.

Например, предположим, что запрос к https://abc.myhost.com/xyz отмечен как тот, который должен быть заблокирован, когда SecRuleEngine включен, но не блокируется из-за режима DetectionOnly. Как я могу это различить, используя логи? Я привел пример ниже для DetectionOnly. Единственное различие, которое я вижу, когда DetectionOnly изменяется на ON, это “secrules_engine”:”Enabled”,

Находясь в режиме DetectionOnly, я хочу понять, какие запросы будут блокироваться, когда я переключу его на ON. Но логи не дают мне отличительных признаков.

{
    "transaction":{
       "client_ip":"103.x.x.x",
       "time_stamp":"Wed Feb 19 13:48:56 2025",
       "server_id":"97a0d4c73dd",
       "client_port":62482,
       "host_ip":"10.x.x.x",
       "host_port":8444,
       "unique_id":"17399729.475138",
       "request":{
          "method":"POST",
          "http_version":2.0,
          "uri":"/suite/JSON-RPC?appian_environment=tempo"
       },
       "response":{
          "http_code":200
       },
       "producer":{
          "modsecurity":"ModSecurity v3.0.12 (Linux)",
          "connector":"ModSecurity-nginx v1.0.3",
          "secrules_engine":"DetectionOnly",
          "components":[
             "OWASP_CRS/4.4.0\""
          ]
       },
       "messages":[
          {
             "message":"Тип содержимого запроса не разрешен политикой",
             "details":{
                "match":"Совпадение \"Operator `Within' с параметром `|application/x-www-form-urlencoded| |multipart/form-data| |multipart/related| |text/xml| |application/xml| |application/soap+xml| |application/json| |application/cloudevents+json| |application/cloudev (16 characters omitted)' against variable `TX:content_type' (Value: `|text/plain|' )",
                "reference":"o0,10v383,10t:lowercase",
                "ruleId":"920420",
                "file":"/etc/nginx/owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf",
                "lineNumber":"993",
                "data":"|text/plain|",
                "severity":"2",
                "ver":"OWASP_CRS/4.4.0",
                "rev":"",
                "tags":[
                   "application-multi",
                   "language-multi",
                   "platform-multi",
                   "attack-protocol",
                   "paranoia-level/1",
                   "OWASP_CRS",
                   "capec/1000/255/153",
                   "PCI/12.1"
                ],
                "maturity":"0",
                "accuracy":"0"
             }
          },
          {
             "message":"Превышен лимит входной аномалии (общий счёт: 5)",
             "details":{
                "match":"Совпадение \"Operator `Ge' с параметром `5' against variable `TX:BLOCKING_INBOUND_ANOMALY_SCORE' (Value: `5' )",
                "reference":"",
                "ruleId":"949110",
                "file":"/etc/nginx/owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf",
                "lineNumber":"222",
                "data":"",
                "severity":"0",
                "ver":"OWASP_CRS/4.4.0",
                "rev":"",
                "tags":[
                   "anomaly-evaluation",
                   "OWASP_CRS"
                ],
                "maturity":"0",
                "accuracy":"0"
             }
          }
       ]
    }
 }

configmap

  modsecurity-snippet: >-
    SecRule REQUEST_URI "@contains suite/JSON-RPC"
      "id:100001,phase:1,pass,t:none,nolog,ctl:ruleRemoveById=920420,chain"

    SecRule REQUEST_HEADERS:Host "@contains myhost.com" "t:none"

    SecRequestBodyAccess On

    SecAuditLogParts AHKZ

    # Отклонять, если больше (мы также могли бы позволить пройти с ProcessPartial)
    SecRequestBodyLimitAction Reject

    # Отправлять аудиторские логи ModSecurity в stdout (только для отклоненных запросов)
    SecAuditLog /dev/stdout

    # формировать логи в JSON
    SecAuditLogFormat JSON

    # может быть On/Off/RelevantOnly
    SecAuditEngine RelevantOnly

    SecAction "id:900000,phase:1,nolog,pass,t:none,setvar:tx.paranoia_level=2"
    SecAction "id:900200,phase:1,nolog,pass,t:none,setvar:tx.allowed_methods=GET HEAD POST OPTIONS PUT PATCH DELETE"

    SecRule REQUEST_HEADERS:Content-Type "@rx application/vnd.appian.tv\+json" "id:100002,phase:1,allow,log"

    # Правило имеет уровень серьёзности 4, поэтому не было заблокировано
    SecRule REMOTE_ADDR "@ipMatch 127.0.0.1" "id:10000,phase:1,pass,nolog,chain"
    # Не используем ipMatch, так как не поддерживает порты
    SecRule REQUEST_HEADERS:Host "@streq 127.0.0.1:10246" "ctl:ruleRemoveById=920350"

    SecRuleEngine DetectionOnly

Ответ или решение

Конфигурирование ModSecurity в режиме DetectionOnly представляет собой важный шаг в обеспечении безопасности среды Kubernetes, позволяя вам протестировать правила и логику работы без реального блокирования трафика. Однако в случаях, когда нужно переключиться на режим Enforce (включенный SecRuleEngine), необходимо четко понимать, какие именно запросы будут блокироваться на основе текущих правил.

Теория (Theory)

ModSecurity – это веб-аппликационный брандмауэр (WAF), который предоставляет средства для защиты веб-приложений от различных типов атак. Основные возможности ModSecurity включают контроль над входящими и исходящими запросами, мониторинг, ведение логов и блокировку подозрительных запросов на основе предустановленных правил, таких как OWASP CRS (Core Rule Set).

Когда ModSecurity находится в режиме DetectionOnly, он регистрирует все, что попадает под правила, но не блокирует эти запросы. Задача состоит в том, чтобы отфильтровать эти логи и определить, какие запросы приведут к блокировке при активации режима Enforce. Это важно для перехода, чтобы избежать ложных срабатываний или ненужных блокировок, которые могут повлиять на нормальную работу пользователей.

Пример (Example)

Ваше текущее окружение используется с контроллером ingress в Kubernetes, который обрабатывает весь поступающий трафик. ModSecurity настроен с использованием конфиг-мапа, где включены OWASP модуль и несколько специфических правил. Лог показывает, что запросы с различными HTTP статус кодами (например, 200 и 403) регистрируются, а режим SecRuleEngine установлен как DetectionOnly. Вы пытаетесь понять, какие из этих запросов будут заблокированы при включении режима Enforce. Фрагмент лога предоставляет информацию о транзакции, включая IP клиента, временную метку, уникальный идентификатор запроса, метод HTTP (например, POST) и другую сопутствующую информацию.

Применение (Application)

Чтобы лучше понять, какие запросы могут быть заблокированы в режиме Enforce, обратите внимание на поле ‘messages’ в логах. Каждая запись внутри ‘messages’ содержит информацию о правилах, которые были задействованы при обработке конкретного запроса. Например:

  1. Сообщение: "Request content type is not allowed by policy"

    • Details:
      • Правило (ruleId): 920420
      • Сопоставлено: ‘Matched "Operator Within' with parameter ... against variableTX:content_type’
      • Это правило сигнализирует о неподходящем типе контента, который будет активирован в режима Enforce. Тут важно рассмотреть необходимость корректировки правил, если такие запросы являются допустимыми в вашей системе.
  2. Сообщение: "Inbound Anomaly Score Exceeded (Total Score: 5)"

    • Details:
      • Правило (ruleId): 949110
      • Здесь указывается, что связанный аномальный балл превышает установленный порог, что может привести к блокировке при активации Enforce.

Для принятия обоснованного решения о переходе на Enforce, важно не только рассматривать наличие сообщений о нарушении правил, но и контекст использования вашего приложения. Обратите внимание на логи за определенный период, чтобы выявить повторяющиеся нарушения, которые могут быть ложными срабатываниями. Поскольку в логах режим SecRuleEngine на DetectionOnly, его замена на On не изменит содержания существующих в DetectionOnly, но к ним добавится секция ‘SecRules_Engine’, указывающая на активацию режима Enforce.

Чтобы минимизировать возможные сбои при переключении на Enforce, рекомендуется:

  • Идентификация и адаптация правил: Использовать конфигурацию и специфические правила блокировки для тех запросов, которые должны быть легитимно пропущены.
  • Тестирование и мониторинг: Провести тестирование в контролируемой среде с целью отладки и мониторинга влияния на реальные запросы.
  • Модерация баллов аномалии: Возможно, стоит пересмотреть критические пороги для правил, связанных с общей аномальной активностью или IP-адресом, чтобы избежать излишней блокировки.

Таким образом, переход на режим Enforce становится более управляемым процессом, который снижает риск нарушения работы веб-приложения. Используйте полученные логи для оптимизации ваших правил с учетом специфики вашего бизнеса и характера трафика.

Оцените материал
Добавить комментарий

Капча загружается...