Глава 6. Блоки define¶
Блоки define создают именованные переиспользуемые объекты, на которые можно ссылаться из правил по имени. Они размещаются в секции определений файла политики -- до первого тега слоя (<Proxy>, <SSL> и т.д.) или в отдельных файлах, подключаемых через include.
Каждый define-блок начинается ключевым словом define, за которым следует тип определения, имя и тело. Блок завершается ключевым словом end. Имя должно быть уникальным среди определений того же типа. Регистр ключевых слов (define, end, имя типа) нечувствителен, однако имя определения сохраняет регистр.
В BlueCoat перечислены следующие категории define-блоков: Subnet Definitions, Condition Definitions (включая url и url.domain condition), Category Definitions, Action Definitions, Transformer Definitions (define url_rewrite, define active_content, define javascript) и анонимные определения (restrict dns, restrict rdns). Redcoat поддерживает все перечисленные типы, а также расширяет набор дополнительными: define exception, define bandwidth_class, define string, define policy.
6.1. define subnet¶
Subnet Definition задает именованный список IP-адресов и подсетей. Определенная таким образом подсеть может использоваться везде, где допустим тест IP-адреса транзакции -- в условиях client.address=, proxy.address= и других IP-триггерах. Это наиболее распространённый тип define: он позволяет один раз описать сетевую топологию (корпоративные подсети, DMZ, гостевые VLAN) и ссылаться на неё по имени во всех правилах.
Подсети, указанные внутри блока, проверяются как множество: если IP-адрес транзакции попадает хотя бы в одну из перечисленных сетей, условие считается выполненным.
Синтаксис:
где:
- <name> -- уникальное имя определения (идентификатор без пробелов).
- <network_N> -- IP-адрес или подсеть в одном из поддерживаемых форматов.
Правила для содержимого:
- Каждая строка содержит один IP-адрес или подсеть.
- Поддерживаемые форматы:
- Одиночный адрес:
10.0.0.1,2001:db8::1 - CIDR-нотация:
10.0.0.0/8,2001:db8::/32 - Диапазон:
10.0.0.1-10.0.0.255 - Поддерживаются как IPv4, так и IPv6 адреса.
- Строки, которые не удается разобрать как IP-адрес или подсеть, игнорируются парсером (что позволяет оставлять комментарии с
;в теле блока).
Пример:
define subnet corporate_subnet
10.10.12.0/24
end
define subnet internal_nets
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
end
define subnet dmz_servers
10.100.0.1
10.100.0.2
10.100.1.0/24
end
Использование в правилах:
См. также: Глава 7 (Сетевые условия), client.address=, proxy.address=.
6.2. define url.domain¶
URL Domain Definition задает именованный список доменных имен. Используется для тестирования домена запрашиваемого URL через триггер url.domain=. Это удобный способ группировать домены по назначению (заблокированные сайты, доверенные ресурсы, внутренние приложения) без необходимости перечислять их в каждом правиле.
Домен, указанный в define, автоматически покрывает все поддомены: запись example.com соответствует также www.example.com, mail.example.com и т.д. Для явного указания поддоменов поддерживается wildcard-нотация *.example.com.
Существует два варианта синтаксиса: простой (define url.domain) и condition-вариант (define url.domain condition). Condition-вариант позволяет ссылаться на список через триггер condition=, что полезно когда один и тот же список доменов нужно использовать в комбинации с другими условиями.
Дополнительно парсер поддерживает define server_url.domain -- вариант для слоя <Forward>, который проверяет URL после возможных перезаписей (server_url), а не оригинальный URL запроса.
Синтаксис:
define url.domain <name>
<domain_1>
<domain_2>
...
end
define url.domain condition <name>
<domain_1>
<domain_2>
...
end
define server_url.domain condition <name>
<domain_1>
<domain_2>
...
end
где:
- <name> -- уникальное имя определения.
- condition -- необязательное ключевое слово, делающее определение доступным через condition=<name>.
- server_url.domain -- вариант, тестирующий URL после перезаписей (для слоя <Forward>).
Правила для содержимого:
- Каждая строка содержит одно доменное имя.
- Поддерживается wildcard-нотация:
*.example.com. - Простое имя домена (без
*) автоматически включает все поддомены. - Имена доменов регистронезависимы.
Пример:
define url.domain blocked_sites
facebook.com
twitter.com
*.instagram.com
end
define url.domain condition trusted_domains
internal.corp
portal.corp
end
; Для Forward layer -- тестирует URL после rewrite
define server_url.domain condition allowed
inventory.example.com
affinityclub.example.com
end
Использование в правилах:
<Proxy>
url.domain=blocked_sites deny
condition=trusted_domains allow
<Forward>
condition=allowed forward(primary_group)
См. также: Глава 8 (Условия URL), url.domain=, server_url.domain=.
6.3. define url condition¶
URL Condition Definition задает именованный список URL-паттернов. В отличие от define url.domain, которое проверяет только доменную часть, define url позволяет указать полный URL, включая схему, путь и параметры запроса. Это даёт более точный контроль -- например, можно заблокировать конкретную страницу, не затрагивая весь домен.
Определение поддерживает два варианта: простой (define url) и condition-вариант (define url condition). Простой вариант создает список, на который можно ссылаться через url=, condition-вариант -- через condition=.
Синтаксис:
define url <name>
<url_pattern_1>
<url_pattern_2>
...
end
define url condition <name>
<url_pattern_1>
<url_pattern_2>
...
end
где:
- <name> -- уникальное имя определения.
- condition -- необязательное ключевое слово, делающее определение доступным через condition=<name>.
Правила для содержимого:
- Каждая строка содержит один URL или URL-паттерн.
- URL может включать схему (
http://,https://), домен, путь и query-строку. - Поддерживаются wildcards:
https://api.example.com/v1/*. - Строки между
defineиendне должны содержать пробелов в начале URL (допускается отступ для форматирования).
Пример:
define url condition payroll_location
url=hr.my_company.com/payroll/
end
define url api_endpoints
https://api.example.com/v1/*
https://api.example.com/v2/*
end
define url condition blocked_urls
http://malware.example.com/payload
http://phishing.example.com/login
https://evil.example.com/download/*
end
Использование в правилах:
См. также: Глава 8 (Условия URL), url=, url.path=.
6.4. define condition¶
Condition Definition -- наиболее гибкий тип define-блока. В отличие от остальных типов, которые тестируют один конкретный аспект транзакции (IP-адрес, домен, URL), condition definitions могут включать произвольные триггеры, допустимые в слое, и комбинировать их с помощью булевой логики.
Триггер condition= является единственным исключением из общего правила CPL, что каждый триггер тестирует ровно один аспект транзакции. Condition definitions могут одновременно проверять несколько частей транзакции (IP-адрес, время, URL, метод запроса и т.д.) и строить произвольные булевы комбинации этих проверок.
Семантика AND/OR:
Булевая логика condition definitions определяется расположением триггеров:
- AND (конъюнкция): несколько триггеров на одной строке объединяются неявным AND. Все условия на строке должны быть выполнены одновременно.
- OR (дизъюнкция): каждая новая строка добавляет альтернативу через OR. Достаточно выполнения условий хотя бы одной строки.
Эта семантика соответствует спецификации BlueCoat: AND между триггерами внутри строки неявный (разделитель -- пробел), а ключевые слова AND и OR зарезервированы только для значений внутри одного триггера.
Синтаксис:
define condition <name>
<trigger_1a> <trigger_1b> ... ; строка 1: все триггеры через AND
<trigger_2a> <trigger_2b> ... ; строка 2: OR со строкой 1
...
end
где:
- <name> -- уникальное имя определения.
- Каждая строка содержит один или несколько триггеров, разделённых пробелами (AND).
- Строки объединяются через OR.
Правила для содержимого:
- Внутри блока допустимы любые триггеры (условия), поддерживаемые в текущем слое:
client.address=,url.domain=,category=,weekday=,hour=,http.method=,url.extension=,url.path.regex=и другие. - Можно ссылаться на другие define:
client.address=internal_nets,url.domain=blocked_sites. - Строки-комментарии (начинающиеся с
;) игнорируются. - Нераспознанные триггеры на строке пропускаются парсером (строка целиком игнорируется, если ни один триггер не разобран).
- Блок должен содержать хотя бы одну строку с распознанными триггерами.
Пример:
define condition work_hours
weekday=(1,2,3,4,5) hour=9..18
end
define condition external_user
client.address=!corporate_net
end
define condition suspicious_request
; Строка 1 (AND): исполняемый файл И метод POST
url.extension=(exe, bat, cmd) http.method=POST
; Строка 2 (OR): ИЛИ путь содержит directory traversal
url.path.regex="\.\./"
end
; Результат: (exe/bat/cmd AND POST) OR (directory traversal)
Использование в правилах:
<Proxy>
condition=work_hours category=Gambling deny
condition=suspicious_request deny
condition=external_user authenticate(corporate_realm)
Возможности: Полная совместимость с BlueCoat:
- Ссылка: condition=name, condition!=name, condition=!name
- Вложенность: одно condition-определение может ссылаться на другое (ссылки раскрываются рекурсивно)
- Через condition= можно ссылаться также на define url.domain condition и define subnet
- Обнаружение циклических ссылок (предотвращение зацикливания)
- Если ссылка указывает на несуществующее определение, политика всё равно применяется с предупреждением, а такое условие не срабатывает
См. также: Глава 5 (Правила), триггер condition=.
6.5. define action¶
Action Definition создает именованный набор действий (properties), который можно активировать или деактивировать в правилах. Это позволяет определить группу связанных действий один раз и включать или выключать их по имени через свойство action().
В отличие от inline-действий в правилах, action definitions дают независимый контроль: одно правило может включить action A и выключить action B, другое правило -- наоборот. Это особенно полезно для управления наборами HTTP-заголовков, политиками логирования и другими группами настроек.
Синтаксис:
где:
- <name> -- уникальное имя определения.
- <action_N> -- любое допустимое действие CPL (property).
Правила для содержимого:
- Каждая строка содержит одно действие.
- Поддерживаются все действия (properties), допустимые в текущем слое:
deny,allow,log(),set(),delete(),access_log(),authenticate(),exception()и другие. - Допускается heredoc-синтаксис (
<<MARKER ... MARKER) для действий с многострочными значениями. - Нераспознанные строки пропускаются парсером.
Пример:
define action add_security_headers
set(response.header.X-Frame-Options, "DENY")
set(response.header.X-Content-Type-Options, "nosniff")
set(response.header.Strict-Transport-Security, "max-age=31536000")
end
define action block_and_log
deny
log(yes)
access_log(security_log)
end
Использование в правилах:
Для активации определённого действия используется синтаксис action.<name>(yes). Для деактивации — action.<name>(no). Скобки с параметром yes или no обязательны.
Важно: Запись
action.<name>без скобок не поддерживается. Всегда указывайте(yes)или(no).
Пример с rate_limit:
define action api_rate_limit
rate_limit(100, minute)
end
<Proxy>
url.path=/api action.api_rate_limit(yes)
allow
См. также: Часть IV (Действия), action() property.
6.6. define category¶
Category Definition объединяет несколько категорий контента в именованную группу. Это позволяет расширить вендорные категории или создать собственные группировки для удобства управления политиками. Определённая группа тестируется через триггер category=.
Категории контента обычно предоставляются вендором (BlueCoat WebFilter, сторонние базы URL-классификации). Category definitions не создают новые категории -- они группируют существующие. Например, можно объединить категории "Gambling", "Adult Content" и "Malware" в одну группу blocked_cats и использовать её в правилах вместо перечисления каждой категории.
Синтаксис:
где:
- <name> -- уникальное имя группы категорий.
- <category_N> -- имя существующей категории контента.
Правила для содержимого:
- Каждая строка содержит одно имя категории.
- Имена категорий могут содержать пробелы, дефисы, слэши и скобки -- в этом случае их можно заключить в кавычки:
"Entertainment and Videos","Peer-to-Peer (P2P)","Pornography/Sex". - Без кавычек берётся вся строка (с обрезкой пробелов по краям).
- Регистр имён категорий сохраняется.
Пример:
define category blocked_cats
News
"Entertainment and Videos"
Gambling
"Adult Content"
end
define category productivity
Business
Technology
Education
end
Использование в правилах:
См. также: Глава 13 (Условия категорий), category=.
6.7. define exception¶
Exception Definition описывает именованную страницу ошибки (exception page), которую прокси отдает клиенту при блокировке запроса или возникновении ошибки. Определение включает заголовок, HTTP-код ответа, тип содержимого и HTML-тело страницы.
Тело страницы поддерживает подстановку переменных в формате $(variable): $(url) -- заблокированный URL, $(user) -- имя пользователя и другие контекстные переменные.
Расширение Redcoat. Формат
define exceptionс полямиtitle,status_code,content_typeиbodyявляется расширением Redcoat. В BlueCoat CPL страницы исключений настраиваются иначе -- через exception object properties в правилах (exception(exception_id)). Redcoat сохраняет совместимость сexception()property, но добавляет возможность полного описания страницы в CPL.
Синтаксис:
define exception <name>
title "<title_text>"
status_code <http_code>
content_type "<mime_type>"
body <<EOF
<html_body>
EOF
end
где:
- <name> -- уникальное имя (ID) страницы исключения.
- title -- заголовок страницы (в кавычках).
- status_code -- HTTP-код ответа (по умолчанию 403).
- content_type -- MIME-тип (по умолчанию text/html).
- body -- тело страницы, указывается в кавычках или через heredoc-синтаксис (<<MARKER ... MARKER).
Правила для содержимого:
- Все поля необязательны, кроме имени. Значения по умолчанию:
status_code=403,content_type="text/html", пустыеtitleиbody. - Тело поддерживает переменные
$(url),$(user),$(category),$(timestamp)и другие. - Heredoc-синтаксис позволяет включать многострочный HTML без экранирования.
- Порядок полей не имеет значения.
Встроенные исключения: authentication_failed, access_denied, not_found, content_policy_denied, virus_detected, certificate_error, gateway_timeout, service_unavailable.
Пример:
define exception custom_block_page
title "Access Denied"
status_code 403
content_type "text/html"
body <<EOF
<!DOCTYPE html>
<html>
<head><title>Blocked</title></head>
<body>
<h1>Access Denied</h1>
<p>URL: $(url)</p>
<p>User: $(user)</p>
<p>Category: $(category)</p>
</body>
</html>
EOF
end
Использование в правилах:
См. также: Глава 22 (Условия исключений), exception() property, exception.id=.
6.8. define bandwidth_class¶
Bandwidth Class Definition описывает именованный класс ограничения полосы пропускания. Класс задает максимальную скорость (bitrate) и приоритет, что позволяет реализовать Quality of Service (QoS) политики на уровне прокси.
Расширение Redcoat. Тип
define bandwidth_classне описан в BlueCoat. В BlueCoat QoS настраивается через отдельные механизмы (bandwidth management objects). Redcoat реализует bandwidth classes как define-блоки CPL для единообразия конфигурации.
Синтаксис:
где:
- <name> -- уникальное имя класса.
- max_bitrate(<bps>) -- максимальная скорость в битах в секунду. 0 означает отсутствие ограничения (по умолчанию).
- priority(<level>) -- приоритет от 0 до 255, чем выше значение -- тем выше приоритет (по умолчанию 128).
Правила для содержимого:
- Оба параметра необязательны. Значения по умолчанию:
max_bitrate=0(без ограничений),priority=128. - Параметры указываются в функциональном синтаксисе:
max_bitrate(100000000). - Нераспознанные строки пропускаются.
Пример:
define bandwidth_class low_priority
max_bitrate(500000)
priority(50)
end
define bandwidth_class premium
max_bitrate(100000000) ; 100 Mbps
priority(200)
end
Использование в правилах:
<Proxy>
category=Streaming bandwidth_class(low_priority)
client.address=vip_subnet bandwidth_class(premium)
См. также: Глава 32 (Ограничение скорости и полосы), bandwidth_class() property.
6.9. define string¶
String Definition задает именованный многострочный строковый шаблон. Каждая строка содержимого начинается с символа >, который служит разделителем и не включается в результат. Строковые определения поддерживают подстановку переменных $(variable) и используются для формирования HTML-страниц, текстовых сообщений и других шаблонов.
Расширение Redcoat. Тип
define stringне описан в BlueCoat. Это расширение Redcoat для создания переиспользуемых текстовых шаблонов в CPL.
Синтаксис:
где:
- <name> -- уникальное имя шаблона.
- Каждая строка содержимого должна начинаться с символа >. Текст после > включается в результат.
Правила для содержимого:
- Строки, начинающиеся с
>, формируют содержимое шаблона (без символа>). - Строки-комментарии (
;,//) пропускаются. - Остальные строки (не начинающиеся с
>и не являющиеся комментариями) пропускаются. - Поддерживаются переменные подстановки:
$(url),$(user),$(category)и другие.
Пример:
define string block_page_html
><!DOCTYPE html>
><html>
><head><title>Blocked</title></head>
><body>
><h1>Access Denied</h1>
; Здесь подставляются переменные
><p>URL: $(url)</p>
><p>User: $(user)</p>
></body>
></html>
end
См. также: define exception (раздел 6.7), подстановка переменных.
6.10. define policy (макросы)¶
Policy Macro Definition создает именованный переиспользуемый фрагмент политики, привязанный к определённому типу слоя. Тело макроса содержит «сырой» CPL-код (теги слоёв и правила), который подставляется при использовании.
Расширение Redcoat. Тип
define <layer> policyне описан в BlueCoat. Это расширение Redcoat для модуляризации больших политик.
Синтаксис:
где:
- <layer_type> -- тип слоя, к которому привязан макрос. Допустимые значения: proxy, cache, admin, dns-proxy, exception, forward, ssl-intercept, ssl, socks, dns.
- <name> -- уникальное имя макроса.
- <raw_cpl_body> -- произвольный CPL-код (теги слоёв, правила, комментарии). Тело не парсится рекурсивно -- сохраняется как строка.
Правила для содержимого:
- Тело макроса -- произвольный текст между именем и
end. - Тело не проходит валидацию на этапе парсинга define-блока (парсится при подстановке).
- Ключевое слово
policyдолжно следовать непосредственно за типом слоя. - Поддерживаются все 10 типов слоёв.
Пример:
define proxy policy standard_web_access
<Proxy>
category=Malware deny
category=Phishing deny
allow
end
define ssl policy inspect_all
<SSL-Intercept>
allow
end
См. также: Глава 4 (Слои), include.
6.11. define url_rewrite¶
URL Rewrite Definition описывает именованный набор правил перезаписи URL. Это один из Transformer Definitions, описанных в BlueCoat CPL Reference. Определение содержит последовательность операторов перезаписи, которые применяются к URL запроса при обработке транзакции.
Синтаксис:
где:
- <name> -- уникальное имя набора правил перезаписи.
Правила для содержимого:
Поддерживаются четыре типа операторов перезаписи:
rewrite_url_prefix("<client_url>", "<server_url>")-- замена префикса URL. Если URL начинается сclient_url, префикс заменяется наserver_url.rewrite_url_substring("<client_url>", "<server_url>")-- замена подстроки в URL.rewrite_script_substring("<client_string>", "<server_string>")-- замена подстроки в скриптах (JavaScript и др.).rewrite_script_regex("<pattern>", "<replacement>")-- замена по регулярному выражению в скриптах.
Аргументы указываются в кавычках, разделенные запятой, в круглых скобках. Нераспознанные строки пропускаются.
Пример:
define url_rewrite my_rewrite
rewrite_url_prefix("http://old.example.com", "http://new.example.com")
rewrite_script_regex("(.*)\\.old\\.com", "$1.new.com")
end
Использование в правилах:
См. также: Глава 25 (Перенаправление и перезапись), url_rewrite() property.