Глава 24. Контроль доступа¶
Действия контроля доступа определяют итоговое решение по транзакции: разрешить, запретить или показать страницу исключения. Они составляют основу модели безопасности CPL.
Результат оценки всех слоёв формирует одно из трёх финальных решений: запрос пропущен (allow), запрос отклонён с переходом в Exception-слой (deny), или запрос отклонён безусловно (force_deny). Действие exception() позволяет указать именованную страницу ошибки при обработке отклонённых запросов.
24.1. allow¶
Свойство allow разрешает обработку транзакции. Запрос передаётся к целевому серверу (Origin Content Server) или следующему слою политики. Свойство allow может быть переопределено последующим deny или force_deny в другом слое.
В BlueCoat CPL свойство allow не является финальным решением само по себе — оно лишь снимает блокировку, установленную правилом deny того же слоя. Если ни один слой не вернул терминальное действие блокировки, запрос считается разрешённым.
Синтаксис:
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> реагировать на блокировку.
Синтаксис:
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-слое.
Синтаксис:
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).
Синтаксис:
Тип: Терминальное.
Слои и транзакции: <Proxy>, <SSL>, <SOCKS>.
См. также: deny, authenticate()
24.5. exception()¶
Свойство exception() отображает именованную страницу исключения (exception page). Обычно используется в слое <Exception> для отображения кастомных HTML-страниц при блокировке запросов.
Страницы исключений определяются через define exception и могут содержать HTML-контент, HTTP-заголовки, код статуса и шаблонные переменные. Свойство exception() ссылается на имя такого определения.
Синтаксис:
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). Используется, когда необходимо гарантировать отображение конкретной страницы исключения.
Синтаксис:
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)или уже большом теле не изменяется.
Синтаксис:
where:
yes— дополнять тело exception-страницы до порога (≥513 байт), если оно короче;no— не изменять тело (по умолчанию).
Тип / Слои и транзакции: свойство; <Exception>.
Пример:
См. также: exception() (24.5), define exception (6.7), приложение A.2.