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

Глава 4. Слои (Layers)

Слой (layer) — именованная секция файла политики, содержащая правила, которые оцениваются на определённом этапе обработки транзакции. Каждый тип слоя отвечает за свою область решений.

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

Ключевые принципы обработки:

  • Каждый слой оценивается независимо, но в строго определённом порядке
  • В каждом слое срабатывает только первое совпавшее правило, все его действия выполняются
  • Результаты слоёв накапливаются: нетерминальные действия (заголовки, логирование, кэш) собираются, терминальные (deny, redirect) определяют итоговое решение
  • При deny в слое Proxy управление передаётся в слой Exception для кастомизации страницы ошибки; при force_deny — Exception пропускается

4.1. Порядок обработки слоёв

Слои обрабатываются в фиксированном порядке, независимо от их расположения в файле:

Приоритет Слой Фаза Назначение
0 <Admin> Запрос Контроль доступа к консоли управления
1 <SSL-Intercept> TLS handshake Решение о перехвате или туннелировании TLS
2 <SSL> После TLS handshake Фильтрация по параметрам установленного TLS-соединения
3 <Proxy> Запрос Основная фильтрация: allow/deny, аутентификация, заголовки
4 <Waf> Запрос/Ответ Детектирование атак и anomaly-скоринг (расширение Redcoat); заполняет http.request.detection.*
5 <Cache> Ответ Политики кэширования объектов
6 <Forward> Запрос Выбор маршрута: upstream proxy, SOCKS gateway, direct
7 <DNS-Proxy> DNS-запрос Фильтрация и подмена DNS
8 <SOCKS> SOCKS-запрос Правила для SOCKS-прокси
9 <Exception> Ответ Кастомизация страниц ошибок; здесь резолвится отложенный deny
10 <Diagnostics> Запрос Трассировка и профилирование

<Waf> исполняется после <Proxy>, но вердикт детекции виден уже в <Proxy>. Перед основным проходом по слоям выполняется отдельный проход детекции, который вычисляет http.request.detection.*; поэтому условия детекта доступны и в <Proxy>, и в <Exception>, хотя сам слой <Waf> стоит в конвейере после <Proxy>. Слой <Waf> — задокументированное расширение Redcoat (см. раздел про слой <Waf>), которого нет в BlueCoat ProxySG 7.3.

В файле может быть несколько слоёв одного типа. Все слои одного типа обрабатываются сверху вниз:

; Первый слой Proxy — правила для внутренних сетей
<Proxy>
    client.address=10.0.0.0/8 allow

; Второй слой Proxy — правила для внешних пользователей
<Proxy>
    authenticated=no deny
    allow

4.2. <Proxy> — основная фильтрация запросов

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

Доступные действия: allow, deny, force_deny, redirect, authenticate, exception, управление заголовками, логирование, rate limiting.

<Proxy>
    ; Блокировка вредоносных сайтов
    category=(Malware, Phishing) force_deny

    ; Аутентификация корпоративных пользователей
    client.address=10.0.0.0/8 authenticate(LDAP_Realm)

    ; Блокировка загрузки исполняемых файлов
    url.extension=(exe, msi, bat, cmd, ps1) deny

    ; Добавление заголовка
    set(request.header.X-Forwarded-Proto, "https")

    allow

4.3. <SSL-Intercept> — решение о перехвате TLS

Оценивается во время TLS handshake, до расшифровки трафика. Определяет, перехватывать ли соединение (MITM) для инспекции содержимого или туннелировать как есть.

Доступные действия: ssl.forward_proxy(yes) — перехватить, ssl.forward_proxy(no) — туннелировать.

<SSL-Intercept>
    ; Перехватывать весь TLS-трафик по умолчанию
    ssl.forward_proxy(yes)

    ; Исключения: банки, медицинские сайты
    url.domain=bank.example.com ssl.forward_proxy(no)
    category="Financial Services" ssl.forward_proxy(no)
    category="Health and Medicine" ssl.forward_proxy(no)

Важно: В этом слое доступна ограниченная информация — только SNI (имя хоста из ClientHello), IP клиента и IP сервера. Полный URL и заголовки недоступны, так как TLS ещё не расшифрован.

4.4. <SSL> — параметры TLS-соединения

Фильтрация по параметрам уже установленного TLS-соединения.

<SSL>
    ; Запретить устаревшие версии TLS
    tls.version=TLSv1.0 deny
    tls.version=TLSv1.1 deny

    ; Требовать клиентский сертификат для admin-зоны
    url.path=/admin client.certificate.presented=no deny

4.5. <Cache> — политики кэширования

Определяет поведение кэша для ответов. Оценивается на фазе ответа.

<Cache>
    ; Не кэшировать API-ответы
    url.path=/api cache(no)

    ; Принудительное кэширование статики
    url.extension=(jpg, png, css, js, woff2) force_cache ttl(86400)

    ; Отключить кэш для аутентифицированных пользователей
    authenticated=yes cache(no)

