Вопрос или проблема
У меня есть три пользовательских HTTP-заголовка: X-Username, X-Role и X-Realm. Я хочу записывать содержимое этих заголовков в журналы предупреждений, когда какое-либо из правил соответствует HTTP-запросу.
Я отредактировал одно правило, чтобы записывать значения заголовков
ModSecurity: Предупреждение. Совпало “Оператор
Gt' с параметром
5′ для переменнойTX:ANOMALY_SCORE' (Значение:
30′ ) [файл “/usr/local/coreruleset-4.4.0/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf”] [строка “82”] [id “9990004”] [rev “”] [msg “Блокировка запроса с захваченными заголовками”] [data “X-Username: username, X-Role: admin, X-Realm: realm”] [severity “0”] [ver “”] [maturity “0”] [accuracy “0”] [tag “application-attack”] [hostname “10.38.135.193”] [uri “/”] [unique_id “173028670423.657145”] [ref “”]
Как мне добавить эти данные в каждое правило без ручного редактирования каждого из них?
Ответ или решение
Для логирования пользовательских HTTP-заголовков в предупреждениях ModSecurity с использованием набора правил OWASP Core необходимо создать централизованный механизм, который позволит добавлять значения заголовков в логи без изменения каждого правила вручную. Это можно реализовать с помощью переменных ModSecurity и правила, который будет обрабатывать заданные заголовки.
Шаги для логирования кастомных HTTP-заголовков в предупреждениях:
-
Определение переменных для заголовков:
В модуле ModSecurity вы можете использовать переменные для доступа к заголовкам. В вашем случае вам нужно будет создать несколько переменных для хранения значений заголовковX-Username
,X-Role
иX-Realm
. -
Создание пользовательского правила:
Вам необходимо создать правило, которое будет автоматически обрабатывать заголовки и добавлять их в данные логирования при срабатывании любого другого правила. Например:SecRule REQUEST_HEADERS:X-Username "^[\w-]+$" "id:1000001, phase:1, pass, t:none, setvar:tx.x_username=%{REQUEST_HEADERS:X-Username}" SecRule REQUEST_HEADERS:X-Role "^[\w-]+$" "id:1000002, phase:1, pass, t:none, setvar:tx.x_role=%{REQUEST_HEADERS:X-Role}" SecRule REQUEST_HEADERS:X-Realm "^[\w-]+$" "id:1000003, phase:1, pass, t:none, setvar:tx.x_realm=%{REQUEST_HEADERS:X-Realm}"
В этих правилах захватываются значения заголовков и сохраняются во временных переменных
tx:
. -
Модификация сообщения предупреждения:
После того как у нас есть переменные с заголовками, необходимо изменить каждое правило, которое вы хотите модифицировать, чтобы оно ссылалось на эти переменные в сообщениях логирования. Для этого можно использовать следующее правило:SecAction "id:9990005, phase:1, log, msg:'Custom headers: X-Username: %{tx.x_username}, X-Role: %{tx.x_role}, X-Realm: %{tx.x_realm}'"
Это правило срабатывает и добавляет значения заголовков в сообщение о предупреждении, которое будет записано в журнал при срабатывании других правил.
-
Включение вашего правила в основной конфиг:
Важно убедиться, что ваши правила заголовков и логирование включены в конфигурационный файл ModSecurity перед загрузкой других правил, чтобы гарантировать, что пользовательские заголовки будут обрабатываться правильно.
Применение изменений:
После внесения изменений в конфигурацию вам необходимо перезапустить веб-сервер или службу ModSecurity для применения новых правил. Пожалуйста, проверяйте логи, чтобы убедиться, что информация из заголовков корректно записывается в предупреждения.
Заключение:
Таким образом, вы можете централизованно управлять логированием пользовательских HTTP-заголовков в правилах ModSecurity. Это снизит вероятность ошибок, связанных с ручным редактированием каждого правила, и обеспечит более устойчивое и безопасное поведение вашего веб-приложения.