Поделиться через


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

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

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

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

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

Цель журналов WAF — показать каждый запрос, который WAF сопоставляет или блокирует. It's a ledger of all evaluated requests that are matched or blocked. If you notice that the WAF blocks a request that it shouldn't (a false positive), you can do a few things. Сначала ограничьте область и найдите конкретный запрос. Просмотрите журналы, чтобы найти конкретный URI, метку времени или идентификатор транзакции для запроса. When you find the associated log entries, you can begin to act on the false positives.

Предположим, что у вас есть допустимый трафик, содержащий строку 1=1, который вы хотите передать через WAF. При попытке запроса WAF блокирует трафик, содержащий 1=1 строку в любом параметре или поле. Это строка часто связана с атакой путем внедрения кода SQL. You can look through the logs and see the timestamp of the request and the rules that blocked/matched.

В следующем примере вы можете увидеть, как во время одного запроса активируются четыре правила (с использованием поля TransactionId). The first one says it matched because the user used a numeric/IP URL for the request, which increases the anomaly score by three since it's a warning. Следующее сработавшее правило — это 942130, то самое, которое вы ищете. Вы можете увидеть 1=1 в поле details.data. This further increases the anomaly score by three again, as it's also a warning. Generally, every rule that has the action Matched increases the anomaly score, and at this point the anomaly score would be six. Дополнительные сведения см. в статье Режим оценки аномалий.

Последние две записи журнала показывают, что запрос был заблокирован, так как показатель аномалии оказался достаточно высоким. These entries have a different action than the other two. Они показывают, что на самом деле заблокировали запрос. Эти правила являются обязательными не могут быть отключены. Их следует рассматривать не как правила, а скорее как элементы базовой внутренней инфраструктуры WAF.

{ 
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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, вы можете предпринять несколько шагов, чтобы не допустить блокировки этого трафика.

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

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

  • Disable the rule.

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

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

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

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

Исключения

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

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

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

Disabling rules

Another way to get around a false positive is to disable the rule that matched on the input the WAF thought was malicious. Since you've parsed the WAF logs and have narrowed the rule down to 942130, you can disable it in the Azure portal. См. статью Настройка правил брандмауэра веб-приложения на портале Azure.

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

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

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

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

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

Снимок экрана веб-отладчика Progress Telerik Fiddler. На вкладке Raw видно

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

Исключение WAF

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

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

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

-	{
-	    "resourceId": "/SUBSCRIPTIONS/66667777-aaaa-8888-bbbb-9999cccc0000/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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/66667777-aaaa-8888-bbbb-9999cccc0000/RESOURCEGROUPS/DEMOWAF_V2/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), вы понимаете, что два нижних правила со свойством action: Blocked блокируют трафик на основе общей оценки аномалий. The rules to focus on are the top two.

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

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

Finding request header names

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

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

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

Chrome F12

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

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

  • Disable request body inspection

    By setting Inspect request body to off, the request bodies of your traffic aren't evaluated by your WAF. Это может быть полезно, если известно, что текст запросов не является вредоносным для приложения.

    When you disable this option, only the request body bypasses inspection. Заголовки и файлы cookie по-прежнему проверяются, если отдельные из них не исключаются с помощью функций списка исключений.

  • Disable maximum request body limit

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

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

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

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

    Примечание.

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

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

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

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

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

  1. Счетчик запросов, заблокированных Брандмауэром веб-приложений,— количество заблокированных запросов
  2. Web Application Firewall Blocked Rule Count All rules that were matched and the request was blocked
  3. Общее распределение правил Брандмауэра веб-приложений — все правила, для которых было найдено соответствие во время проверки

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

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

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