4.6. <Forward> — маршрутизация upstream

Определяет, куда направить запрос: напрямую к серверу, через upstream-прокси или через SOCKS-шлюз.

<Forward>
    ; Внутренние ресурсы — прямое соединение
    url.host.is_private=yes direct

    ; Определённые домены — через SOCKS
    url.domain=onion.example socks_gateway(tor-proxy:9050, 5)

    ; Всё остальное — через upstream прокси
    forward(upstream-proxy.corp:3128)

4.7. <Exception> — обработка ошибок

Кастомизация страниц ошибок. Оценивается при генерации ответа об ошибке.

<Exception>
    exception.id=policy_denied exception(custom_block_page)
    exception.id=authentication_failed exception(login_page)

4.8. <DNS-Proxy> — фильтрация DNS

Правила для DNS-запросов, проходящих через DNS-прокси.

<DNS-Proxy>
    ; Блокировка вредоносных доменов
    dns.request.name=malware.example.com dns.respond(nxdomain)

    ; Перенаправление на внутренний сервер
    dns.request.name=portal.corp dns.respond.a(10.0.1.100)

    allow

4.9. <SOCKS> — правила SOCKS-прокси

Правила для SOCKS4/SOCKS5 соединений.

<SOCKS>
    ; Разрешить только SOCKS5
    socks.version=4 deny

    ; Требовать аутентификацию
    socks.authenticated=no deny

    allow

4.10. <Admin> — контроль доступа к управлению

Правила доступа к консоли управления и API.

<Admin>
    client.address=10.0.0.0/8 allow
    deny

4.11. <Diagnostics> — трассировка и отладка

Правила трассировки запросов.

<Diagnostics>
    client.address=10.0.1.100 trace.request(yes) trace.rules(yes)

4.12. Фазы обработки и поток выполнения

Фазы

Слои делятся на две фазы:

Фаза запроса (request phase) — оценивается при получении запроса от клиента: - <Admin>, <SSL-Intercept>, <SSL>, <Proxy>, <Waf>, <Forward>, <SOCKS>, <DNS-Proxy>, <Diagnostics>

Фаза ответа (response phase) — оценивается при получении ответа от сервера: - <Cache>, <Exception>

В правилах фазы запроса доступны условия по запросу (URL, заголовки запроса, IP клиента). В правилах фазы ответа дополнительно доступны условия по ответу (код статуса, заголовки ответа, тип контента).

Поток выполнения между слоями

Слои обрабатываются последовательно. На каждом шаге результат определяет дальнейший ход:

Запрос клиента
[Admin] ──deny/force_deny──▶ ОТКАЗ
    │ allow/нет совпадений
[SSL-Intercept] ──▶ решение: intercept или tunnel
[SSL] ──deny──▶ ОТКАЗ (разрыв TLS)
    │ allow/нет совпадений
[Proxy] ──force_deny──▶ ОТКАЗ (без Exception)
    │     ──redirect──▶ ПЕРЕНАПРАВЛЕНИЕ
    │     ──authenticate──▶ ЗАПРОС АУТЕНТИФИКАЦИИ (407/401)
    │     ──rate_limit──▶ ОТКАЗ (429)
    │     ──deny──┐
    │             │ pending (не сразу отказ)
    ▼             ▼
[Waf] ──deny/force_deny──▶ ОТКАЗ (атака: sqli/xss/rce/path_traversal…)
    │     детектирование угроз (anomaly-скоринг) →
    │     поля http.request.detection.* (расширение Redcoat)
[Cache] ◄── нетерминальные результаты накапливаются
[Forward] ◄── выбор upstream маршрута
[DNS-Proxy] ◄── для DNS-запросов
[SOCKS] ◄── для SOCKS-соединений
[Exception] ◄── вызывается ТОЛЬКО если есть pending deny
    │             exception.id=policy_denied
    │             может кастомизировать страницу ошибки
[Diagnostics] ◄── трассировка
Если pending deny ──▶ ОТКАЗ (с кастомной страницей из Exception или стандартной)
Иначе ──▶ запрос отправляется к серверу

Ключевые моменты потока:

  1. Терминальные действия (force_deny, redirect, authenticate, rate_limit, exception) немедленно прекращают обработку оставшихся слоёв.

  2. deny — особый случай. Он не прекращает обработку сразу, а откладывается. Это позволяет слою <Exception> кастомизировать страницу ошибки. После обработки всех слоёв отложенный deny становится терминальным.

  3. force_deny — немедленный отказ, слой <Exception> пропускается. Используйте для случаев, когда кастомизация страницы ошибки не нужна (malware, phishing).

  4. Нетерминальные действия (заголовки, маршрутизация, кэш, логирование и т.д.) накапливаются из всех слоёв и применяются к транзакции совместно.

  5. Слой <Exception> вызывается только при наличии отложенного deny. Если слой Proxy вернул allow или нетерминальное действие — Exception не оценивается.