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

Глава 24. Контроль доступа

Действия контроля доступа определяют итоговое решение по транзакции: разрешить, запретить или показать страницу исключения. Они составляют основу модели безопасности CPL.

Результат оценки всех слоёв формирует одно из трёх финальных решений: запрос пропущен (allow), запрос отклонён с переходом в Exception-слой (deny), или запрос отклонён безусловно (force_deny). Действие exception() позволяет указать именованную страницу ошибки при обработке отклонённых запросов.

24.1. allow

Свойство allow разрешает обработку транзакции. Запрос передаётся к целевому серверу (Origin Content Server) или следующему слою политики. Свойство allow может быть переопределено последующим deny или force_deny в другом слое.

В BlueCoat CPL свойство allow не является финальным решением само по себе — оно лишь снимает блокировку, установленную правилом deny того же слоя. Если ни один слой не вернул терминальное действие блокировки, запрос считается разрешённым.

Синтаксис:

allow

where: allow не принимает параметров.

Тип: Нетерминальное. Обработка оставшихся слоёв продолжается. Значение allow (AdminAllow) накапливается и применяется, только если терминальные действия не встретились.

Слои и транзакции: Все слои (<Proxy>, <SSL>, <Admin>, <Cache>, <SOCKS>, <DNS-Proxy>, <Forward>, <Exception>). Применяется к proxy-транзакциям HTTP/HTTPS/SOCKS/DNS.

Пример:

<Proxy>
    ; Разрешить запросы из внутренней сети без ограничений
    client.address=10.0.0.0/8 allow

    ; Разрешить health check URL без аутентификации
    url.path=/health authenticate(no) allow

См. также: deny, force_deny, exception()


24.2. deny()

Свойство deny отклоняет клиентский запрос. Прокси возвращает HTTP 403 Forbidden и передаёт управление в слой <Exception>. Слой <Exception> может кастомизировать страницу ошибки на основе exception.id, причины отказа или других условий.

Свойство deny является условно-терминальным: оно прерывает нормальную обработку запроса, но перед отправкой ответа клиенту вызывается слой <Exception>. Это позволяет показывать пользователю информативные страницы блокировки, перенаправлять на портал и т.д.

При отклонении запроса прокси автоматически устанавливает exception.id=policy_denied, что позволяет правилам в слое <Exception> реагировать на блокировку.

Синтаксис:

deny
deny(<reason>)

where:

Параметр Тип Описание
reason Строка (необязательный) Причина отказа. Записывается в access log и доступна как подстановочная переменная в шаблонах страниц исключений.

Тип: Терминальное (с отложенной обработкой). Обработка текущего слоя прекращается, но перед формированием ответа вызывается слой <Exception>.

Слои и транзакции: <Proxy>, <SSL>, <SSL-Intercept>, <Admin>, <SOCKS>, <DNS-Proxy>, <Cache>. Применяется к proxy-транзакциям всех типов.

Пример 1. Блокировка категорий с кастомной страницей:

<Proxy>
    category=Gambling deny(corporate_policy)
    url.extension=(exe, bat, msi) deny(executable_blocked)

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

Пример 2. Блокировка по расписанию с redirect:

<Proxy>
    category=Social_Media time=08:00..18:00 deny(work_hours)

<Exception>
    exception.id=policy_denied redirect(302, "https://portal.corp/blocked?reason=$(exception.reason)")

См. также: force_deny, allow, exception(), Глава 22 (условия исключений)


24.3. force_deny()

Свойство force_deny безусловно отклоняет клиентский запрос. В отличие от deny, слой <Exception> не вызывается — прокси немедленно возвращает стандартную страницу ошибки HTTP 403.

Это ключевое различие между deny и force_deny:

  • deny — запрос отклоняется, но управление передаётся в <Exception>, где можно показать кастомную страницу, выполнить redirect или другие действия.
  • force_deny — запрос отклоняется немедленно. Слой <Exception> полностью пропускается. Никакое другое правило или слой не может переопределить это решение. Клиент получает стандартную страницу 403.

Свойство force_deny следует использовать для категорий угроз, когда настройка страницы ошибки не требуется и важно гарантировать, что блокировка не будет отменена правилами в Exception-слое.

Синтаксис:

force_deny
force_deny(<reason>)

where:

Параметр Тип Описание
reason Строка (необязательный) Причина отказа для access log.

Тип: Терминальное (немедленное). Обработка прекращается, Exception-слой не вызывается.

Слои и транзакции: Все слои. Применяется ко всем типам транзакций.

