UserGate Policy Language (UPL)
UPL (UserGate Policy Language) — язык описания политик UserGate. Термин "политика" употребляется здесь в контексте конфигурации правил, применяемых для принятия решений по требованиям аутентификации, правам доступа или преобразования контента. Правила настраиваются с использованием действий, условий и свойств. Для каждого правила настраивается одно из действий. Действия — настройки, которые управляют обработкой транзакции (OK, WARNING, PASS, DENY, FORCE_PASS, FORCE_DENY). При настройке правил, в которых не предусмотрено указание действия (например, правила DNS, NAT и маршрутизации, пропускной способности и т.п.), необходимо указать действия PASS или OK. Условия задаются знаками равно (=) или не равно (!=), например, зоны, адреса, GeoIP источников и назначения, сервисы, приложения и т.д.; все условия в правиле проверяются по логическому И, т.е. правило сработает, если будут выполнены все условия. Свойства правил задаются в круглых скобках и используются для указания дополнительной информации, например, название правил, их описание, функция журналирования и т.д. ПримечаниеПри настройке правил сначала указывается действие, потом условия и затем свойства.
UPL используется для создания правил в персональных слоях WAF. Также с помощью UPL в интерфейсе CLI создаются правила политик сети и безопасности для следующих разделов:
Структура команды для создания правила:
где <level> — уровень, на котором необходимо создать правило. <position> — позиция, на которую будет помещено правило. <str-upl-syntax> строка, в которой описано правило в UPL синтаксисе. Структура команды для обновления существующего правила:
где <level> — уровень, на котором необходимо обновить правило. <position> — номер правила, которое необходимо обновить. <str-upl-syntax> строка, в которой описано правило в UPL синтаксисе. Структура команды для удаления правила:
где <level> — уровень, на котором необходимо удалить правило. <position> — номер правила, которое необходимо удалить. <all> — удалить все правила. Структура команды для отображения правила:
где <level> — раздел, правила которого нужно отобразить. <position> — номер правила, которое необходимо отобразить. <all> — отобразить все правила. Пример создания правила межсетевого экрана с использованием UPL (использован многострочный ввод):
После создания правило отобразиться в начале списка правил межсетевого экрана (на позиции 1). Данное правило запрещает HTTPS-трафик из зоны Trusted в зону Untrusted пользователям, идентифицированным системой. Правило работает в соответствии с расписанием "Working hours". При срабатывании правила в журнал будет записана информация о начале сессии. В последующих статьях данного раздела можно найти более подробную информацию об общих положениях языка UPL, определениях, встроенных библиотеках, условиях, действиях, свойствах и типах правил.
КомментарииЛюбая строка, начинающаяся с символа "%", является комментарием. Пример:
Комментарии могут быть в любом месте файла с описанием политик. ПравилаПравило политики (rule) состоит из условий и некоторого количества действий, записанных в любом порядке. Есть также свойства (properties), которые синтаксически выглядят как действие, но при этом активных действий не производят. Например, свойство name просто добавляет атрибут "имя" в правило. Правила обычно пишутся в одной строке, но могут быть разбиты на строки с помощью специального символа — обратного слеша "\". Когда правило выполняется, условие проверяется для текущей конкретной транзакции. Если условие оценивается как True (истина), выполняются все перечисленные действия и текущий слой заканчивается при наличии префиксов PASS / FORCE_PASS / DENY / FORCE_DENY / WARNING / OK. Ecли сработавшее правило не имеет префиксов PASS / FORCE_PASS / DENY / FORCE_DENY / WARNING / OK, то выполняются действия и дальше обрабатывается уже следующее правило. Если условие оценивается как False для этой транзакции, то дальше обрабатывается уже следующее правило. Все условия в правиле проверяются по логическому "И". Другими словами, правило сработает, когда будут выполнены все условия. В свою очередь, условие является логической комбинацией триггеров. Триггеры — это отдельные тесты, которые можно выполнить с компонентами запроса, ответа, связанными пользователями или состоянием системы. Действия — это настройки, которые управляют обработкой транзакции. Например, запретить (deny) или обработать объект (изменить заголовок — rewrite). Синтаксис: Rule ::= (PASS | FORCE_PASS | DENY| ( DENY '(' string ')') | FORCE_DENY | FORCE_DENY'(' string ') '| WARNING | OK)? Conditions '\'? Actions Conditions ::= condition '\'? Conditions Actions ::= action '\'? Actions Пример: Запрос будет запрещен, когда сработают оба триггера:
СлоиСлой (layer)— это конструкция UPL, используемая для группировки правил и принятия одного решения. Раздельные принятия решения помогают контролировать сложность политики. Это делается путем написания каждого решения в отдельном слое. У любого правила в слое может быть префикс PASS / FORCE_PASS / DENY / FORCE_DENY / OK / WARNING, когда срабатывает правило с таким префиксом, все остальные правила в слое пропускаются. В случае если сработало правило с префиксом FORCE_PASS или FORCE_DENY, то это является окончательным результатом обработки, в противном случае обработка переходит на следующий слой. После обработки всех слоев запрос будет заблокирован или пропущен в зависимости от того, что было последним — PASS / FORCE_PASS или DENY / FORCE_DENY. Если процессинг остановится на WARNING, будет добавлено предупреждение в тело ответа. Префикс OK подразумевает остановку обработки правил в текущем слое при выполнении условий и действий (если таковые указаны). Если префикс отсутствует при выполнении условий и действий, то остановка не подразумевается. Действия FORCE_PASS и FORCE_DENY похожи на PASS и DENY, за исключением того, что они могут быть переопределены на последующих слоях. FORCE_DENY и FORCE_PASS немедленно прекращают поверку правил как на текущем, так и на последующих слоях, и этот результат является окончательным. Синтаксис: Layer ::= '[' layer_type layer_name ']' layer_type ::= ssl | ssh| captive| content | shaper | firewall | safebrowsing | dns | icap | mailsecurity | dos | webportal | reverseproxy | nat_routing | byod | vpn_server | vpn_client|idps | tunnel | scenarios | ipvs_server | icap_balancing | reverseproxy_balancing layer_name ::= string atom ::= [a-z][0-9a-zA-Z_]+ string ::= '"' произвольная строка '"' Пример 1:
Пример 2:
Динамические значенияЗначения "адрес запроса" (url, url.host, url.path), "IP-адрес источника/назначения" (src.ip, dst.ip), "имя пользователя" (user), "значения заголовков" (request и response) и "параметры запроса" (qparam) могут сравниваться между собой, а также использоваться в качестве аргумента в действиях (actions), где это предусмотрено. Условие (condition) в языке UPL является логической комбинацией триггеров. Триггеры — это отдельные тесты, которые можно выполнить с компонентами запроса, ответа, связанными пользователями или состоянием системы. Все триггеры условия сравниваются со значениями с помощью операторов "=" и "!=". В роли значения могут выступать константные значения, такие как строки, целочисленные значения, диапазоны значений, динамические значения. Синтаксис: condition ::= condition_name ('=' | '!=') condition_value condition_value ::= pattern | list list ::= '(' ((pattern ',')* pattern)? ')' pattern ::= word | string | integer | float | boolean| range | condition_name string ::= '"' произвольная строка '"' word ::= [a-zA-Z][0-9a-zA-Z_\-]* boolean ::= yes|no|true|false range ::= integer .. [integer] | [integer] .. integer | float .. [float] | [float] .. float numeric :: = integer | range http.connectПроверка наличия HTTP CONNECT. Синтаксис: http.connect = yes | no | true | false http.methodПроверка используемого HTTP-метода. Метод можно указывать как в кавычках, так и без. Синтаксис: http.method = GET | CONNECT | DELETE | HEAD | POST | PUT | TRACE | OPTIONS | TUNNEL | LINK | UNLINK | PATCH | PROPFIND | PROPPATCH | MKCOL | COPY | MOVE | LOCK | UNLOCK | MKDIR | INDEX | RMDIR | COPY | MOVE http.request.versionПроверка версии HTTP-запроса. Синтаксис: http.request.version = 0.9 | 1.0 | 1.1 http.response.versionПроверка версии HTTP-ответа. Синтаксис: http.response.version = 0.9 | 1.0 | 1.1 http.response.codeПроверка HTTP-кода ответа. Валидные значения: 100 - 999. Синтаксис: http.response.code = NNN %(где NNN число от 100 до 999) http.request.body, http.request.body.nocase, http.response.body и http.response.body.nocaseПроверка тела запроса/ответа HTTP на содержание определенной сигнатуры. Пример:
categoryПроверка домена на принадлежность к определенной категории сайтов (смотрите в Приложении список категорий ) Синтаксис: category = word | string | integer | list | lib lib ::= lib.category '(' list_libs ')' list_libs :: = lib_name ','' list_libs lib_name ::= word | string Пример: Запретить категории Job Search и Gambling:
Запретить все категории из библиотеки Restricted cats:
morphologyПроверка тела ответа морфологическими словарями. Синтаксис: morphology = word | string | list | lib lib ::= lib.morphology '(' list_libs ')' list_libs :: = lib_name ','' list_libs lib_name ::= word | string Пример: Запретить контент, если сработает категория морфологии из словаря BadWords:
Запретить морфологические категории из библиотек Special Words, BadWords
request.header.<h_name> и response.header.<h_name>Проверка HTTP-заголовка запроса/ответа. h_name может принимать одно из поддерживаемых значений (смотрите список поддерживаемых HTTP-заголовков в Приложении). Синтаксис: request.header.<h_name>[.base64][.nocase] = string Пример:
request.header.<h_name>.substring и response.header.<h_name>.substringПроверка HTTP-заголовка запроса/ответа на вхождение подстроки. h_name может принимать одно из поддерживаемых значений (смотрите список поддерживаемых HTTP-заголовков в Приложении). Синтаксис: request.header.<h_name>[.base64]substring[.nocase] = string Пример:
request.header.<h_name>.regex и response.header.<h_name>.regexПроверка HTTP-заголовка запроса/ответа на регулярное выражение PCRE. h_name может принимать одно из поддерживаемых значений (смотрите список поддерживаемых HTTP-заголовков в Приложении). Синтаксис: request.header.<h_name>[.base64].regex = string Пример:
request.header.<h_name>.re2 и response.header.<h_name>.re2Проверка HTTP-заголовка запроса/ответа на регулярное выражение RE2. h_name может принимать одно из поддерживаемых значений (смотрите список поддерживаемых HTTP-заголовков в Приложении). Синтаксис: request.header.<h_name>[.base64].re2 = string Пример:
request.header.<h_name>.count и response.header.<h_name>.countПроверка количества заголовков <h_name> в HTTP-запросе/ответе. h_name может принимать одно из поддерживаемых значений (смотрите список поддерживаемых HTTP-заголовков в Приложении). Синтаксис: request.header.<h_name>.count = integer | range Пример:
request.header.<h_name>.length и response.header.<h_name>.lengthПроверка длины значений всех заголовков <h_name> в HTTP-запросе/ответе. h_name может принимать одно из поддерживаемых значений (смотрите список поддерживаемых HTTP-заголовков в Приложении). Синтаксис: request.header.<h_name>.length = integer | range Пример:
request.header_names, request.header_values, response.header_values и response.header_valuesПроверка имени/значения всех HTTP-заголовков запроса/ответа на значение. Синтаксис: request.header_values[.base64].regex = string request.header_values[.base64].re2 = string request.header_values[.base64].substring[.nocase] = string request.header_values.count = integer | range request.header_values.length = integer | range request.x_header.<xh_name> и response.x_header.<xh_name>Проверка HTTP-заголовка запроса/ответа на значение. xh_name — произвольный HTTP-заголовок. Синтаксис: request.x_header.<xh_name>[.base64][.nocase] = string request.x_header.<xh_name>[.base64].regex = string request.x_header.<xh_name>[.base64].re2 = string request.x_header.<xh_name>[.base64].substring[.nocase] = string request.x_header.<xh_name>.count = integer | range request.x_header.<xh_name>.length = integer | range Пример:
Возможны также суффиксы length, count, regex, re2 как и в случае с <h_name>.
request.header.Cookie.<cookie_name>Проверка заголовка запроса Cookie на значение. Синтаксис: request.header.Cookie.<cookie_name>[.base64][.(nocase | substring | substring.nocase | regex | re2)] = string Пример:
time, day, hour, minuteПроверка соответствия текущего времени заданному условию. Если не указан суффикс utc, время берется локальное, иначе — по Гринвичу. Синтаксис: day[.utc] = monday | tuesday | wednesday | thursday | friday | saturday | sunday | DD | list time[.utc] = HH:MM | range | lib.time(<name>) hour[.utc] = HH | range minute[.utc] = MM | range HH ::= 00 - 23 MM ::= 00 - 59 DD ::= 1 - 31 Пример:
Открытые интервалы учитываются по границе суток/часа.
url, url.host и url.addressПроверка url или его части на значение. Проверка использует нормализованный URI c декодированными *%*. Синтаксис: url[.(prefix | substring | suffix | regex | re2)] = string url.host[.(prefix | substring | suffix | regex | re2)] = string url.domain[.(prefix | substring | suffix | regex | re2)] = string url.address = ip_address | subnet | subnet_label url.port = [low_port]..[high_port] | port url.path[.base64][.(prefix | substring | suffix | regex | re2)] = string url.is_absolute = yes | no % полный или нет URL prefix ::= string % начало строки substring ::= string % подстрока suffix ::= string % окончание строки regex ::= string % регулярное выражение PCRE re2 ::= string % регулярное выражение RE2 url.address — это, по сути, синоним dst.ip. Пример:
qparam.<name>, qparam.values и qparam.namesПроверка значения параметров запроса. Проверка использует имена и значения параметров c декодированными *%*. Синтаксис: qparam.length = numeric % проверить общую длину query-параметров qparam.count = numeric % проверить количество query-параметров qparam.<name>[.(length | count)] = numeric qparam.<name>[.base64][.(nocase | substring | substring.nocase | regex | re2)] = string qparam.values[.base64].substring[.nocase] = string % проверить все значения на вхождение подстроки qparam.names[.base64].substring[.nocase] = string % проверить все имена на вхождение подстроки qparam.values[.base64].regex = string % проверить все значения на регулярное выражение qparam.names[.base64].regex = string % проверить все имена на регулярные выражения qparam.values[.base64].re2 = string % проверить все значения на регулярное выражение qparam.names[.base64].re2 = string % проверить все имена на регулярные выражения numeric ::= integer | range % число либо диапазон regex ::= string % регулярное выражение PCRE re2 ::= string % регулярное выражение RE2 Пример:
user и groupПроверка текущего пользователя или его группы. Синтаксис: user = word | string | known | unknown group = word | string user.guid = string group.guid = string known — используется для указания авторизованного (известного) пользователя; Пример:
src и dstПроверка условия на IP-адрес, зону или GeoIP источника/назначения. Синтаксис: src.ip = ip_address | subnet | subnet_label | list | lib dst.ip = ip_address | subnet | subnet_label | list | lib src.zone = integer | zone_name dst.zone = integer | zone_name src.geoip = iso3166 | list dst.geoip = iso3166 | list src.mac = mac_address | list dst.mac = mac_address | list lib ::= lib.(network | url) '(' list_libs ')' list_libs :: = lib_name ','' list_libs lib_name ::= word | string iso3166 ::= [A-Z][A-Z] url.address — это, по сути, синоним dst.ip. scenarioПроверка активности определенного сценария. Синтаксис: scenario = string | word | list Пример:
virus_heuristic и virus_usergateПроверка тела ответа на вирусы. Синтаксис: virus_heuristic = yes | no | true | false % (по умолчанию false) virus_usergate = yes | no | true | false % (по умолчанию false) heuristic — эвристический анализатор (медленный); bridge_vlan_filterФильтрация трафика по VLAN-тегам для интерфейса в режиме моста (bridge). Синтаксис: bridge_vlan_filter '='|'!=' list | number | number..number Пример:
serviceДетектирование трафика определенного сервиса для межсетевого экрана. Синтаксис: service = string | word | list Пример:
applicationДетектирование трафика определенного приложения на уровне L7 для межсетевого экрана. Синтаксис: application = string | word | list Пример:
envelope_from и envelope_toПроверка email-адреса отправителя/адресата сообщения. Синтаксис: envelope_from '='|'!=' string | list envelope_to '='|'!=' string | list Пример:
response_timeПроверка времени ответа в миллисекундах. Синтаксис: response_time = integer hip_profileHIP-профили для проверки соответствия конечного устройства требованиям безопасности. Действительно только для правил межсетевого экрана. Синтаксис: hip_profile = string | word | list Библиотеки (lib) — это элементы языка UPL, которые служат для доступа к встроенным и пользовательским библиотекам. Как правило, это достаточно большие списки, которые неудобно описывать через определения def. Обращение к библиотекам происходит по их именам. Синтаксис: library ::= lib.<url | morphology | category | useragent | mime | network | time | applicationgroup | servicegroup>(list_names) list_names ::= name list_names name ::= word | string url — список URL; Пример:
В файлах политик определения (def) служат для объединения наборов условий или действий. Каждое определение должно иметь уникальное пользовательское имя, по которому к нему можно обратиться из правил. def conditionНаборы условий. Все условия в одной строке проверяются по логическому И. Перевод строки означает логическое ИЛИ. Символ экранирования — обратный слэш ("\") в конце строки позволяет перенести условие по И на следующую строку. Синтаксис: def condition label_name conditions end conditions ::= condition '\'? [conditions] condition ::= name '=' value label_name ::= atom atom ::= [a-z][0-9a-zA-Z_]+ def scenario_condСписок условий сценария. Каждое условие сценария обычно пишется в одной строке, но при необходимости условие может быть разбито на строки с помощью специального символа — обратного слеша ("\"). Синтаксис: def scenario_cond label_name scenario_conditions end scenario_conditions ::= Conditions '\'? Properties Conditions ::= condition '\'? Conditions Properties ::= property '\'? Properties scenario_cond ::= name '=' value label_name ::= atom atom ::= [a-z][0-9a-zA-Z_]+ def varОпределение переменных. Служит для подсчета некоторых событий за определенный интервал времени. Для изменения значения предназначены действия inc и dec. Синтаксис: def var label_name init ::= integer window ::= time key ::= condition_name | condition_list end label_name ::= atom atom ::= [a-z][0-9a-zA-Z_]+ condition_list ::= '(' condition_name , condition_list ')' init — это начальное значение переменной, к которому она вернется по истечении времени window; key — поле или список полей, по которым группируются значения переменной (необязательный параметр). Свойства (properties) — это некие атрибуты правила, например, name или enabled. Они используются для предоставления дополнительной информации в процессе обработки правил. Синтаксис свойств точно такой же, как у действий. Синтаксис: property = prop_name | prop_name '(' list_params ')' prop_name ::= name | desc | id | rule_log | enabled | scenario list_params ::= value ',' list_params name и descАтрибуты имя и описание для правила. Синтаксис: Name ::= name '(' string|word ')' Description ::= desc '(' string ')' Пример:
enabledАтрибут, который включает или выключает работу правила. Синтаксис: Enable ::= enabled '(' boolean ')' boolean ::= yes | no | true | false % (по умолчанию false) rule_logУстанавливает атрибут журналирования правила. Значение session действительно только для правил межсетевого экрана, защиты от dos-атак и пропускной способности. Синтаксис: Logging ::= rule_log '(' boolean | session ')' LoggingFwRule ::= rule_log '(' boolean , interval, burst')' boolean ::= yes | no | true | false % (по умолчанию no) interval ::= "integer/[s,m,h,d]" burst ::= integer interval — среднее число пакетов, попадающих под условие limit в единицу времени (1/s, 1/m, 1/h, 1/d) , default = 3/h; profileУстанавливает профиль правила. Синтаксис: Profile ::= profile '(' string | word | list ')' certificateСертификат, используемый для поддержки HTTPS-соединения. Действительно только для правил reverse-прокси. Синтаксис: CertAuthEnabled ::= cert_auth_enabled '(' boolean ')' Certificate ::= certificate '(' certificate_name ')' certificate_name ::= string | word gatewayШлюз. Имя одного из существующих шлюзов. Действительно только для правил NAT и маршрутизации, и для условий сценария "Проверка состояния". Синтаксис: Gateway ::= gateway '(' string | word ')' Свойства правил межсетевого экранаreject_withУстанавливает способ, с помощью которого будет блокироваться трафик. Действительно только для правил межсетевого экрана. Синтаксис: Reject ::= reject_with '(' "tcp-reset-both" | "tcp-rst" | "host-unreach" ')' fragmentedПроверка на фрагментированность пакетов. Действительно только для правил межсетевого экрана. Синтаксис: Fragmented ::= fragmented '(' boolean ')' boolean ::= yes | no | true | false yes — проверяются только фрагментированные пакеты; ips_profileУстанавливает профиль IPS. Действительно только для правил межсетевого экрана. Синтаксис: IPS_Profile ::= ips_profile '(' string | word ')' l7_profileУстанавливает профиль приложения. Действительно только для правил межсетевого экрана. Синтаксис: L7_Profile ::= l7_profile '(' string | word ')' Свойства правил инспектирования SSL
|
Имя |
Описание |
---|---|
PASS |
Разрешение посещения. |
DENY |
Блокировка веб-страницы. |
WARNING |
Предупреждение пользователя о том, что страница нежелательна для посещения. |
Условия
category, morphology, scenario, time, url, user.
request.header.Referer — Список URL, в котором указаны рефереры для текущей страницы.
request.header.User-Agent — Useragent пользовательских браузеров.
response.header.Content-Type — Списки типов контента.
http.method — Метод, используемый в HTTP-запросах.
Свойства
name, desc, enabled, rule_log, virus_heuristic.
Пример
[content "Content Rules"]
% ----------------- 1 --- "Content Rules" --------------
PASS \
url = lib.url("Education institutions") \
src.zone = Trusted \
desc("Content filtering rule which allows access to the list of URLs. This is an example rule which can be changed or deleted if necessary.") \
rule_log(yes) \
enabled(true) \
name("Example white list")
% ----------------- 2 --- "Content Rules" --------------
DENY("Blockpage (EN)") \
url = lib.url("Education institutions") \
dst.zone = Untrusted \
rule_log(yes) \
enabled(false) \
name("Example block RU RKN by URL list")
% ----------------- 3 --- "Content Rules" --------------
DENY \
url = lib.network("Private IPs") \
morphology = lib.morphology(Drugs) \
src.zone = Trusted \
time = lib.time(Weekdays) \
rule_log(yes) \
redirect(302, "https://bing.com") \
enabled(false) \
name("Example redirect to safesearch engines")
Правила межсетевого экрана
Префиксы
Имя |
Описание |
---|---|
PASS |
Разрешение трафика. |
DENY |
Блокировка трафика. |
Условия
service, scenario, time, url, user, hip_profile.
Свойства
name, desc, enabled, rule_log, reject_with, ips_profile, l7_profile.
Пример
[firewall "Firewall rules"]
% ----------------- 1 -----------------
DENY \
scenario = "Example torrent detection scenario" \
dst.zone = Untrusted \
dst.ip = lib.network("Botnets IP list") \
rule_log(session) \
reject_with("host-unreach") \
enabled(true) \
name("Example block RU RKN by IP list")
% ----------------- 2 -----------------
PASS \
scenario = "Example torrent detection scenario" \
src.zone = Trusted \
dst.zone = Untrusted \
hip_profile = "HIP profile" \
ips_profile("Default IDPS profile") \
l7_profile("Pass all applications") \
rule_log(yes, "3/h", 5) \
enabled(true) \
name("Allow trusted to untrusted")
Правила NAT и маршрутизации
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Тип правила определяется действием (Action):
- nat — правило NAT;
- dnat — правило DNAT;
- port_mapping — правило порт-форвардинга;
- netmap — правило Network mapping;
- route — правило policy-based.
Условия
src.zone, src.geoip, src.ip, src.mac.
service, scenario, time, url, user.
Свойства
name, desc, enabled, rule_log, direction, target_ip, target_snat, snat_target_ip, port_map, gateway.
Пример
[nat_routing "NAT and Routing Rules"]
% ----------------- 1 -----------------
OK \
src.zone = Trusted \
service = (HTTP, HTTPS) \
snat_target_ip("192.168.13.210") \
rule_log(session) \
enabled(true) \
name("NAT Rule")\
nat
% ----------------- 2 -----------------
OK \
src.zone = Management \
dst.ip = (lib.network("Private IPs"), lib.url("Microsoft Windows Internet checker")) \
target_ip("171.168.1.1") \
target_snat(yes) \
snat_target_ip("192.168.1.1") \
enabled(true) \
name("DNAY Rule")\
dnat
% ----------------- 3 -----------------
OK \
target_ip("172.168.1.1") \
snat_target_ip("192.168.1.1") \
port_map(tcp, 2000, 2000) \
enabled(true) \
name("Port-forwarding Rule")\
port_mapping
% ----------------- 4 -----------------
OK \
user = example \
scenario = "Example torrent detection scenario" \
gateway(My) \
enabled(true) \
name("Policy-base Rule")\
route
% ----------------- 5 -----------------
OK \
dst.geoip = (RW, SO) \
target_ip("172.168.1.1") \
direction(input) \
enabled(true) \
name("Network mapping Rule")\
netmap
Правила Captive-портала
Префиксы
Имя |
Описание |
---|---|
PASS |
Не использовать аутентификацию. |
OK |
Использовать Captive-профиль. |
Условия
Свойства
name, desc, enabled, rule_log, profile.
Пример
[captive "Captive Rules"]
% ----------------- 1 -----------------
PASS \
category = lib.category(Threats) \
url = lib.url("Microsoft Windows Internet checker") \
time = lib.time(Weekends) \
rule_log(yes) \
enabled(true) \
name("Skip auth for Microsoft Internet checker")
% ----------------- 2 -----------------
OK \
src.zone = Trusted \
profile("Example Captive profile") \
enabled(true) \
name("Example Captive portal")
Правила инспектирования SSL
Префиксы
Имя |
Описание |
---|---|
PASS |
Не расшифровывать передаваемые данные. |
OK |
Расшифровать передаваемые данные. |
Пересылка определяется действием (Action):
- forward — в случае успешной расшифровки трафика SSL/TLS копия трафика будет переслана в соответствии с правилом и профилем инспектирования SSL (ssl_forward_profile).
Условия
time, service, user, category.
Свойства
name, desc, enabled, rule_log, ssl_profile, ssl_forward_profile.
block_invalid_cert, check_revoc_cert, block_expired_cert, block_self_signed_cert.
Пример
[ssl "Decrypt Rules"]
% ----------------- 1 -----------------
PASS \
category = (Finance, "Information Security") \
rule_log(yes) \
ssl_profile("Default SSL profile") \
enabled(false) \
name("Example DO NOT Decrypt rule for Finance and Security sites")
% ----------------- 2 -----------------
OK \
category = lib.category(Threats) \
rule_log(yes) \
block_invalid_cert(yes) \
check_revoc_cert(yes) \
block_expired_cert(yes) \
block_self_signed_cert(yes) \
ssl_profile("Default SSL profile") \
enabled(false) \
name("Example decrypt rule for parental control")
% ----------------- 3 -----------------
OK \
url = lib.url("Default SSL profile") \
rule_log(yes) \
ssl_profile("Default SSL profile") \
ssl_forward_profile("SSL forward profile") \
enabled(false) \
name("Example decrypt RU RKN")\
forward
Правила инспектирования SSH
Префиксы
Имя |
Описание |
---|---|
PASS |
Не расшифровывать передаваемые данные. |
OK |
Расшифровать передаваемые данные. |
Условия
Свойства
name, desc, enabled, rule_log,
block_ssh_shell, block_ssh_exec, block_sftp, ssh_command.
Пример
[ssh "SSH inspection Rules"]
% ----------------- 1 -----------------
PASS \
service = "Any UDP" \
rule_log(yes) \
enabled(true) \
name("Bypass Rule")
% ----------------- 2 -----------------
OK \
service = IMAP \
block_ssh_shell(yes) \
block_ssh_exec(yes) \
block_sftp(yes) \
ssh_command("command") \
rule_log(yes) \
enabled(true) \
name("Decrypy Rule")
DNS-правила
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда OK. |
Условия
Свойства
name, desc, enabled, dns_server.
Пример
[dns "DNS Rules"]
% ----------------- 1 -----------------
OK \
url.domain = "*.example.com" \
dns_server(1.2.3.4) \
enabled(true) \
name("Dns rule")
DoS-правила
Префиксы
Имя |
Описание |
---|---|
PASS |
Разрешение трафика. |
DENY |
Безусловная блокировка трафика. |
WARNING |
Применение профиля защиты от DoS-атак. |
Условия
time, service, user, scenario,
Свойства
name, desc, enabled, rule_log, profile.
Пример
[dos "DoS Rules"]
% ----------------- 1 -----------------
PASS \
scenario = "Example torrent detection scenario" \
user = example \
src.ip = lib.url("Microsoft Windows Internet checker") \
dst.geoip = RW \
service = FTP \
rule_log(session) \
enabled(true) \
name("DoS Allow Rule")
% ----------------- 2 -----------------
DENY \
desc(api_dos_rule) \
rule_log(yes, "3/h", 5) \
enabled(true) \
name("DoS Deny Rule")
% ----------------- 3 -----------------
WARNING \
user = "CN=VPN users,DC=LOCAL" \
time = lib.time("Working hours") \
profile("DoS Profile") \
enabled(false) \
name("DoS Protect Rule")
ICAP-правила
Префиксы
Имя |
Описание |
---|---|
PASS |
Пропуск. Не посылать данные на ICAP-сервер. |
OK |
Пересылка данных на ICAP-сервер. |
Действие (Action):
- ignore — игнорировать ответ от ICAP-сервера.
Условия
url, category, user, service, http.method, response.header.Content-Type.
Свойства
name, desc, enabled, rule_log, profile.
Пример
[dos "DoS Rules"]
% ----------------- 1 -----------------
PASS \
scenario = "Example torrent detection scenario" \
user = example \
src.ip = lib.url("Microsoft Windows Internet checker") \
dst.geoip = RW \
service = FTP \
rule_log(session) \
enabled(true) \
name("DoS Allow Rule")
% ----------------- 2 -----------------
DENY \
desc(api_dos_rule) \
rule_log(yes, "3/h", 5) \
enabled(true) \
name("DoS Deny Rule")
% ----------------- 3 -----------------
WARNING \
user = "CN=VPN users,DC=LOCAL" \
time = lib.time("Working hours") \
profile("DoS Profile") \
enabled(false) \
name("DoS Protect Rule")
Правила защиты почтового трафика
Префиксы
Имя |
Описание |
---|---|
PASS |
Пропуск трафика без изменений. |
DENY ("with error") |
Блокировка письма, при этом сообщается об ошибке доставки письма на сервер. |
DENY |
Блокировка письма без уведомления о блокировке. |
WARNING |
Маркировка почтовых сообщений. |
Условия
user, service, envelope_from, envelope_to.
Свойства
name, desc, enabled, rule_log, mark_hdr, mark, antispam_usergate, dnsbl.
Пример
[mailsecurity "Mail Security Rules"]
% ----------------- 1 -----------------
PASS \
user = (example, "CN=VPN users,DC=LOCAL") \
envelope_from = "Email froup from" \
envelope_to = "Email froup to" \
service = SMTP \
rule_log(yes) \
mark_hdr(Subject) \
enabled(true) \
name("Mail Pass Rule")
% ----------------- 2 -----------------
DENY("with error") \
service = (SMTPS, SMTP) \
rule_log(yes) \
mark_hdr(Subject) \
antispam_usergate(yes) \
enabled(true) \
name("Mail Drop Rule")
% ----------------- 3 -----------------
DENY \
src.zone = Untrusted \
service = SMTP \
mark_hdr(Subject) \
dnsbl(yes) \
enabled(false) \
name("DNSBL spam drop rule")
% ----------------- 4 -----------------
WARNING \
src.zone = Untrusted \
service = (SMTP, POP3, SMTPS, POP3S) \
mark_hdr(Subject) \
mark("[SPAM]") \
antispam_usergate(yes) \
enabled(false) \
name("SMTP and POP3 filtering")
Правила reverse-прокси
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
src.zone, src.geoip, src.ip, src.mac.
user, request.header.User-Agent, url.port.
Свойства
name, desc, enabled, rule_log, profile, certificate, cert_auth_enabled, is_https, ssl_profile, waf_profile, rewrite_path.
Пример
[reverseproxy "Reverse proxy Rules"]
% ----------------- 1 -----------------
OK \
url.port = 80 \
src.zone = Untrusted \
desc("Example reverse proxy rule. This is an example rule which can be changed or deleted if necessary. ") \
profile("Example reverse proxy server") \
rewrite_path("example.com/path1", "example.local/path1") \
waf_profile("Example WAF profile") \
enabled(true) \
name("Example reverse proxy rule")
Правила веб-безопасности
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
src.zone, src.geoip, src.ip, src.mac.
Свойства
name, desc, enabled, rule_log.
enable_adblock, safe_search, search_history_logging, social_sites_block, enable_injector, custom_injector, url_list_exclusions.
Пример
[safebrowsing "Safe browsing Rules"]
% ----------------- 1 -----------------
OK \
rule_log(yes) \
enable_adblock(yes) \
safe_search(yes) \
search_history_logging(yes) \
social_sites_block(yes) \
enable_injector(yes) \
custom_injector(code) \
url_list_exclusions(FISHING_BLACK_LIST) \
desc("Safebrowsing rule for all users. This is an example rule which can be changed or deleted if necessary.") \
enabled(false) \
name("Example safebrowsing")
Правила пропускной способности
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
src.zone, src.geoip, src.ip, src.mac.
time, user application, service, scenario,
Свойства
name, desc, enabled, rule_log, bandwidth_pool.
Пример
[shaper "Shaper Rules"]
% ----------------- 1 -----------------
OK \
scenario = "Example torrent detection scenario" \
service = "HTTP Proxy" \
rule_log(session) \
bandwidth_pool("1 Mbps") \
enabled(true) \
name("Example Bandwidth rule")
% ----------------- 2 -----------------
OK \
scenario = "Example torrent detection scenario" \
src.zone = Trusted \
application = lib.category("Coin Miners", Business) \
rule_log(yes, "3/h", 5) \
bandwidth_pool("100 Kbps") \
enabled(true) \
name("Example torrent shaper")
Правила инспектирования туннелей
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
src.zone, src.geoip, src.ip, src.mac.
Свойства
Пример
[tunnel "Tunnel inspection Rules"]
% ----------------- 1 -----------------
PASS \
src.zone = Trusted \
dst.zone = Untrusted \
service = gre \
enabled(true) \
name("Example Tonnel Incpection Bypass rule")
% ----------------- 2 -----------------
OK \
dst.geoip = YE \
service = gtpu \
enabled(true) \
name("Example Tonnel Incpection Rule")
Правила веб-портала
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
url, user, url.domain.
Свойства
icon, ssl_profile, certificate, additional_url, rdp_check_session_alive, transparent_auth.
Пример
[webportal "Web portal Rules"]
% ----------------- 1 -----------------
OK \
user = "CN=Default Group,DC=LOCAL" \
url = "http://www.intranet.loc" \
icon("default.svg") \
rdp_check_session_alive(yes) \
transparent_auth(yes) \
certificate("CA (Default)") \
ssl_profile("Default SSL profile") \
enabled(false) \
name("Example http application published via web portal")
Правила VPN-сервера
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
src.zone, src.geoip, src.ip, src.mac.
user,
Свойства
profile, auth_profile, vpn_network, interface.
Пример
[vpn_server "VPN server Rules"]
% ----------------- 1 -----------------
OK \
user = "CN=VPN users,DC=LOCAL" \
src.zone = Untrusted \
profile("Remote access VPN profile") \
auth_profile("Example user auth profile") \
vpn_network("Remote access VPN network") \
interface(tunnel1) \
enabled(false) \
name("Remote access VPN rule")
Правила VPN-клиента
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Свойства
profile, interface, server_address.
last_error, status, connection_time — информационные поля, недоступные для редактирования.
Пример
[vpn_client "VPN client Rules"]
% ----------------- 1 -----------------
OK \
server_address("10.10.10.10") \
last_error(Disabled) \
status(disconnected) \
connection_time(0) \
profile("Client VPN profile") \
interface(tunnel3) \
enabled(true) \
name("Client VPN rule")
Правила сценариев
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
Свойства
operation_mode, trigger, duration.
Условия сценария
Категория URL (url_category)
Условия
Свойства
count_interval, max_event_count, scond_type
Обнаружение вируса (virus_detection)
Свойства
Приложение (app)
Условия
Свойства
count_interval, max_event_count, scond_type
СОВ (ips)
Свойства
Тип котента (mime_type)
Условия
Свойства
count_interval, max_event_count, scond_type
Размер пакета (net_packet_size)
Свойства
Сессий c одного IP (sessions_per_ip)
Свойства
Объем трафика (traffic)
Свойства
traffic_limit, period, scond_type
Проверка состояния (health_check)
Условия
Свойства
health_check_method, health_result, health_request_timeout, health_type_request, health_answer_timeout
count_interval, max_event_count, scond_type
Пример
[scenarios "Scenario Rules"]
% ----------------- 1 -----------------
def scenario_cond example_scenario_define
category = (lib.category(Threats), "Advertisements & Pop-Ups") count_interval(10) max_event_count(3) scond_type(url_category)
scond_type(virus_detection)
application = lib.category(Threats) count_interval(2) max_event_count(1) scond_type(app)
ips_tl(medium) scond_type(ips)
response.header.Content-Type = lib.mime("Java script") count_interval(0) max_event_count(0) scond_type(mime_type)
packet_size(200MB) scond_type(net_packet_size)
sessions_limit(50) scond_type(sessions_per_ip)
traffic_limit(2GB) period(hour) scond_type(traffic)
url.address = "192.168.100.100" url.domain = "example.com" health_check_method(dns) \
health_result(negative) health_request_timeout(4) health_type_request(a) \
count_interval(5) max_event_count(3) scond_type(health_check)
url.domain = "example.com" health_check_method(get) \
health_result(negative) health_request_timeout(5) health_answer_timeout(10) \
count_interval(0) max_event_count(0) scond_type(health_check)
end
OK \
scenario_cond = example_scenario_define \
operation_mode(all) \
trigger(one_user) \
duration(5) \
enabled(false) \
name("Example torrent detection scenario")
Правила балансировки нагрузки TCP/UDP
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Условия
src.zone, src.geoip, src.ip, src.mac.
service, url.address, url.port.
Свойства
scheduler, real_server, ipvs_fallback
monitor_kind, monitor_service, monitor_request, monitor_response, monitor_interval, monitor_timeout, monitor_failurecount
Пример
[ipvs_server "TCP/UDP load balancing Rules"]
% ----------------- 1 -----------------
OK \
src.geoip = RW \
url.address = 192.168.1.100 \
url.port = 80 \
service = tcp \
scheduler(rr) \
real_server(gate, 1.1.1.1:80, 50) \
ipvs_fallback(masq_snat, 8.8.8.8:10000) \
monitor_kind(negotiate) \
monitor_service(http) \
monitor_request("example.com") \
monitor_interval(60) \
monitor_timeout(60) \
monitor_failurecount(10) \
enabled(true) \
name("TCP load balancing")
Правила балансировки ICAP
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Свойства
Пример
[icap_balancing "ICAP load balancing Rules"]
% ----------------- 1 -----------------
OK \
profile("Example ICAP server") \
enabled(true) \
name("ICAP load balancing")
Правила балансировки reverse-прокси
Префиксы
Имя |
Описание |
---|---|
OK |
Всегда ОК. |
Свойства
Пример
[reverseproxy_balancing "Reverse proxy load balancing Rules"]
% ----------------- 1 -----------------
OK \
profile("Example reverse proxy server") \
enabled(true) \
name("Reverse-proxy load balancing")