Содержание
Модель безопасности Flow
Модель безопасности Flow позволяет ассоциировать с ресурсами конечные автоматы, получать и изменять состояния конечных автоматов, а также проверять, что состояние конечного автомата входит в заданный набор состояний. Например, можно ассоциировать процесс с конечным автоматом, чтобы разрешать и запрещать этому процессу использовать накопители и/или сеть в зависимости от состояния конечного автомата.
PSL-файл с описанием модели безопасности Flow находится в KasperskyOS SDK по пути:
toolchain/include/nk/flow.psl
Объект модели безопасности Flow
Чтобы использовать модель безопасности Flow, нужно создать объект (объекты) этой модели.
Один объект модели безопасности Flow позволяет ассоциировать множество ресурсов со множеством конечных автоматов, которые имеют одинаковую конфигурацию. Ресурс может быть ассоциирован только с одним конечным автоматом каждого объекта модели безопасности Flow.
Объект модели безопасности Flow имеет следующие параметры:
type State
– тип, определяющий множество состояний конечного автомата (вариантный тип, объединяющий текстовые литералы);config
– конфигурация конечного автомата:states
– множество состояний конечного автомата (должно совпадать со множеством состояний, заданных типомState
);initial
– начальное состояние конечного автомата;transitions
– описание допустимых переходов между состояниями конечного автомата.
Все параметры объекта модели безопасности Flow являются обязательными.
Пример:
policy object service_flow : Flow {
type State = "sleep" | "started" | "stopped" | "finished"
config = { states : ["sleep", "started", "stopped", "finished"]
, initial : "sleep"
, transitions : { "sleep" : ["started"]
, "started" : ["stopped", "finished"]
, "stopped" : ["started", "finished"]
}
}
}
Диаграмма состояний конечного автомата в примере
Объект модели безопасности Flow может быть покрыт аудитом безопасности. При этом можно задать условия выполнения аудита, специфичные для модели безопасности Flow. Для этого в описании конфигурации аудита нужно использовать следующую конструкцию:
omit : [
<"состояние 1"
>[,
] ...]
– аудит не выполняется, если конечный автомат находится в одном из перечисленных состояний.
Необходимость создавать несколько объектов модели безопасности Flow возникает в следующих случаях:
- Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности Flow (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
- Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности Flow (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
- Если нужно использовать конечные автоматы с разными конфигурациями.
Правило init модели безопасности Flow
init {sid : <Sid>}
Создает конечный автомат и ассоциирует его с ресурсом sid
. Созданный конечный автомат имеет конфигурацию, заданную в параметрах используемого объекта модели безопасности Flow.
Возвращает результат "разрешено", если создало ассоциацию конечного автомата с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
уже ассоциирован с конечным автоматом используемого объекта модели безопасности Flow. - Значение
sid
вне допустимого диапазона.
Пример:
/* Запуск процесса класса Server будет разрешен,
* если при инициации запуска будет создана
* ассоциация этого процесса с конечным автоматом.
* Иначе запуск процесса класса Server будет запрещен. */
execute dst=Server {
service_flow.init {sid : dst_sid}
}
Правило fini модели безопасности Flow
fini {sid : <Sid>}
Удаляет ассоциацию конечного автомата ресурсом sid
. Конечный автомат, который более не ассоциирован с ресурсом, уничтожается.
Возвращает результат "разрешено", если удалило ассоциацию конечного автомата с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow. - Значение
sid
вне допустимого диапазона.
Правило enter модели безопасности Flow
enter {sid : <Sid>, state : <State>}
Переводит конечный автомат, ассоциированный с ресурсом sid
, в состояние state
.
Возвращает результат "разрешено", если перевело конечный автомат, ассоциированный с ресурсом sid
, в состояние state
.
Возвращает результат "запрещено" в следующих случаях:
- Переход в состояние
state
из текущего состояния не допускается конфигурацией конечного автомата, ассоциированного с ресурсомsid
. - Ресурс
sid
не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow. - Значение
sid
вне допустимого диапазона.
Пример:
/* Любому клиенту в решении будет разрешено обращаться
* к серверу класса Server, если конечный автомат,
* ассоциированный с этим сервером, будет переведен в
* состояние started при инициации обращения. Иначе
* любому клиенту в решении будет запрещено обращаться
* к серверу класса Server. */
request dst=Server {
service_flow.enter {sid : dst_sid, state : "started"}
}
Правило allow модели безопасности Flow
allow {sid : <Sid>, states : <Set<State>>}
Проверяет, что состояние конечного автомата, ассоциированного с ресурсом sid
, входит в набор состояний states
.
Возвращает результат "разрешено", если состояние конечного автомата, ассоциированного с ресурсом sid
, входит в набор состояний states
.
Возвращает результат "запрещено" в следующих случаях:
- Состояние конечного автомата, ассоциированного с ресурсом
sid
, не входит в набор состоянийstates
. - Ресурс
sid
не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow. - Значение
sid
вне допустимого диапазона.
Пример:
/* Любому клиенту в решении разрешено обращаться к серверу класса
* Server, если конечный автомат, ассоциированный с этим сервером,
* находится в состоянии started или stopped. Иначе любому клиенту
* в решении запрещено обращаться к серверу класса Server. */
request dst=Server {
service_flow.allow {sid : dst_sid, states : ["started", "stopped"]}
}
Выражение query модели безопасности Flow
query {sid : <Sid>}
Предназначено для использования в качестве выражения, проверяющего выполнение условий в конструкции choice
(о конструкции choice
см. "Привязка методов моделей безопасности к событиям безопасности"). Проверяет состояние конечного автомата, ассоциированного с ресурсом sid
. В зависимости от результатов этой проверки выполняются различные варианты обработки события безопасности.
Выполняется некорректно в следующих случаях:
- Ресурс
sid
не ассоциирован с конечным автоматом используемого объекта модели безопасности Flow. - Значение
sid
вне допустимого диапазона.
Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".
Пример:
/* Любому клиенту в решении разрешено обращаться к
* серверу класса ResourceDriver, если конечный автомат,
* ассоциированный с этим сервером, находится в состоянии
* started или stopped. Иначе любому клиенту в решении
* запрещено обращаться к серверу класса ResourceDriver. */
request dst=ResourceDriver {
choice (service_flow.query {sid : dst_sid}) {
"started" : grant ()
"stopped" : grant ()
_ : deny ()
}
}