Пример 1. Безусловная блокировка вредоносного трафика:

<Proxy>
    category=Malware force_deny(malware_detected)
    category=Phishing force_deny(phishing_detected)
    category=Command_and_Control force_deny(c2_blocked)

Пример 2. Сравнение deny и force_deny:

<Proxy>
    ; deny: пользователь увидит кастомную страницу из Exception-слоя
    category=Gambling deny(corporate_policy)

    ; force_deny: пользователь увидит стандартную страницу 403
    category=Malware force_deny

<Exception>
    ; Это правило сработает для deny, но НЕ для force_deny
    exception.id=policy_denied exception(corporate_block_page)

См. также: deny, allow


24.4. deny.unauthorized

Статус: планируется. Не реализовано.

Свойство deny.unauthorized отклоняет транзакцию с HTTP 401 Unauthorized (вместо стандартного 403 Forbidden). Используется в сценариях, когда клиенту необходимо явно сообщить о необходимости предоставления учётных данных (без использования механизма authenticate).

Синтаксис:

deny.unauthorized

Тип: Терминальное.

Слои и транзакции: <Proxy>, <SSL>, <SOCKS>.

См. также: deny, authenticate()


24.5. exception()

Свойство exception() отображает именованную страницу исключения (exception page). Обычно используется в слое <Exception> для отображения кастомных HTML-страниц при блокировке запросов.

Страницы исключений определяются через define exception и могут содержать HTML-контент, HTTP-заголовки, код статуса и шаблонные переменные. Свойство exception() ссылается на имя такого определения.

Синтаксис:

exception(<exception_page_id>)
exception(id=<exception_page_id>)

where:

Параметр Тип Описание
exception_page_id Строка Идентификатор страницы исключения, определённой через define exception или встроенной. Поддерживаются форматы: exception(page_name) и exception(id="page_name").

Тип: Терминальное. Прерывает обработку Exception-слоя и возвращает указанную страницу клиенту.

Слои и транзакции: <Exception> (основной), <Proxy>.

Пример 1. Кастомная страница блокировки:

define exception corporate_block_page
    exception.content("Доступ запрещён корпоративной политикой")
    exception.status_code(403)
    exception.content_type("text/html; charset=utf-8")
end

<Proxy>
    category=Gambling deny(corporate_policy)

<Exception>
    exception.id=policy_denied exception(corporate_block_page)

Пример 2. Разные страницы для разных категорий:

<Exception>
    exception.id=policy_denied category=Malware exception(malware_warning)
    exception.id=policy_denied category=Adult exception(adult_content_blocked)
    exception.id=policy_denied exception(generic_block_page)

См. также: deny, force_deny, define exception, Глава 22 (условия исключений)


24.6. force_exception()

Свойство force_exception() аналогично exception(), но его решение не может быть переопределено последующими правилами (как в BlueCoat). Используется, когда необходимо гарантировать отображение конкретной страницы исключения.

Синтаксис:

force_exception(<exception_page_id>)

where:

Параметр Тип Описание
exception_page_id Строка Идентификатор страницы исключения.

Тип: Терминальное. Не может быть переопределено.

Слои и транзакции: <Exception>.

Пример:

<Exception>
    ; Всегда показывать страницу обслуживания, независимо от других правил
    force_exception(maintenance_page)

См. также: exception(), force_deny


24.7. exception.autopad(yes|no)

Дополняет (padding) тело страницы исключения, чтобы браузер показал кастомную страницу прокси, а не собственную «friendly error». Некоторые браузеры (Internet Explorer) при коротком теле ответа (меньше ~512 байт) подменяют его собственной страницей дружелюбной ошибки. При exception.autopad(yes) тело exception-страницы дополняется так, чтобы превысить этот порог (≥513 байт), и клиент отобразит именно нашу страницу.

BlueCoat 7.3: «pad the exception response body so the browser shows the custom page instead of its own friendly error».

Поведение: короткое тело exception-страницы дополняется до ≥513 байт при autopad(yes); при autopad(no) или уже большом теле не изменяется.

Синтаксис:

exception.autopad(yes|no)

where:

  • yes — дополнять тело exception-страницы до порога (≥513 байт), если оно короче;
  • no — не изменять тело (по умолчанию).

Тип / Слои и транзакции: свойство; <Exception>.

Пример:

<Exception>
    exception.id=policy_denied exception(policy_denied) exception.autopad(yes)

См. также: exception() (24.5), define exception (6.7), приложение A.2.