Глава 9. Условия HTTP¶
Условия HTTP позволяют фильтровать по параметрам HTTP-запроса: методу, версии протокола, коду ответа, а также по параметрам CONNECT-туннеля.
9.1. http.method=¶
Проверяет HTTP-метод запроса. Условие принимает значение true, если метод запроса совпадает с любым из указанных методов, и NULL, если запрос не является HTTP-протоколом.
Синтаксис:
где:
method— один из допустимых HTTP-методов или список в скобках.
Допустимые значения: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, CONNECT, TRACE.
Примечание: BlueCoat дополнительно поддерживает методы
TUNNEL,LINK,UNLINK,PROPFIND,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK,MKDIR,INDEX,RMDIR. Эти методы в Redcoat в настоящее время не поддерживаются.
Поддерживается оператор отрицания !=:
Допустимые слои (BlueCoat): Cache, Exception, Proxy.
Транзакции: HTTP proxy, SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Разрешить POST без аутентификации
http.method=POST authenticate(no) allow
<Proxy>
; Запрет загрузки файлов
http.method=(PUT, POST) url.extension=(exe, bat) deny
<Proxy>
; Запрет всех методов, кроме GET и HEAD
http.method!=(GET, HEAD) deny
http.method.custom=— проверка произвольных (нестандартных) строковых методов; поддерживается (формы сравнения:=/.exact/.prefix/.suffix/.substring/.regex). Имя как в BlueCoat. См. раздел 9.1c.
См. также: http.method.regex= (раздел 9.1a), http.method.custom= (раздел 9.1c), request.header. (глава 10).
9.1a. http.method.regex=¶
Проверяет HTTP-метод запроса с помощью регулярного выражения.
Синтаксис:
где:
regular_expression— регулярное выражение (PCRE-совместимый синтаксис).
Допустимые слои: Cache, Exception, Proxy.
Транзакции: HTTP proxy, SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Разрешить только GET и HEAD
http.method.regex="^(GET|HEAD)$" allow
deny
<Proxy>
; Запретить методы, содержащие цифры (пример BlueCoat)
DENY http.method.regex="[0-9]+"
<Proxy>
; Запретить все методы, начинающиеся с P (POST, PUT, PATCH)
http.method.regex="^P" deny
ALLOW
См. также: http.method= (раздел 9.1).
9.1b. http.request_line.regex=¶
Проверяет полную строку HTTP-запроса (request line) с помощью регулярного выражения. Request line имеет формат "METHOD /path HTTP/version" (например, "GET / HTTP/1.1").
Основное назначение — обнаружение некорректных запросов: табуляции вместо пробелов, лишние пробелы, нестандартные символы, атакующие паттерны.
Синтаксис:
где:
regular_expression— регулярное выражение (PCRE-совместимый синтаксис).
Допустимые слои: Exception, Proxy.
Транзакции: HTTP and SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Разрешить только запросы, начинающиеся с GET
http.request_line.regex="^GET" allow
deny
<Proxy>
; Запретить запросы к /admin
http.request_line.regex="/admin" deny
ALLOW
<Proxy>
; Блокировать некорректные request lines (пример BlueCoat):
; табуляции, ведущие/конечные пробелы, двойные пробелы
DENY("bad HTTP request line") http.request_line.regex="\t|(^ )|( $)|( )"
См. также: http.method= (раздел 9.1), http.method.regex= (раздел 9.1a).
9.1c. http.method.custom=¶
Проверяет HTTP-метод запроса, включая произвольные (нестандартные) строковые методы, не входящие в фиксированный список http.method= (например, PURGE, PATCH-подобные расширения WebDAV, проприетарные методы). В отличие от http.method=, которое принимает только заранее известный набор методов, http.method.custom= сравнивает имя метода как строку и потому подходит для любых значений.
Имя как в BlueCoat.
Синтаксис:
где:
value— имя метода (строка);string_modifier— модификатор строкового сравнения (необязателен; по умолчанию=— точное совпадение):.exact— точное совпадение;.prefix— совпадение по началу строки;.suffix— совпадение по концу строки;.substring— совпадение по подстроке;.regex— регулярное выражение.
Допустимые слои: Cache, Exception, Proxy.
Транзакции: HTTP proxy, SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Запретить нестандартный метод PURGE
http.method.custom=PURGE deny
; Совпадение по подстроке
http.method.custom.substring=PROP deny
См. также: http.method= (раздел 9.1), http.method.regex= (раздел 9.1a).
9.2. http.request.version=¶
Проверяет версию HTTP-протокола, используемую клиентом при выполнении запроса.
Синтаксис и семантика — как в BlueCoat.
Синтаксис:
где:
version— версия HTTP-протокола:0.9,1.0,1.1,2.
Допустимые слои: <Cache>, <Exception>, <Proxy>.
Транзакции: HTTP proxy, SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Разрешить только HTTP/1.1
http.request.version=1.1 allow
deny
<Proxy>
; Заблокировать HTTP/2 (например, для устаревших приложений)
http.request.version=2 deny
ALLOW
См. также: http.response.version= (раздел 9.2a).
9.2a. http.response.version=¶
Проверяет версию HTTP-протокола, используемую origin-сервером при отправке ответа.
Синтаксис и семантика — как в BlueCoat.
Условие фазы ответа. Оценивается после получения ответа от сервера. Правила с этим условием пропускаются на этапе запроса и повторно проверяются при получении ответа.
Синтаксис:
где:
version— версия HTTP-протокола:0.9,1.0,1.1,2.
Допустимые слои: <Cache>, <Exception>, <Proxy>.
Транзакции: HTTP and SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Заблокировать ответы по HTTP/1.0 (устаревший протокол)
http.response.version=1.0 deny
ALLOW
<Proxy>
; Разрешить только HTTP/2 ответы
http.response.version=2 allow
deny
См. также: http.request.version= (раздел 9.2) — версия запроса от клиента.
9.3. http.request_line.regex=¶
Проверяет полную строку HTTP-запроса (request line, например GET /path HTTP/1.1) регулярным выражением. Полезно для обнаружения аномалий протокола и нестандартных запросов.
Синтаксис:
где:
regular_expression— регулярное выражение в кавычках.
Допустимые слои: Proxy.
Транзакции: HTTP proxy transactions.
Примеры:
<Proxy>
; Блокировка запросов к административным путям
http.request_line.regex="^GET /admin.*" deny
<Proxy>
; Обнаружение подозрительных PHP-запросов
http.request_line.regex=".*\.php\?.*cmd=.*" deny
9.4. http.response.code=¶
Проверяет HTTP-код ответа, полученный от origin-сервера. Условие принимает значение true, если текущая транзакция является HTTP-транзакцией и код ответа совпадает с указанным.
Условие фазы ответа. Это условие оценивается после получения ответа от сервера. Правила с этим условием пропускаются на этапе обработки запроса и повторно проверяются, когда ответ доступен. Если условия фазы ответа в политике не используются, дополнительных издержек не возникает.
Синтаксис и семантика — как в BlueCoat.
Синтаксис:
где:
response_code— числовой HTTP-код ответа, список кодов в скобках или диапазон.
Поддерживается указание диапазонов через ..:
Допустимые слои (BlueCoat): Cache, Exception, Proxy.
Транзакции: HTTP and SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Сброс веса ошибки при 403
http.response.code=403 attack_detection.failure_weight(0)
<Exception>
; Кастомная страница для серверных ошибок
http.response.code=(500, 502, 503) exception(server_error_page)
<Cache>
; Не кешировать ошибки
http.response.code=400..599 force_cache(no)
Расширение Redcoat. Синтаксис диапазонов
200..299является расширением Redcoat. В BlueCoat поддерживается только точное значение кода.
9.5. http.connect=¶
Проверяет, используется ли HTTP CONNECT туннель между устройством и клиентом.
Синтаксис:
где:
yes— транзакция является результатом HTTP CONNECT (TLS-туннель через explicit proxy).no— транзакция не является CONNECT-туннелем.
Допустимые слои (BlueCoat): Exception, Forward, Proxy, SSL.
Транзакции: All proxies.
Примеры:
<Proxy>
; Разрешить CONNECT только на стандартные HTTPS порты
http.connect=yes http.connect.port!=(443, 8443) deny
<SSL>
; Перехватывать TLS только для CONNECT-туннелей
http.connect=yes ssl.forward_proxy(https)
9.6. http.connect.host=¶
Проверяет имя хоста из первой строки HTTP CONNECT запроса.
Синтаксис:
где:
string_modifier— модификатор сравнения строк (необязательный):exact— точное совпадение;prefix— совпадение по началу строки;suffix— совпадение по окончанию строки;substring— поиск подстроки;regex— регулярное выражение (по умолчанию).criterion— значение для сравнения. Для модификатораexactдопускается список значений в скобках.
Если модификатор не указан, по умолчанию используется regex.
Допустимые слои (BlueCoat): Cache, Exception, Proxy, SSL, SSL-Intercept.
Транзакции: All proxies.
Примеры:
<Proxy>
; Блокировка, если хост CONNECT не совпадает с Host заголовком
http.connect.host=!"$(url.host)" deny
<SSL-Intercept>
; Не перехватывать VPN-трафик
http.connect.host.prefix=vpn ssl.forward_proxy(no)
<Proxy>
; Блокировка внутренних хостов через CONNECT
http.connect.host.suffix=.internal.corp deny
<Proxy>
; Regex для API и CDN хостов
http.connect.host.regex="^(api|cdn)\..+" allow
Примечание: В CONNECT-запросе доступно только имя хоста и порт (без пути и query). Для проверки полного URL необходима TLS-инспекция.
9.7. http.connect.host.category=¶
Проверяет категорию имени хоста из HTTP CONNECT запроса.
Синтаксис:
http.connect.host.category={status|category_name[,category_name2,...]|category_group[,category_group2,...]}
где:
status— статус категоризации:none,pending,unavailable,unlicensed;category_name— имя категории (напримерMalware,Phishing);category_group— имя группы категорий.
Допускается указание списка категорий через запятую или в скобках.
Допустимые слои (BlueCoat): Cache, Exception, Proxy, SSL, SSL-Intercept.
Транзакции: Proxy transactions with a connect request URL.
Примеры:
<Proxy>
; Блокировка опасных категорий в CONNECT
http.connect.host.category=(Malware, Phishing, Spyware) deny
<Exception>
; Кастомная страница для игр и спорта
http.connect.host.category=(Sports, Games) \
exception(category_blocked_page)
9.8. http.connect.port=¶
Проверяет порт из первой строки HTTP CONNECT запроса (значение порта из оригинального URL запроса CONNECT).
Синтаксис:
где:
port_number— номер порта или список портов в скобках.
Поддерживается оператор отрицания !=.
Допустимые слои (BlueCoat): Exception, Forward, Proxy, SSL, SSL-Intercept, Tenant.
Транзакции: All proxies.
Примеры:
<Proxy>
; Разрешить CONNECT только на стандартные порты
http.connect.port!=(443, 8443) deny
<SSL-Intercept>
; Перехватывать TLS на нестандартных портах
http.connect.port!=443 ssl.forward_proxy(https)
9.9. http.connect.User-Agent=¶
Проверяет User-Agent, который используется для инициации explicit proxy HTTP CONNECT запроса.
Синтаксис:
где:
string_modifier— модификатор сравнения строк (необязательный):exact— точное совпадение (допускается список значений);prefix— совпадение по началу строки;suffix— совпадение по окончанию строки;substring— поиск подстроки;regex— регулярное выражение (по умолчанию).case_sensitive— регистрозависимое сравнение (необязательный).criterion— значение для сравнения.
Если модификатор не указан, по умолчанию используется regex.
Важно: Это условие нельзя использовать для проверки заголовка User-Agent в обычных HTTP-транзакциях. Для HTTP-транзакций используйте
request.header.User-Agent=.
Допустимые слои (BlueCoat): Proxy, SSL-Intercept.
Транзакции: Explicitly proxied HTTPS transactions.
Примечание: Модификатор
.case_sensitiveопределён в BlueCoat, но в Redcoat в настоящее время не реализован. Регистрозависимость определяется используемым модификатором сравнения.
Примеры:
<Proxy>
; Блокировка устаревших клиентов
http.connect.User-Agent.substring="MSIE 6" deny
<SSL-Intercept>
; Не перехватывать трафик мобильных приложений
http.connect.User-Agent.regex="^(MyApp|CompanyVPN)/.*" \
ssl.forward_proxy(no)
См. также: request.header.User-Agent= (глава 10) для проверки User-Agent в HTTP-транзакциях.
9.10. http.transparent_authentication=¶
Проверяет, использует ли текущая HTTP-транзакция transparent proxy authentication (IP surrogate, cookie surrogate, form-based auth) или explicit authentication (407 challenge).
Синтаксис и семантика — как в BlueCoat.
Синтаксис:
где:
yes— transparent auth активна (IP surrogate, cookie, form)no— transparent auth не используется (explicit 407 challenge или без аутентификации)
Допустимые слои: <Exception>, <Proxy>.
Транзакции: HTTP and SSL-terminated HTTPS transactions.
Примеры:
<Proxy>
; Заблокировать запросы без transparent auth
http.transparent_authentication=no deny
<Proxy>
; Для transparent-authenticated пользователей — разрешить без повторной проверки
url.domain=example.com http.transparent_authentication=yes allow
См. также: authenticate(), authenticated= (глава 12).
9.11. http.websocket=¶
Проверяет, является ли HTTP-запрос WebSocket upgrade запросом. WebSocket-соединения устанавливаются через HTTP Upgrade mechanism (заголовки Upgrade: websocket и Connection: Upgrade).
Синтаксис и семантика — как в BlueCoat.
Синтаксис:
Допустимые слои: <Exception>, <Forward>, <Proxy>.
Транзакции: HTTP and HTTPS.
Примеры:
<Proxy>
; WebSocket требует аутентификации
http.websocket=yes authenticate(realm1)
<Proxy>
; Запретить WebSocket на определённых доменах
http.websocket=yes url.domain=chat.example.com deny
ALLOW
См. также: client.protocol= (раздел 9.x).
9.12. live=¶
Проверяет, является ли потоковый контент живой трансляцией (live stream). Условие определяет тип потока по Content-Type заголовку (mpegurl, dash+xml, live).
Синтаксис и семантика — как в BlueCoat.
Синтаксис:
Допустимые слои: <Cache>, <Proxy>.
Транзакции: streaming transactions.
Примеры:
<Proxy>
; Ограничить доступ к live-стримам в рабочее время
deny live=yes time=1200..0800
<Proxy>
; Разрешить только записанные потоки, заблокировать live
live=yes deny
ALLOW
См. также: bitrate= (глава 23), streaming.client=, streaming.content=.
9.13. http.request.body.size=¶
Синтаксис и семантика — как в BlueCoat.
Проверяет размер тела HTTP-запроса в байтах (например, для POST/PUT). Полезно для выделения крупных загрузок в отдельные правила (логирование, маршрутизация, запрет).
Синтаксис:
Поддерживаются точное значение, закрытый диапазон N..M и открытые диапазоны N.. (не меньше N) и ..M (не больше M). Допускаются суффиксы размеров (1m, 512k).
Допустимые слои: <Proxy>.
Примеры:
<Proxy>
; Запретить загрузки больше 10 МБ
http.request.body.size=10485760.. deny
; Логировать крупные POST-запросы
http.method=POST http.request.body.size=1m.. access_log(yes)
9.14. http.request.apparent_data_type=¶
Примечание: Условие принимается при загрузке политики, но определение фактического типа данных по содержимому движком пока не выполняется — правило с этим условием не сработает.
Проверяет фактический (apparent) тип данных тела HTTP POST-запроса по первым байтам содержимого — в отличие от проверок по MIME-типу или расширению файла, которые легко подделать. Используется для контроля типов файлов, загружаемых через POST.
Синтаксис:
где data_type — метка типа данных (например, EXE, ZIP, JPG, MSCAB). Контент форматов Office (XLSX/DOCX) классифицируется как ZIP.
Допустимые слои: <Proxy>.
9.15. http.response.apparent_data_type=¶
Примечание: Условие принимается при загрузке политики, но определение фактического типа данных тела ответа по содержимому движком пока не выполняется — правило с этим условием не сработает.
Проверяет фактический тип данных тела HTTP-ответа по первым байтам содержимого (response-phase условие).
Синтаксис:
Допустимые слои: <Proxy>.
9.16. http.request.body.inspection_size_exceeded=¶
Примечание: Условие принимается при загрузке политики, но механизм проверки размера инспекции движком пока не реализован — правило с этим условием не сработает.
Истинно, если размер тела запроса превысил лимит инспекции, заданный свойством http.request.body.inspection_size(). Используется в паре с этим свойством.
Синтаксис:
Допустимые слои: <Proxy>.
9.17. http.request.body.max_size_exceeded=¶
Примечание: Условие принимается при загрузке политики, но механизм проверки максимального размера движком пока не реализован — правило с этим условием не сработает.
Истинно, если размер тела запроса превысил максимум, заданный свойством http.request.body.max_size(). Используется в паре с этим свойством.
Синтаксис:
Допустимые слои: <Proxy>.
http.request[attribute]=— форма проверки заголовков запроса в квадратных скобках не поддерживается; используйте эквивалентное условиеrequest.header.<имя>=(глава 10).