Перейти к содержанию

Глава 9. Условия HTTP

Условия HTTP позволяют фильтровать по параметрам HTTP-запроса: методу, версии протокола, коду ответа, а также по параметрам CONNECT-туннеля.

9.1. http.method=

Проверяет HTTP-метод запроса. Условие принимает значение true, если метод запроса совпадает с любым из указанных методов, и NULL, если запрос не является HTTP-протоколом.

Синтаксис:

http.method=method

где:

  • 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 в настоящее время не поддерживаются.

Поддерживается оператор отрицания !=:

http.method!=DELETE

Допустимые слои (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-метод запроса с помощью регулярного выражения.

Синтаксис:

http.method.regex=regular_expression

где:

  • 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").

Основное назначение — обнаружение некорректных запросов: табуляции вместо пробелов, лишние пробелы, нестандартные символы, атакующие паттерны.

Синтаксис:

http.request_line.regex=regular_expression

где:

  • 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.

Синтаксис:

http.method.custom[.string_modifier]=value

где:

  • 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.

Синтаксис:

http.request.version=version

где:

  • 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.

Условие фазы ответа. Оценивается после получения ответа от сервера. Правила с этим условием пропускаются на этапе запроса и повторно проверяются при получении ответа.

Синтаксис:

http.response.version=version

где:

  • 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) регулярным выражением. Полезно для обнаружения аномалий протокола и нестандартных запросов.

Синтаксис:

http.request_line.regex=regular_expression

где:

  • 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.

Синтаксис:

http.response.code=response_code

где:

  • response_code — числовой HTTP-код ответа, список кодов в скобках или диапазон.

Поддерживается указание диапазонов через ..:

http.response.code=200..299

Допустимые слои (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 туннель между устройством и клиентом.

Синтаксис:

http.connect={yes|no}

где:

  • 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 запроса.

Синтаксис:

http.connect.host[.string_modifier]=criterion

где:

  • 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).

Синтаксис:

http.connect.port=port_number

где:

  • 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 запроса.

Синтаксис:

http.connect.User-Agent[.string_modifier][.case_sensitive]=criterion

где:

  • 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.

Синтаксис:

http.transparent_authentication={yes|no}

где:

  • 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.

Синтаксис:

http.websocket={yes|no}

Допустимые слои: <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.

Синтаксис:

live={yes|no}

Допустимые слои: <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). Полезно для выделения крупных загрузок в отдельные правила (логирование, маршрутизация, запрет).

Синтаксис:

http.request.body.size={N|N..M|N..|..M}

Поддерживаются точное значение, закрытый диапазон 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.

Синтаксис:

http.request.apparent_data_type=(data_type, ...)

где data_type — метка типа данных (например, EXE, ZIP, JPG, MSCAB). Контент форматов Office (XLSX/DOCX) классифицируется как ZIP.

Допустимые слои: <Proxy>.


9.15. http.response.apparent_data_type=

Примечание: Условие принимается при загрузке политики, но определение фактического типа данных тела ответа по содержимому движком пока не выполняется — правило с этим условием не сработает.

Проверяет фактический тип данных тела HTTP-ответа по первым байтам содержимого (response-phase условие).

Синтаксис:

http.response.apparent_data_type=(data_type, ...)

Допустимые слои: <Proxy>.


9.16. http.request.body.inspection_size_exceeded=

Примечание: Условие принимается при загрузке политики, но механизм проверки размера инспекции движком пока не реализован — правило с этим условием не сработает.

Истинно, если размер тела запроса превысил лимит инспекции, заданный свойством http.request.body.inspection_size(). Используется в паре с этим свойством.

Синтаксис:

http.request.body.inspection_size_exceeded={yes|no}

Допустимые слои: <Proxy>.


9.17. http.request.body.max_size_exceeded=

Примечание: Условие принимается при загрузке политики, но механизм проверки максимального размера движком пока не реализован — правило с этим условием не сработает.

Истинно, если размер тела запроса превысил максимум, заданный свойством http.request.body.max_size(). Используется в паре с этим свойством.

Синтаксис:

http.request.body.max_size_exceeded={yes|no}

Допустимые слои: <Proxy>.

http.request[attribute]= — форма проверки заголовков запроса в квадратных скобках не поддерживается; используйте эквивалентное условие request.header.<имя>= (глава 10).