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

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

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

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

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

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

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

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

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

{ 
    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.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/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.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/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.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/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2", 
    "operationName": "ApplicationGatewayFirewall", 
    "category": "ApplicationGatewayFirewallLog", 
    "properties": { 
        "instanceId": "appgw_3", 
        "clientIp": "167.220.2.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 , вы можете сделать несколько действий, чтобы остановить этот трафик:

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

    Дополнительные сведения о списках исключений см. в статье Конфигурация WAF.

  • отключить правило.

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

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

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

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

Исключения

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

Списки исключений WAF

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

Отключение правил

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

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

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

Правила WAF

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

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

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

Снимок экрана: веб-отладчик Progress Telerik Fiddler. На вкладке Raw (Необработанные данные) фрагмент

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

Исключение WAF

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

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

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

-	{
-	    "resourceId": "/SUBSCRIPTIONS/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.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/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.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/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.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/A6F44B25-259E-4AF5-888A-386FED92C11B/RESOURCEGROUPS/DEMOWAF_V2/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/DEMOWAF-V2",
-	    "operationName": "ApplicationGatewayFirewall",
-	    "category": "ApplicationGatewayFirewallLog",
-	    "properties": {
-	        "instanceId": "appgw_3",
-	        "clientIp": "167.220.2.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), вы понимаете, что два нижних правила со свойством action: Blocked блокируют трафик на основе общей оценки аномалий. Правила, на которые следует обратить внимание, являются двумя верхними.

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

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

Поиск имен заголовков запросов

Fiddler — это удобный инструмент для поиска имен заголовков запросов. На следующем снимке экрана показаны заголовки запроса GET, которые содержат такие сведения, как тип содержимого, агент пользователя и т. д.

Снимок экрана: веб-отладчик Progress Telerik Fiddler. На вкладке Raw (Необработанные данные) указаны такие сведения, как соединение, тип содержимого и агент пользователя.

Другим способом просмотреть заголовки запросов и ответов является поиск в инструментах разработчика Chrome. Можно нажать клавишу F12 или щелкнуть правой кнопкой мыши, выбрать >Проверить ->Средства разработчика и открыть вкладку Сеть. Загрузите веб-страницу и выберите запрос, который необходимо проверить.

F12 в Chrome

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

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

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

    Установив для параметра "Проверить текст запроса", тела запросов трафика не оцениваются WAF. Это может быть полезно, если известно, что текст запросов не является вредоносным для приложения.

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

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

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

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

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

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

    Примечание.

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

Метрики брандмауэра (только WAF_v1)

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

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

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

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

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