Список исключений Брандмауэра веб-приложений
Брандмауэр веб-приложения (WAF) шлюза приложений Azure обеспечивает защиту веб-приложений. В этой статье описана настройка списков исключений WAF. Эти параметры находятся в политике WAF, связанной с вашим Шлюзом приложений Azure. Дополнительные сведения о политиках WAF см. в статьях Подробные сведения о брандмауэре веб-приложений Azure в Шлюзе приложений Azure и Создание политик Брандмауэра веб-приложений для Шлюза приложений.
Иногда WAF может блокировать запрос, который требуется разрешить для приложения. Списки исключений WAF позволяют пропустить некоторые атрибуты запроса при проверке WAF. Остальная часть запроса оценивается как нормальная.
Например, служба Active Directory вставляет токены, которые используются для проверки подлинности. При использовании в заголовке запроса эти маркеры могут содержать специальные знаки, которые могут вызвать ложноположительное обнаружение по правилам WAF. Добавив заголовок в список исключений, вы можете настроить WAF на игнорирование заголовка, но WAF по-прежнему будет оценивать остальную часть запроса.
Вы можете настроить исключения, которые будут применяться при оценке определенных правил WAF или применяться глобально к оценке всех правил WAF. Правила исключений применяются ко всему веб-приложению.
Определение атрибутов запроса, которые будут исключены
При настройке исключения WAF необходимо указать атрибуты запроса, которые следует исключить из оценки WAF. Вы можете настроить исключение WAF для следующих атрибутов запроса:
- Заголовки запросов
- Запрос файлов cookie
- Имя атрибута запроса (args) можно добавить как элемент исключения, например:
- Имя поля формы
- Сущность JSON
- Аргументы строки запроса URL-адреса
Вы можете указать точное соответствие заголовка запроса, текста, файла cookie или атрибута строки запроса. Либо вы можете задать частичное соответствие. Используйте приведенные ниже операторы для настройки исключения.
- Equals: этот оператор используется для точного совпадения. Например, для выбора заголовка с именем bearerToken используйте оператор равенства со значением селектора bearerToken.
- Starts with: этот оператор находит все поля, которые начинаются с указанного значения селектора.
- Ends with: этот оператор соответствует всем полям запроса, которые заканчиваются указанным значением селектора.
- Contains: этот оператор находит все поля запроса, которые содержат указанное значение селектора.
- Equals any: этот оператор находит все поля запроса. * — значение селектора. Например, этот оператор используется, если вы не знаете точные значения для заданной переменной соответствия, но хотите убедиться, что трафик запроса по-прежнему исключается из оценки правил.
При обработке исключений подсистема WAF выполняет сопоставление с учетом регистра и не учитывается на основе приведенной ниже таблицы. Кроме того, регулярные выражения не допускаются, так как селекторы и тела ЗАПРОСОВ XML не поддерживаются.
Часть текста запроса | CRS 3.1 и более ранних версий | CRS 3.2 и более поздних версий |
---|---|---|
Заголовок* | Без учета регистра | Без учета регистра |
Печенье* | Без учета регистра | С учетом регистра |
Строка запроса* | Без учета регистра | С учетом регистра |
Текст в кодировке URL-адреса | Без учета регистра | С учетом регистра |
Текст JSON | Без учета регистра | С учетом регистра |
Текст XML | Не поддерживается | Не поддерживается |
Многопартийное тело | Без учета регистра | С учетом регистра |
*В зависимости от приложения, имен и значений заголовков, файлов cookie и запросов args могут быть конфиденциальными или нечувствительными к регистру.
Примечание.
Дополнительные сведения и информацию об устранении неполадок см. в статье Устранение неполадок WAF.
Запрос атрибутов по ключам и значениям
При настройке исключения необходимо определить, следует ли исключить ключ или значение из оценки WAF.
Предположим, что запросы включают этот заголовок:
My-Header: 1=1
Значение заголовка (1=1
) может быть обнаружено WAF как атака. Но если вы знаете, что это допустимое значение для вашего сценария, можно настроить исключение для значения заголовка. Для этого используется переменная сопоставления RequestHeaderValues , оператор содержит и селектор (My-Header
). Эта конфигурация останавливает оценку всех значений заголовка My-Header
.
Примечание.
Атрибуты запроса по ключу и значениям доступны только в CRS 3.2 или более поздней версии и Bot Manager 1.0 или более поздней версии.
Атрибуты запроса по именам работают так же, как и атрибуты запроса по значениям, и включены для обратной совместимости с CRS 3.1 и более ранними версиями. Мы рекомендуем использовать атрибуты запроса по значениям вместо атрибутов по именам. Например, используйте RequestHeaderValues вместо RequestHeaderNames.
В отличие от этого, если WAF обнаруживает имя заголовка (My-Header
) как атаку, можно настроить исключение для ключа заголовка с помощью атрибута запроса RequestHeaderKeys. Атрибут RequestHeaderKeys доступен только в CRS 3.2 или более поздней версии и Bot Manager 1.0 или более поздней версии.
Примеры атрибутов запроса
В приведенной ниже таблице показаны некоторые примеры того, как можно структурировать исключение для заданной переменной соответствия.
Атрибут для исключения | matchVariable | selectorMatchOperator | Пример селектора | Пример запроса | Что исключается |
---|---|---|---|---|---|
Строка запроса | RequestArgKeys | Равно | /etc/passwd |
Ури: http://localhost:8080/?/etc/passwd=test |
/etc/passwd |
Строка запроса | RequestArgKeys | EqualsAny | Н/П | Ури: http://localhost:8080/?/etc/passwd=test&.htaccess=test2 |
/etc/passwd и .htaccess . |
Строка запроса | RequestArgNames | Равно | text |
Ури: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
Строка запроса | RequestArgNames | EqualsAny | Н/П | Ури: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd и .cshrc . |
Строка запроса | RequestArgValues | Равно | text |
Ури: http://localhost:8080/?text=/etc/passwd |
/etc/passwd |
Строка запроса | RequestArgValues | EqualsAny | Н/П | Ури: http://localhost:8080/?text=/etc/passwd&text2=.cshrc |
/etc/passwd и .cshrc . |
Текст запроса | RequestArgKeys | Содержит | sleep |
Текст запроса: {"sleep(5)": "test"} |
sleep(5) |
Текст запроса | RequestArgKeys | EqualsAny | Н/П | Текст запроса: {".zshrc": "value", "sleep(5)":"value2"} |
.zshrc и sleep(5) . |
Текст запроса | RequestArgNames | Равно | test |
Текст запроса: {"test": ".zshrc"} |
.zshrc |
Текст запроса | RequestArgNames | EqualsAny | Н/П | Текст запроса: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc и sleep(5) . |
Текст запроса | RequestArgValues | Равно | test |
Текст запроса: {"test": ".zshrc"} |
.zshrc |
Текст запроса | RequestArgValues | EqualsAny | Н/П | Текст запроса: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc и sleep(5) . |
Верхний колонтитул | RequestHeaderKeys | Равно | X-Scanner |
заголовок: {"X-Scanner": "test"} ; |
X-scanner |
Верхний колонтитул | RequestHeaderKeys | EqualsAny | Н/П | заголовок: {"X-Scanner": "test", "x-ratproxy-loop": "value"} ; |
X-Scanner и x-ratproxy-loop . |
Верхний колонтитул | RequestHeaderNames | Равно | head1 |
заголовок: {"head1": "X-Scanner"} ; |
X-scanner |
Верхний колонтитул | RequestHeaderNames | EqualsAny | Н/П | заголовок: {"head1": "myvar=1234", "User-Agent": "(hydra)"} ; |
myvar=1234 и (hydra) . |
Верхний колонтитул | RequestHeaderValues | Равно | head1 |
заголовок: {"head1": "X-Scanner"} ; |
X-scanner |
Верхний колонтитул | RequestHeaderValues | EqualsAny | Н/П | заголовок: {"head1": "myvar=1234", "User-Agent": "(hydra)"} ; |
myvar=1234 и (hydra) . |
Файл cookie | RequestCookieKeys | Содержит | /etc/passwd |
заголовок: {"Cookie": "/etc/passwdtest=hello1"} ; |
/etc/passwdtest |
Файл cookie | RequestCookieKeys | EqualsAny | Н/П | заголовок: {"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} ; |
/etc/passwdtest и .htaccess . |
Файл cookie | RequestCookieNames | Равно | arg1 |
заголовок: {"Cookie": "arg1=/etc/passwd"} ; |
/etc/passwd |
Файл cookie | RequestCookieNames | EqualsAny | Н/П | заголовок: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} ; |
/etc/passwd и .cshrc . |
Файл cookie | RequestCookieValues | Равно | arg1 |
заголовок: {"Cookie": "arg1=/etc/passwd"} ; |
/etc/passwd |
Файл cookie | RequestCookieValues | EqualsAny | Н/П | заголовок: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} ; |
/etc/passwd и .cshrc . |
Примечание.
При создании исключения с помощью селектораMatchOperator EqualsAny
все, что вы помещаете в поле селектора, преобразуется в "*" серверной частью при создании исключения.
Области исключения
Исключения можно настроить так, чтобы они применялись к определенному набору правил WAF, к наборам правил или глобально ко всем правилам.
Совет
Рекомендуется делать исключения как можно более узкими и конкретными, чтобы не оставить случайно возможности для злоумышленников использовать вашу систему. Если необходимо добавить правило исключения, при возможности используйте исключения для отдельных правил.
Исключения для отдельных правил
Вы можете настроить исключение для отдельного правила, группы правил или набора правил. Необходимо указать правило или правила, к которым применяется исключение. Кроме того, необходимо указать атрибут запроса, который следует исключить из оценки WAF. Чтобы исключить всю группу правил, укажите только параметр ruleGroupName
. Параметр rules
будет полезен только в том случае, если необходимо исключить лишь определенные правила группы.
Исключения для каждого правила доступны при использовании набора правил OWASP (CRS) версии 3.2 или более поздней версии или набора правил Bot Manager версии 1.0 или более поздней.
Пример
Предположим, что нужно, чтобы брандмауэр веб-приложения (WAF) не учитывал значение заголовка запроса User-Agent
. Заголовок User-Agent
содержит строку характеристик, которая позволяет одноранговым узлам сетевого протокола определять тип приложения, операционную систему, поставщика ПО или версию ПО агента пользователя программного обеспечения, выполняющего запрос. Дополнительные сведения см. в статье User-Agent.
Запрет на проверку этого заголовка может потребоваться по ряду причин. Может существовать строка, которую WAF распознает и считает вредоносной. Например, заголовок User-Agent
может включать классическую атаку путем внедрения кода SQL x=x
в строку. В некоторых случаях это может быть допустимый трафик. Поэтому может потребоваться исключить этот заголовок из проверки WAF.
Вы можете использовать следующие подходы, чтобы исключить заголовок User-Agent
из оценки всеми правилами внедрения SQL:
Чтобы настроить исключение для каждого правила с помощью портала Azure, выполните следующие действия.
Перейдите к политике WAF и выберите Управляемые правила.
Выберите Добавление исключений.
В поле Область применения выберите набор правил CRS, к которому следует применить исключение, например OWASP_3.2.
Выберите Добавление правил и выберите правила, к которым необходимо применить исключения.
Настройте переменную сопоставления, оператор и селектор. Затем выберите Сохранить.
Можно настроить несколько исключений.
Вы также можете исключить заголовок User-Agent
из оценки только по правилу 942270:
Выполните действия, описанные в предыдущем примере, и выберите правило 942270 на шаге 4.
Глобальные исключения
Вы можете настроить исключение, которое будет применяться ко всем правилам WAF.
Пример
Например, нужно исключить значение в параметре user, передаваемом в запросе в составе URL-адреса. Например, предположим, что в вашей среде для аргумента строки запроса user
часто попадается строка, которая в брандмауэре веб-приложения считается вредоносным содержимым. Поэтому WAF ее блокирует. Можно исключить все аргументы строки запроса, в которых имя начинается со слова user
, чтобы WAF не вычислял значение поля.
В следующем примере показано, как можно исключить аргумент строки запроса user
из вычисления:
Чтобы настроить глобальное исключение с помощью портала Azure, сделайте следующее:
Перейдите к политике WAF и выберите Управляемые правила.
Выберите Добавление исключений.
В поле Область применения выберите Глобальная
Настройте переменную сопоставления, оператор и селектор. Затем выберите Сохранить.
Можно настроить несколько исключений.
Таким образом, если URL-адрес http://www.contoso.com/?user%3c%3e=joe
сканируется WAF, он не будет оценивать строковый джо, но он по-прежнему оценивает имя параметра user %3c%3e.
Следующие шаги
- После настройки параметров WAF вы можете узнать, как просматривать журналы WAF. Дополнительные сведения см. в разделе Журналы диагностики.
- Дополнительные сведения о безопасности сети Azure