Диагностика Брандмауэр веб-приложений (WAF) для Шлюз приложений Azure

Сводка

Эта статья поможет устранить неполадки Брандмауэр веб-приложений (WAF) для Шлюз приложений Azure при блокировке допустимых запросов, чтобы разрешить допустимый трафик при сохранении защиты.

Начните с просмотра обзора WAF и документации по конфигурации WAF и убедитесь, что мониторинг WAF включен. В этих статьях объясняется, как работает WAF, как работают наборы правил и как получить доступ к журналам WAF.

Набор правил OWASP по умолчанию строго настроен и может быть подстроен под конкретные потребности приложения или организации, использующих WAF. Это полностью нормально, и ожидается во многих случаях, чтобы создавать исключения, пользовательские правила и даже отключать правила, которые могут вызвать проблемы или ложные срабатывания. Политики каждого сайта и URI позволяют изменять эти изменения только на определенные сайты или URI. Поэтому изменения не должны влиять на другие сайты, которые могут не столкнуться с теми же проблемами.

Общие сведения о журналах WAF

Цель журналов WAF — показать каждый запрос, который WAF сопоставляет или блокирует. Это реестр всех оцененных запросов, которые совпадают или блокируются. Если вы заметили, что WAF блокирует запрос, который он не должен (ложноположительным), можно выполнить несколько действий. Сначала сузите и найдите конкретный запрос. Просмотрите журналы, чтобы найти конкретный URI, метку времени или идентификатор транзакции запроса. Когда вы находите связанные записи журнала, можно приступать к действиям против ложных срабатываний.

Например, предположим, что у вас есть допустимый трафик, содержащий строку 1=1 , которую вы хотите передать через WAF. При попытке запроса WAF блокирует трафик, содержащий 1=1 строку в любом параметре или поле. Эта строка часто связана с атакой с использованием SQL-инъекции. Вы можете просмотреть журналы и увидеть метку времени запроса, а также правила, которые блокировали запрос или совпадали с ним.

В следующем примере можно увидеть, что четыре правила активируются во время одного запроса (с помощью поля TransactionId). Первый говорит, что он соответствует, так как пользователь использовал числовые IP-адреса для запроса, что увеличивает оценку аномалий на три, так как это предупреждение. Следующее правило, которое соответствует: 942130, это то, что вы ищете. Вы можете увидеть 1=1 в поле details.data. Это еще больше увеличивает балл аномалии на три, так как это также предупреждение. Как правило, каждое правило, которое имеет действие Matched , увеличивает оценку аномалий, и на этом этапе оценка аномалии составляет шесть. Дополнительные сведения см. в режиме оценки аномалий.

Последние две записи журнала показывают, что запрос был заблокирован, так как оценка аномалий была достаточно высокой. Эти записи имеют другое действие, чем другие два. Они показывают, что они фактически блокируют запрос. Эти правила являются обязательными и не могут быть отключены. Не думайте об этих правилах как правила, но больше как основная инфраструктура внутренних компонентов WAF.

