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


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

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

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

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

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

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

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

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

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

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

  • Используйте список исключений. Дополнительные сведения о списках исключений см. в разделе Списки исключений WAF.

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

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

Чтобы принять обоснованное решение об обработке ложноположительного результата, важно ознакомиться с технологиями, используемыми приложением. Предположим, например, что в вашем стеке технологий нет 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 на разных уровнях области. Для получения дополнительной информации см. списки исключений брандмауэра веб-приложений.

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

Еще один способ обойти ложноположительный результат — это отключить правило, которое сработало на входные данные, посчитанные 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.

    Снимок экрана: вкладка

  3. Откройте вкладку Сеть.

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

    Снимок экрана: вкладка

  5. Загрузите веб-страницу, защищенную вашим веб-аппликейшн файрволом (WAF), для которой вы хотите провести устранение неполадок.

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

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

    Снимок экрана: сохранение HAR-файла в средствах разработчика Microsoft Edge.

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

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

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

Снимок экрана веб-отладчика Fiddler. На вкладке 'Raw' 1=1 отображается после имени text1.

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

Снимок экрана, показывающий исключение WAF.

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

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

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

{
    "resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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), вы понимаете, что два нижних правила со свойством action: Blocked блокируют трафик на основе общей оценки аномалий. Правила, на которые следует обратить внимание, это верхние два.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Примечание.

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

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

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

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

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

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

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

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