{ 
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "920350",
        "message": "Host header is a numeric IP address",
        "action": "Matched",
        "site": "Global",
        "details": { 
            "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
            "data": "40.90.218.160",
            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
            "line": "791" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "942130",
        "message": "SQL Injection Attack: SQL Tautology Detected.",
        "action": "Matched",
        "site": "Global",
        "details": { 
            "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
            "data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
            "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
            "line": "554" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
        "action": "Blocked",
        "site": "Global",
        "details": { 
            "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
            "data": "",
            "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
            "line": "57" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    } 
} 
{ 
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": { 
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
        "action": "Blocked",
        "site": "Global",
        "details": { 
            "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
            "data": "",
            "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
            "line": "73" 
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt" 
    }
}

Исправить ложные срабатывания

С этой информацией и знаниями, которые правило 942130 соответствует строке 1=1 , можно выполнить несколько действий, чтобы остановить этот правило от блокировки трафика:

Использование списка исключений

Чтобы принять информированное решение об обработке ложноположительных срабатываний, ознакомьтесь с технологиями, которые использует ваше приложение. Например, если стек технологий не включает сервер SQL Server, и вы получаете ложные срабатывания, связанные с этими правилами, отключение этих правил не обязательно ослабляет вашу безопасность.

Одним из преимуществ использования списка исключений является отключение только определенной части запроса. Однако это ограничение означает, что определенное исключение применяется ко всем трафику, проходящим через WAF, так как это глобальный параметр. Например, этот параметр может привести к проблеме, если 1=1 является допустимым запросом в тексте определенного приложения, но не для других. Еще одним преимуществом является то, что вы можете выбрать между текстом, заголовками и файлами cookie, чтобы исключить, если выполняется определенное условие, в отличие от исключения всего запроса.

Иногда определенные параметры передаются в WAF способом, который не может быть интуитивно понятным. Например, есть маркер, который передается при проверке подлинности с помощью Microsoft Entra ID. __RequestVerificationToken обычно передается в виде файла cookie запроса. Однако в некоторых случаях, когда файлы cookie отключены, этот маркер также передается в качестве атрибута запроса или arg. В этом случае необходимо убедиться, что __RequestVerificationToken также добавляется в список исключений в качестве имени атрибута запроса .

Скриншот настроек списка исключений WAF в портале Azure.

В этом примере необходимо исключить имя атрибута Request , равное text1. Это имя атрибута очевидно, так как в журналах брандмауэра можно увидеть имя атрибута: данные: соответствующие данные: 1=1, найденные в ARGS:text1: 1=1. Атрибут — text1. Вы также можете найти это имя атрибута несколькими другими способами, см. раздел "Поиск имен атрибутов запроса".

Снимок экрана: параметры конфигурации WAF для списков исключений в Шлюзе приложений.

Вы можете создавать исключения для WAF в шлюзе приложений на разных уровнях области. Дополнительные сведения см. в списках исключений Брандмауэр веб-приложений.

Отключить правила

Другой способ обработки ложноположительный результат заключается в отключении правила, соответствующего входным данным, который считался вредоносным. Так как вы анализируете журналы WAF и сузили правило до 942130, его можно отключить на портале Azure. См. Настраивайте правила брандмауэра веб-приложения через портал Azure.

Если вы знаете весь трафик, содержащий определенное условие, которое обычно заблокировано, допустимый трафик, можно отключить это правило для всего WAF. Однако если это только допустимый трафик в определенном случае использования, вы открываете уязвимость, отключив это правило для всего WAF, так как это глобальный параметр.

Сведения об использовании Azure PowerShell см. в статье "Настройка правил брандмауэра веб-приложения с помощью PowerShell". Сведения об использовании Azure CLI см. в разделе "Настройка правил брандмауэра веб-приложения с помощью Azure CLI".

Запись HAR-файлов

Вы можете использовать браузер или внешнее средство, например Fiddler, для записи ФАЙЛОВ HTTP-архива (HAR). HAR-файлы содержат сведения о запросах и ответах, выполняемых браузером при загрузке веб-страницы. Эти сведения могут быть полезны для устранения неполадок WAF.

Подсказка

Рекомендуется подготовить HAR-файл при обращении в службу поддержки. Группа поддержки может использовать HAR-файл для диагностики проблемы.

Чтобы записать и сохранить HAR-файл в Microsoft Edge, выполните следующие действия.

  1. Нажмите клавишу F12 или CTRL+SHIFT+I, чтобы открыть Средства разработчика Edge. Вы также можете открыть инструменты из меню панели инструментов в разделе "Другие инструменты > " Средства разработчика.

  2. На вкладке "Консоль " выберите "Очистить консоль " или нажмите клавиши CTRL+L.

Скриншот вкладки Консоль в средствах разработчика Microsoft Edge.

  1. Выберите вкладку "Сеть ".

  2. Выберите «Очистить сетевой журнал» или нажмите CTRL+L, а затем выберите вести журнал сети, если он не записывается.

Скриншот во вкладке

  1. Загрузите веб-страницу, защищенную WAF, и хотите устранить неполадки.

  2. Остановите запись журнала сети, выбрав Остановить запись.

  3. Выберите export HAR (sanitized).. И сохраните HAR-файл.

Скриншот параметра Export HAR (sanitized) в инструментах разработчика Microsoft Edge.

Поиск имен атрибутов запроса

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

В этом примере видно, что поле, в котором введена строка 1=1 , называется text1.

Скриншот веб-отладчика Fiddler. На вкладке

Это поле можно исключить. Дополнительные сведения о списках исключений см. в списках исключений брандмауэра веб-приложения. Вы можете исключить оценку в этом случае, настроив следующее исключение:

Снимок экрана: исключение WAF, настроенное для определенного атрибута запроса.

Вы также можете просмотреть журналы брандмауэра, чтобы узнать, что нужно добавить в список исключений. Чтобы включить ведение журнала, см. работоспособность серверной части, журналы ресурсов и метрики для шлюза приложений.

Просмотрите журнал брандмауэра и просмотрите файл PT1H.json в течение часа, который требуется проверить.

В этом примере вы увидите, что у вас есть четыре правила с одинаковым Идентификатором транзакций, и что все они произошли в одно и то же время:

{
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "920350",
        "message": "Host header is a numeric IP address",
        "action": "Matched",
        "site": "Global",
        "details": {
            "message": "Warning. Pattern match \\\"^[\\\\\\\\d.:]+$\\\" at REQUEST_HEADERS:Host. ",
            "data": "40.90.218.160",
            "file": "rules\/REQUEST-920-PROTOCOL-ENFORCEMENT.conf\\\"",
            "line": "791"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}
{
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "OWASP_CRS",
        "ruleSetVersion": "3.0.0",
        "ruleId": "942130",
        "message": "SQL Injection Attack: SQL Tautology Detected.",
        "action": "Matched",
        "site": "Global",
        "details": {
            "message": "Warning. Pattern match \\\"(?i:([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)([\\\\\\\\d\\\\\\\\w]++)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?:(?:=|\\u003c=\\u003e|r?like|sounds\\\\\\\\s+like|regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)\\\\\\\\2|(?:!=|\\u003c=|\\u003e=|\\u003c\\u003e|\\u003c|\\u003e|\\\\\\\\^|is\\\\\\\\s+not|not\\\\\\\\s+like|not\\\\\\\\s+regexp)([\\\\\\\\s'\\\\\\\"`\\\\\\\\(\\\\\\\\)]*?)(?!\\\\\\\\2)([\\\\\\\\d\\\\\\\\w]+)))\\\" at ARGS:text1. ",
            "data": "Matched Data: 1=1 found within ARGS:text1: 1=1",
            "file": "rules\/REQUEST-942-APPLICATION-ATTACK-SQLI.conf\\\"",
            "line": "554"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}
{
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 8)",
        "action": "Blocked",
        "site": "Global",
        "details": {
            "message": "Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. ",
            "data": "",
            "file": "rules\/REQUEST-949-BLOCKING-EVALUATION.conf\\\"",
            "line": "57"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}
{
    "resourceId": "/SUBSCRIPTIONS/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
    "operationName": "ApplicationGatewayFirewall",
    "category": "ApplicationGatewayFirewallLog",
    "properties": {
        "instanceId": "appgw_3",
        "clientIp": "203.0.113.139",
        "clientPort": "",
        "requestUri": "\/",
        "ruleSetType": "",
        "ruleSetVersion": "",
        "ruleId": "0",
        "message": "Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 8 - SQLI=5,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=0,HTTP=0,SESS=0): SQL Injection Attack: SQL Tautology Detected.",
        "action": "Blocked",
        "site": "Global",
        "details": {
            "message": "Warning. Operator GE matched 5 at TX:inbound_anomaly_score. ",
            "data": "",
            "file": "rules\/RESPONSE-980-CORRELATION.conf\\\"",
            "line": "73"
        },
        "hostname": "vm000003",
        "transactionId": "AcAcAcAcAKH@AcAcAcAcAyAt"
    }
}

Зная, как работает набор правил CRS и что набор правил CRS 3.0 использует систему оценки аномалий (см. Брандмауэр веб-приложений для Шлюз приложений Azure), вы понимаете, что два нижних правила со свойством 'Заблокировано' осуществляют блокировку на основе общей оценки аномалий. Правила, на которых следует сосредоточиться, это два основных.

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

Второй (правило 942130) является интересным. Вы увидите сведения, соответствующие шаблону (1=1), и поле называется text1. Выполните те же предыдущие действия, чтобы исключить имя атрибута запроса , равное имени атрибута 1=1.

Найдите имена заголовков запросов

Используйте Fiddler для поиска имен заголовков запросов. На следующем снимке экрана вы увидите заголовки этого запроса GET, включая Content-Type, User-Agent и другие заголовки.

Снимок экрана – отладчик веб-сайтов Fiddler. На вкладке "Raw" перечислены сведения о заголовке запроса, например, о подключении, типе контента и агенте пользователя.

Вы также можете использовать средства разработчика в Microsoft Edge или Google Chrome для просмотра заголовков запросов и ответов. Дополнительные сведения см. в разделе "Запись HAR-файлов".

Если запрос содержит файлы cookie, выберите вкладку "Файлы cookie" , чтобы просмотреть их в Fiddler.

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

  • Отключение проверки текста запроса

    При отключении текста запроса проверки waF не оценивает тела запросов вашего трафика. Этот параметр полезен, если вы знаете, что тела запросов не являются вредоносными для приложения.

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

  • Отключение максимального ограничения текста запроса

    При отключении максимального ограничения текста запроса WAF может обрабатывать большие тела запросов, не отклоняя их за превышение предела размера. Этот параметр полезен, если у вас регулярно есть большие запросы.

    При отключении этого параметра текст запроса проверяется только до максимального предела проверки текста запроса. Если в запросе есть вредоносное содержимое, превышающее максимальное ограничение проверки текста запроса, WAF не обнаруживает его.

  • Отключение ограничений максимального размера файла

    При отключении ограничений размера файла для WAF большие файлы можно отправлять без отказа WAF от отправки этих файлов. Позволяя отправлять большие файлы, риск перегрузки серверной части увеличивается. Если вы знаете максимальный размер отправки файла, задайте ограничение размера для отправки файлов немного выше ожидаемого максимального размера. Ограничение размера файла обычным вариантом использования для приложения является другим способом предотвращения атак. Однако если отправка файлов регулярно выходит за пределы максимального ограничения размера отправки файлов, может потребоваться полностью отключить ограничения размера отправки файлов, чтобы избежать ложных срабатываний.

    Замечание

    Если вы знаете, что ваше приложение никогда не требует отправки файлов выше заданного размера, можно ограничить этот размер, задав ограничение.

    Предупреждение

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

Метрики брандмауэра (только WAF версии 1)

Для брандмауэров веб-приложений версии 1 портал теперь предоставляет следующие метрики:

  1. Брандмауэр веб-приложений число заблокированных запросов— количество заблокированных запросов.
  2. Брандмауэр веб-приложений число заблокированных правил— все соответствующие правила, и запрос заблокирован.
  3. Брандмауэр веб-приложений общее распределение правил все правила, которые соответствуют во время оценки.

Чтобы включить метрики, перейдите на вкладку "Метрики " на портале и выберите одну из трех метрик.

Следующий шаг