Содержание
- Описание политики безопасности решения на базе KasperskyOS
- Общие сведения об описании политики безопасности решения на базе KasperskyOS
- Синтаксис языка PSL
- Описание глобальных параметров политики безопасности решения на базе KasperskyOS
- Включение PSL-файлов
- Включение EDL-файлов
- Создание объектов моделей безопасности
- Привязка методов моделей безопасности к событиям безопасности
- Описание профилей аудита безопасности
- Описание и выполнение тестов политики безопасности решения на базе KasperskyOS
- Типы данных в языке PSL
- Примеры привязок методов моделей безопасности к событиям безопасности
- Примеры описаний простейших политик безопасности решений на базе KasperskyOS
- Примеры описаний профилей аудита безопасности
- Примеры описаний тестов политик безопасности решений на базе KasperskyOS
- Модели безопасности KasperskyOS
- Модель безопасности Pred
- Модель безопасности Bool
- Модель безопасности Math
- Модель безопасности Struct
- Модель безопасности Base
- Модель безопасности Regex
- Модель безопасности HashSet
- Модель безопасности StaticMap
- Объект модели безопасности StaticMap
- Правило init модели безопасности StaticMap
- Правило fini модели безопасности StaticMap
- Правило set модели безопасности StaticMap
- Правило commit модели безопасности StaticMap
- Правило rollback модели безопасности StaticMap
- Выражение get модели безопасности StaticMap
- Выражение get_uncommited модели безопасности StaticMap
- Модель безопасности Flow
- Модель безопасности Mic
- Объект модели безопасности Mic
- Правило create модели безопасности Mic
- Правило execute модели безопасности Mic
- Правило upgrade модели безопасности Mic
- Правило call модели безопасности Mic
- Правило invoke модели безопасности Mic
- Правило read модели безопасности Mic
- Правило write модели безопасности Mic
- Выражение query_level модели безопасности Mic
Описание политики безопасности решения на базе KasperskyOS
Описание политики безопасности решения на базе KasperskyOS (далее также описание политики безопасности решения, описание политики) представляет собой набор связанных между собой текстовых файлов с расширением psl
, которые содержат декларации на языке PSL. Одни файлы ссылаются на другие через декларацию включения, в результате чего образуется иерархия файлов с одним файлом верхнего уровня. Файл верхнего уровня специфичен для решения. Файлы нижнего и промежуточных уровней содержат части описания политики безопасности решения, которые могут быть специфичными для решения или могут быть повторно использованы в других решениях.
Часть файлов нижнего и промежуточных уровней поставляется в составе SDK KasperskyOS. Эти файлы содержат определения базовых типов данных и формальные описания моделей безопасности KasperskyOS. Модели безопасности KasperskyOS (далее модели безопасности) – это фреймворк для реализации политик безопасности решений на базе KasperskyOS. Файлы с формальными описаниями моделей безопасности ссылаются на файл с определениями базовых типов данных, которые используются в описаниях моделей.
Другая часть файлов нижнего и промежуточных уровней создается разработчиком описания политики, если какие-либо части описания политики требуется повторно использовать в других решениях. Также разработчик описания политики может помещать части описания политики в отдельные файлы для удобства редактирования.
Файл верхнего уровня ссылается на файлы с определениями базовых типов данных и описаниями моделей безопасности, которые применяются в той части политики безопасности решения, которая описана в этом файле. Также файл верхнего уровня ссылается на все файлы нижнего и промежуточных уровней, созданные разработчиком описания политики.
Файл верхнего уровня, как правило, называется security.psl
, но может иметь любое другое имя вида *.psl
.
Общие сведения об описании политики безопасности решения на базе KasperskyOS
В упрощенном представлении описание политики безопасности решения на базе KasperskyOS состоит из привязок, которые ассоциируют описания событий безопасности с вызовами методов, предоставляемых объектами моделей безопасности. Объект модели безопасности – это экземпляр класса, определение которого является формальным описанием модели безопасности (в PSL-файле). Формальные описания моделей безопасности содержат сигнатуры методов моделей безопасности, которые определяют допустимость взаимодействий процессов между собой и с ядром KasperskyOS. Эти методы делятся на два вида:
- Правила моделей безопасности – это методы моделей безопасности, возвращающие результат "разрешено" или "запрещено". Правила моделей безопасности могут изменять контексты безопасности (о контексте безопасности см. "Управление доступом к ресурсам").
- Выражения моделей безопасности – это методы моделей безопасности, возвращающие значения, которые могут использоваться как входные данные для других методов моделей безопасности.
Объект модели безопасности предоставляет методы, специфичные для одной модели безопасности, и хранит параметры, используемые этими методами (например, начальное состояние конечного автомата или размер контейнера для каких-либо данных). Один объект может применяться для работы с несколькими ресурсами. (То есть не нужно создавать отдельный объект для каждого ресурса.) При этом этот объект будет независимо использовать контексты безопасности этих ресурсов. Также несколько объектов одной или разных моделей безопасности может применяться для работы с одним и тем же ресурсом. В этом случае разные объекты будут использовать контекст безопасности одного ресурса без взаимного влияния.
События безопасности – это сигналы об инициации взаимодействий процессов между собой и с ядром KasperskyOS. К событиям безопасности относятся следующие события:
- отправка IPC-запросов клиентами;
- отправка IPC-ответов серверами или ядром;
- инициация запусков процессов ядром или процессами;
- запуск ядра;
- обращения процессов к модулю безопасности Kaspersky Security Module через интерфейс безопасности.
События безопасности обрабатываются модулем безопасности.
Модели безопасности
В составе KasperskyOS SDK поставляются PSL-файлы, которые описывают следующие модели безопасности:
- Base – методы, реализующие простейшую логику;
- Pred – методы, реализующие операции сравнения;
- Bool – методы, реализующие логические операции;
- Math – методы, реализующие операции целочисленной арифметики;
- Struct – методы, обеспечивающие доступ к структурным элементам данных (например, доступ к параметрам интерфейсных методов, передаваемых в IPC-сообщениях);
- Regex – методы для валидации текстовых данных по регулярным выражениям;
- HashSet – методы для работы с одномерными таблицами, ассоциированными с ресурсами;
- StaticMap – методы для работы с двумерными таблицами типа "ключ–значение", ассоциированными с ресурсами;
- Flow – методы для работы с конечными автоматами, ассоциированными с ресурсами;
- Mic – методы для реализации мандатного контроля целостности (англ. Mandatory Integrity Control, MIC).
Обработка событий безопасности модулем безопасности Kaspersky Security Module
Модуль безопасности Kaspersky Security Module вызывает все методы (правила и выражения) моделей безопасности, связанные с произошедшим событием безопасности. Если все правила вернули результат "разрешено", модуль безопасности возвращает решение "разрешено". Если хотя бы одно правило вернуло результат "запрещено", модуль безопасности возвращает решение "запрещено".
Если хотя бы один метод, связанный с произошедшим событием безопасности, не может быть корректно выполнен, модуль безопасности возвращает решение "запрещено".
Если с произошедшим событием безопасности не связано ни одно правило, модуль безопасности возвращает решение "запрещено". То есть все взаимодействия компонентов решения между собой и с ядром KasperskyOS, которые явно не разрешены политикой безопасности решения, запрещены (принцип Default Deny).
Аудит безопасности
Аудит безопасности (далее также аудит) представляет собой следующую последовательность действий. Модуль безопасности Kaspersky Security Module сообщает ядру KasperskyOS сведения о решениях, принятых этим модулем. Затем ядро передает эти данные системной программе Klog
, которая декодирует их и передает системной программе KlogStorage
(передача данных осуществляется через IPC). Последняя выводит полученные данные через стандартный вывод или сохраняет в файл.
Данные аудита безопасности (далее данные аудита) – это сведения о решениях модуля безопасности Kaspersky Security Module, которые включают сами решения ("разрешено" или "запрещено"), описания событий безопасности, результаты вызовов методов моделей безопасности, а также данные о некорректности IPC-сообщений. Данные о вызовах выражений моделей безопасности входят в данные аудита так же, как и данные о вызовах правил моделей безопасности.
В началоСинтаксис языка PSL
Базовые правила
- Декларации могут располагаться в файле в любом порядке.
- Одна декларация может быть записана в одну или несколько строк. Вторая и последующие строки декларации должны быть записаны с отступами относительно первой строки. Закрывающая фигурная скобка, которая завершает декларацию, может быть записана на уровне первой строки.
- В многострочной декларации используются отступы разных размеров, чтобы отразить вложенность конструкций, составляющих эту декларацию. Вторая и последующие строки многострочной конструкции, заключенные в фигурные скобки, должны быть записаны с отступом относительно первой строки этой конструкции. Закрывающая фигурная скобка многострочной конструкции может быть записана с отступом или на уровне первой строки конструкции.
- Язык PSL чувствителен к регистру символов.
- Поддерживаются однострочные и многострочные комментарии:
/* Это комментарий
* И это тоже */
// Ещё один комментарий
Типы деклараций
В языке PSL есть следующие типы деклараций:
- описание глобальных параметров политики безопасности решения;
- включение PSL-файлов;
- включение EDL-файлов;
- создание объектов моделей безопасности;
- привязка методов моделей безопасности к событиям безопасности;
- описание профилей аудита безопасности;
- описание тестов политики безопасности решения.
Описание глобальных параметров политики безопасности решения на базе KasperskyOS
Глобальными являются следующие параметры политики безопасности решения:
- Execute-интерфейс, через который ядро KasperskyOS обращается к модулю безопасности Kaspersky Security Module, чтобы сообщить о запуске ядра или об инициации запуска процесса ядром или другими процессами. Чтобы задать этот интерфейс, нужно использовать декларацию:
execute: kl.core.Execute
В настоящее время в KasperskyOS поддерживается только один execute-интерфейс
Execute
, определенный в файлеkl/core/Execute.idl
. (Этот интерфейс состоит из одного методаmain
, который не имеет параметров и не выполняет никаких действий. Методmain
зарезервирован для возможного использования в будущем.) - [Опционально] Глобальный профиль аудита безопасности и начальный уровень аудита безопасности. Чтобы задать эти параметры, нужно использовать декларацию:
audit default = <имя профиля аудита безопасности> <уровень аудита безопасности>
Пример:
audit default = global 0
По умолчанию в качестве глобального используется пустой профиль аудита безопасности
empty
, описанный в файлеtoolchain/include/nk/base.psl
из состава KasperskyOS SDK, и уровень аудита безопасности 0.
Включение PSL-файлов
Для включения PSL-файла нужно использовать декларацию:
use <ссылка на PSL-файл._>
Ссылка на PSL-файл представляет собой путь к PSL-файлу (без расширения и точки перед ним) относительно директории, которая включена в набор директорий, где компилятор nk-psl-gen-c
ищет PSL-, IDL-, CDL-, EDL-файлы. (Этот набор директорий задается параметрами -I
<путь к файлам
> при запуске скрипта makekss
или компилятора nk-psl-gen-c
.) В качестве разделителя в описании пути используется точка. Декларация завершается последовательностью символов ._
.
Пример:
use policy_parts.flow_part._
Эта декларация включает файл flow_part.psl
, который находится в директории policy_parts
. Директория policy_parts
должна находиться в одной из директорий, где компилятор nk-psl-gen-c
выполняет поиск PSL-, IDL-, CDL-, EDL-файлов. Например, директория policy_parts
может располагаться в одной директории с PSL-файлом, содержащим эту декларацию.
Включение PSL-файла с формальным описанием модели безопасности
Чтобы использовать методы требуемой модели безопасности, нужно включить PSL-файл с формальным описанием этой модели. PSL-файлы с формальными описаниями моделей безопасности находятся в KasperskyOS SDK по пути:
toolchain/include/nk
Пример:
/* Включение файла base.psl с формальным описанием модели
* безопасности Base */
use nk.base._
/* Включение файла flow.psl с формальным описанием модели
* безопасности Flow */
use nk.flow._
/* Компилятор nk-psl-gen-c должен быть настроен на поиск
* PSL-, IDL-, CDL-, EDL-файлов в директории toolchain/include. */
Включение EDL-файлов
Чтобы включить EDL-файл для ядра KasperskyOS, нужно использовать декларацию:
use EDL kl.core.Core
Чтобы включить EDL-файл для программы (например, для драйвера или прикладной программы), нужно использовать декларацию:
use EDL <ссылка на EDL-файл>
Ссылка на EDL-файл представляет собой путь к EDL-файлу (без расширения и точки перед ним) относительно директории, которая включена в набор директорий, где компилятор nk-psl-gen-c
ищет PSL-, IDL-, CDL-, EDL-файлы. (Этот набор директорий задается параметрами -I
<путь к файлам
> при запуске скрипта makekss
или компилятора nk-psl-gen-c
.) В качестве разделителя в описании пути используется точка.
Пример:
/* Включение файла UART.edl
, который находится
* в KasperskyOS SDK по пути sysroot-*-kos/include/kl/drivers. */
use EDL kl.drivers.UART
/* Компилятор nk-psl-gen-c должен быть настроен на поиск
* PSL-, IDL-, CDL-, EDL-файлов в директории sysroot-*-kos/include. */
Компилятор nk-psl-gen-c
находит IDL-, CDL-файлы через EDL-файлы, так как EDL-файлы содержат ссылки на соответствующие CDL-файлы, а CDL-файлы содержат ссылки на соответствующие CDL-, IDL-файлы.
Создание объектов моделей безопасности
Для вызова методов требуемой модели безопасности, нужно создать объект этой модели безопасности.
Чтобы создать объект модели безопасности, нужно использовать декларацию:
policy object <имя объекта модели безопасности : название модели безопасности> {
[параметры объекта модели безопасности]
}
Параметры объекта модели безопасности специфичны для модели безопасности. Описание параметров и примеры создания объектов разных моделей безопасности приведены в разделе "Модели безопасности KasperskyOS".
В началоПривязка методов моделей безопасности к событиям безопасности
Чтобы создать привязку методов моделей безопасности к событию безопасности, нужно использовать декларацию:
<вид события безопасности> [селекторы события безопасности] {
[профиль аудита безопасности]
<вызываемые правила моделей безопасности>
}
Вид события безопасности
Чтобы задать вид события безопасности, используются следующие спецификаторы:
request
– отправка IPC-запросов;response
– отправка IPC-ответов;error
– отправка IPC-ответов, содержащих сведения об ошибках;security
– обращения процессов к модулю безопасности Kaspersky Security Module через интерфейс безопасности;execute
– инициация запусков процессов или запуск ядра KasperskyOS.
При взаимодействии процессов с модулем безопасности применяется механизм, отличный от IPC. Но при описании политики на обращения процессов к модулю безопасности можно смотреть как на передачу IPC-сообщений, так как процессы действительно передают модулю безопасности сообщения (в этих сообщениях не указывается приемник).
Для запуска процессов не используется механизм IPC. Но когда инициируется запуск процесса, ядро обращается к модулю безопасности, сообщая сведения об инициаторе запуска и запускаемом процессе. Поэтому с точки зрения разработчика описания политики можно считать, что запуск процесса – это передача IPC-сообщения от инициатора запуска к запускаемому процессу. Также при запуске ядра можно считать, что ядро отправляет IPC-сообщение самому себе.
Селекторы события безопасности
Селекторы события безопасности позволяют уточнить описание события безопасности заданного вида. Используются следующие селекторы:
src=
<имя класса процессов/ядро
> – процессы заданного класса или ядро KasperskyOS являются источниками IPC-сообщений;dst=
<имя класса процессов/ядро
> – процессы заданного класса или ядро являются приемниками IPC-сообщений;interface=
<имя интерфейса
> – описывает следующие события безопасности:- клиенты пытаются использовать службы серверов или ядра с заданным интерфейсом;
- процессы обращаются к модулю безопасности Kaspersky Security Module через заданный интерфейс безопасности;
- серверы или ядро отправляют клиентам результаты использования служб с заданным интерфейсом;
component=
<имя компонента
> – описывает следующие события безопасности:- клиенты пытаются использовать службы серверов или ядра, предоставляемые заданным компонентом;
- серверы или ядро отправляют клиентам результаты использования служб, предоставляемых заданным компонентом;
endpoint=
<квалифицированное имя службы
> – описывает следующие события безопасности:- клиенты пытаются использовать заданную службу серверов или ядра;
- серверы или ядро отправляют клиентам результаты использования заданной службы;
method=
<имя метода
> – описывает следующие события безопасности:- клиенты пытаются обратиться к серверам или ядру, вызывая заданный метод службы;
- процессы обращаются к модулю безопасности, вызывая заданный метод интерфейса безопасности;
- серверы или ядро отправляют клиентам результаты вызова заданного метода службы;
- ядро сообщает о своем запуске модулю безопасности, вызывая заданный метод execute-интерфейса;
- ядро инициирует запуски процессов, вызывая заданный метод execute-интерфейса;
- процессы инициируют запуски других процессов, в результате чего ядро вызывает заданный метод execute-интерфейса.
Классы процессов, компоненты, экземпляры компонентов, интерфейсы, службы, методы должны называться так, как они называются в IDL-, CDL-, EDL-описаниях. Ядро должно называться kl.core.Core
.
Квалифицированное имя службы является конструкцией вида <путь к службе.имя службы
>. Путь к службе представляет собой последовательность разделенных точкой имен экземпляров компонентов, среди которых каждый последующий экземпляр компонента вложен в предыдущий, а последний предоставляет службу с заданным именем.
Для событий вида security
нужно указывать квалифицированное имя метода интерфейса безопасности, если требуется использовать интерфейс безопасности, заданный в CDL-описании. (Если требуется использовать интерфейс безопасности, заданный в EDL-описании, указывать квалифицированное имя метода не нужно.) Квалифицированное имя метода интерфейса безопасности является конструкцией вида <путь к интерфейсу безопасности.имя метода
>. Путь к интерфейсу безопасности представляет собой последовательность разделенных точкой имен экземпляров компонентов, среди которых каждый последующий экземпляр компонента вложен в предыдущий, а последний поддерживает интерфейс безопасности, который включает метод с заданным именем.
Если селекторы не указаны, участниками события безопасности могут быть любые процессы и ядро (кроме событий вида security
, в которых ядро не может участвовать).
Можно использовать комбинации селекторов. При этом селекторы можно разделять запятыми.
На использование селекторов есть ограничения. Для событий безопасности вида execute
нельзя использовать селекторы interface
, component
и endpoint
. Для событий безопасности вида security
нельзя использовать селекторы dst
, component
, endpoint
.
Также есть ограничения на комбинации селекторов. Для событий безопасности видов request
, response
и error
селектор method
можно использовать только совместно с одним из селекторов endpoint
, interface
, component
или их комбинацией. (Селекторы method
, endpoint
, interface
и component
должны быть согласованы, то есть метод, служба, интерфейс и компонент должны быть связаны между собой.) Для событий безопасности вида request
селектор endpoint
можно использовать только совместно с селектором dst
. Для событий безопасности видов response
и error
селектор endpoint
можно использовать только совместно с селектором src
.
Вид и селекторы события безопасности составляют описание события безопасности. События безопасности рекомендуется описывать максимально точно, чтобы разрешать только необходимые взаимодействия процессов между собой и с ядром. Если при обработке заданного события всегда проверяются IPC-сообщения одного и того же типа, то описание этого события является максимально точным.
Чтобы описанию события безопасности соответствовали IPC-сообщения одного типа, для этого описания должно выполняться одно из следующих условий:
- Для событий безопасности вида
request
,response
иerror
однозначно определена цепочка "интерфейсный метод-служба-класс сервера или ядро". Например, описанию события безопасностиrequest dst=Server endpoint=net.Net method=Send
соответствуют IPC-сообщения одного типа, а описанию события безопасностиrequest dst=Server
соответствуют любые IPC-сообщения, отправляемые серверуServer
. - Для событий вида
security
указан метод интерфейса безопасности. - Для событий вида
execute
указан метод execute-интерфейса.В настоящее время поддерживается только один фиктивный метод execute-интерфейса
main
. Этот метод используется по умолчанию, поэтому его можно не задавать через селекторmethod
. Таким образом, любому описанию события безопасности видаexecute
соответствуют IPC-сообщения одного типа.
Профиль аудита безопасности
Профиль аудита безопасности задается конструкцией audit
<имя профиля аудита безопасности
>. Если профиль аудита безопасности не задан, используется глобальный профиль аудита безопасности.
Вызываемые правила моделей безопасности
Вызываемые правила моделей безопасности задаются списком из конструкций следующего вида:
[имя объекта модели безопасности.]<имя правила модели безопасности> <параметр>
Входными данными для правил моделей безопасности могут быть значения, возвращаемые выражениями моделей безопасности. Для вызова выражения модели безопасности используется конструкция:
[имя объекта модели безопасности.]<имя выражения модели безопасности> <параметр>
Также в качестве входных данных для методов моделей безопасности (правил и выражений) могут использоваться параметры интерфейсных методов. (О получении доступа к параметрам интерфейсных методов см. "Модель безопасности Struct"). Кроме этого, входными данными для методов моделей безопасности могут быть значения SID процессов и ядра KasperskyOS, которые задаются ключевыми словами src_sid
и dst_sid
. Первое означает SID процесса (или ядра), который является источником IPC-сообщения. Второе означает SID процесса (или ядра), который является приемником IPC-сообщения (при обращениях к модулю безопасности Kaspersky Security Module dst_sid
использовать нельзя).
Для вызовов некоторых правил и выражений моделей безопасности можно не указывать имя объекта модели безопасности, а также можно использовать операторы. Подробнее о методах моделей безопасности см. "Модели безопасности KasperskyOS".
Вложенные конструкции для привязки методов моделей безопасности к событиям безопасности
В одной декларации можно создать привязку методов моделей безопасности к разным событиям безопасности одного вида. Для этого нужно использовать match-секции, которые представляют собой конструкции вида:
match <селекторы события безопасности> {
[профиль аудита безопасности]
<вызываемые правила моделей безопасности>
}
Match-секции могут быть вложены в другую match-секцию. Match-секция использует одновременно свои селекторы события безопасности и селекторы события безопасности уровня декларации и всех match-секций, которые "оборачивают" эту match-секцию. Также match-секция применяет по умолчанию профиль аудита безопасности своего контейнера (match-секции предыдущего уровня или уровня декларации), но можно задать отдельный профиль аудита безопасности для match-секции.
Также в одной декларации можно задать различные варианты обработки события безопасности в зависимости от условий, при которых это событие наступило (например, от состояния конечного автомата, ассоциированного с ресурсом). Для этого нужно использовать условные секции, которые являются элементами конструкции:
choice <вызов выражения модели безопасности, проверяющего выполнение условий> {
"<условие 1>" : [{] // Условная секция 1
[профиль аудита безопасности]
<вызываемые правила моделей безопасности>
[}]
"<условие 2>" : ... // Условная секция 2
...
_ : ... // Условная секция, если ни одно условие не выполняется.
}
Конструкцию choice
можно использовать внутри match-секции. Условная секция использует селекторы события безопасности и профиль аудита безопасности своего контейнера, но можно задать отдельный профиль аудита безопасности для условной секции.
Если при обработке события безопасности выполняется сразу несколько условий, описанных в конструкции choice
, то срабатывает только одна условная секция, соответствующая первому в списке подходящему условию.
В качестве выражения, проверяющего выполнение условий в конструкции choice
, можно использовать только те выражения, которые предназначены специально для этого. Некоторые модели безопасности содержат такие выражения (подробнее см. "Модели безопасности KasperskyOS").
Примеры привязок методов моделей безопасности к событиям безопасности
См. "Примеры привязок методов моделей безопасности к событиям безопасности", "Примеры описаний простейших политик безопасности решений на базе KasperskyOS", "Модели безопасности KasperskyOS".
В началоОписание профилей аудита безопасности
Для выполнения аудита безопасности нужно ассоциировать объекты моделей безопасности с профилем (профилями) аудита безопасности. Профиль аудита безопасности (далее также профиль аудита) объединяет в себе конфигурации аудита безопасности (далее также конфигурации аудита), каждая из которых задает объекты моделей безопасности, покрываемые аудитом, а также условия выполнения аудита. Можно задать глобальный профиль аудита (подробнее см. "Описание глобальных параметров политики безопасности решения на базе KasperskyOS") и/или назначить профиль (профили) аудита на уровне привязок методов моделей безопасности к событиям безопасности, и/или назначить профиль (профили) аудита на уровне match-секций или choice-секций (подробнее см. "Привязка методов моделей безопасности к событиям безопасности").
Независимо от того, используются профили аудита или нет, данные аудита содержат сведения о решениях "запрещено", которые приняты модулем безопасности Kaspersky Security Module при некорректности IPC-сообщений и обработке событий безопасности, не связанных ни с одним правилом моделей безопасности.
Чтобы описать профиль аудита безопасности, нужно использовать декларацию:
audit profile <имя профиля аудита безопасности> =
{ <уровень аудита безопасности> :
// Описание конфигурации аудита безопасности
{ <имя объекта модели безопасности> :
{ kss : <условия выполнения аудита безопасности, связанные с результатами
вызовов правил модели безопасности>
[, условия выполнения аудита безопасности, специфичные для модели безопасности]
}
[,]...
...
}
[,]...
...
}
Уровень аудита безопасности
Уровень аудита безопасности (далее уровень аудита) является глобальным параметром политики безопасности решения и представляет собой беззнаковое целое число, которое задает активную конфигурацию аудита безопасности. (Слово "уровень" здесь означает вариант конфигурации и не предполагает обязательной иерархии.) Уровень аудита можно изменять в процессе работы модуля безопасности Kaspersky Security Module. Для этого используется специальный метод модели безопасности Base
, вызываемый при обращении процессов к модулю безопасности через интерфейс безопасности (подробнее см. "Модель безопасности Base"). Начальный уровень аудита задается совместно c глобальным профилем аудита (подробнее см. "Описание глобальных параметров политики безопасности решения на базе KasperskyOS"). В качестве глобального можно явно назначить пустой профиль аудита empty
.
В профиле аудита можно задать несколько конфигураций аудита. В разных конфигурациях можно покрыть аудитом разные объекты моделей безопасности и применить разные условия выполнения аудита. Конфигурации аудита в профиле соответствуют разным уровням аудита. Если в профиле нет конфигурации аудита, соответствующей текущему уровню аудита, модуль безопасности задействует конфигурацию, которая соответствует ближайшему меньшему уровню аудита. Если в профиле нет конфигурации аудита для уровня аудита, равного или ниже текущего, модуль безопасности не будет использовать этот профиль (то есть аудит по этому профилю не будет выполняться).
Уровни аудита можно использовать, например, чтобы регулировать детализацию аудита. Чем выше уровень аудита, тем выше детализация. Чем выше детализация, тем больше объектов моделей безопасности покрывается аудитом и/или меньше ограничений применяется в условиях выполнения аудита.
Другим примером применения уровней аудита является возможность переключать аудит с одной подсистемы на другую (например, переключить аудит, связанный с драйверами, на аудит, связанный с прикладными программами, или аудит, связанный с сетевой подсистемой, на аудит, связанный с графической подсистемой).
Имя объекта модели безопасности
Имя объекта модели безопасности указывается, чтобы методы, которые предоставляются этим объектом, могли быть покрыты аудитом. Эти методы будут покрыты аудитом при их вызовах, если условия выполнения аудита будут соблюдены.
Сведения о решениях модуля безопасности Kaspersky Security Module, содержащиеся в данных аудита, включают как общее решение модуля безопасности, так и результаты вызовов отдельных методов моделей безопасности, покрытых аудитом. Чтобы сведения о решении модуля безопасности попали в данные аудита, нужно, чтобы по крайней мере один метод, вызванный при обработке события безопасности, был покрыт аудитом.
Имена объектов моделей безопасности, как и имена методов, предоставляемых этими объектами, попадают в данные аудита.
Условия выполнения аудита безопасности
Условия выполнения аудита безопасности задаются отдельно для каждого объекта модели безопасности.
Чтобы задать условия выполнения аудита, связанные с результатами вызовов правил моделей безопасности, нужно использовать следующие конструкции:
["granted"]
– аудит выполняется, если правила возвращают результат "разрешено";["denied"]
– аудит выполняется, если правила возвращают результат "запрещено";["granted", "denied"]
– аудит выполняется, если правила возвращают результат "разрешено" или "запрещено";[]
– аудит не выполняется независимо от того, какой результат возвращают правила.
Условия выполнения аудита, связанные с результатами вызовов правил, не применяются к выражениям. Эти условия должны быть заданы (любой возможной конструкцией), даже если модель безопасности содержит только выражения, поскольку этого требует синтаксис языка PSL.
Условия выполнения аудита, специфичные для моделей безопасности, задаются конструкциями, специфичными для этих моделей (подробнее см. "Модели безопасности KasperskyOS"). Эти условия применяются как к правилам, так и к выражениям. Например, таким условием может быть состояние конечного автомата.
Профиль аудита безопасности для тракта аудита безопасности
Тракт аудита безопасности включает ядро, а также процессы Klog
и KlogStorage
, которые соединены IPC-каналами по схеме "ядро – Klog
– KlogStorage
". Методы моделей безопасности, которые связаны с передачей данных аудита через этот тракт, не должны покрываться аудитом. В противном случае это приведет к лавинообразному росту данных аудита, так как передача данных будет порождать новые данные.
Чтобы "подавить" аудит, заданный профилем более широкой области действия (например, глобальным или профилем на уровне привязки методов моделей безопасности к события безопасности), нужно назначить пустой профиль аудита empty
на уровне привязки методов моделей безопасности к событиям безопасности или на уровне match-секции либо choice-секции.
Примеры описаний профилей аудита
См. "Примеры описаний профилей аудита безопасности".
В началоОписание и выполнение тестов политики безопасности решения на базе KasperskyOS
Тестирование политики безопасности решения выполняется, чтобы проверить, разрешает ли политика то, что должна разрешать, и запрещает ли она то, что должна запрещать.
Чтобы описать набор тестов политики безопасности решения, нужно использовать декларацию:
assert "<название набора тестов>" {
// Конструкции на языке PAL (Policy Assertion Language)
[setup {<начальная часть тестов>}]
sequence "<название теста>" {<основная часть теста>}
...
[finally {<конечная часть тестов>}]
}
Можно описать несколько наборов тестов, используя несколько таких деклараций.
Описание набора тестов опционально включает начальную часть тестов и/или конечную часть тестов. Выполнение каждого теста из набора начинается с того, что описано в начальной части, и завершается тем, что описано в конечной части. Это позволяет не описывать повторяющиеся начальные и/или конечные части тестов в каждом тесте.
После выполнения каждого теста все изменения в модуле безопасности Kaspersky Security Module, связанные с выполнением этого теста, "откатываются".
Каждый тест включает один или несколько тестовых примеров.
Тестовые примеры
Тестовый пример ассоциирует описание события безопасности и значения параметров интерфейсного метода с ожидаемым решением модуля безопасности Kaspersky Security Module. Если фактическое решение модуля безопасности совпадает с ожидаемым, тестовый пример проходит, иначе не проходит.
Когда выполняется тест, тестовые примеры выполняются в той последовательности, в которой они описаны. То есть можно проверить, как модуль безопасности обрабатывает последовательность событий безопасности.
Если все тестовые примеры в тесте проходят, тест проходит. Если хотя бы один тестовый пример в тесте не проходит, тест не проходит. Выполнение теста завершается на первом тестовом примере, который не проходит.
Описание тестового примера создается на языке PAL и представляет собой последовательность значений:
[ожидаемое решение модуля безопасности] ["название тестового примера"] <вид события безопасности> <селекторы события безопасности> [{значения параметров интерфейсного метода}]
В качестве ожидаемого решения модуля безопасности можно указать значение grant
("разрешено"), deny
("запрещено") или any
("любое решение"). Если ожидаемое решение модуля безопасности не указано, ожидается решение "разрешено". Если указано значение any
, решение модуля безопасности не влияет на то, проходит тестовый пример или нет. В этом случае тестовый пример может не пройти из-за ошибок обработки IPC-сообщения модулем безопасности (например, при некорректной структуре IPC-сообщения).
О видах и селекторах событий безопасности, а также об ограничениях использования селекторов см. "Привязка методов моделей безопасности к событиям безопасности". Селекторы должны обеспечивать, чтобы описанию события безопасности соответствовали IPC-сообщения одного типа. (В привязках методов моделей безопасности к событиям безопасности селекторы могут не обеспечивать это.)
В описаниях событий безопасности вместо имени класса процессов (и ядра KasperskyOS) нужно указывать SID. Исключение составляют события вида execute
, при наступлении которых SID запускаемого процесса (или ядра) неизвестен. Чтобы сохранить SID процесса или ядра в переменную, нужно использовать оператор <-
в описании тестового примера вида:
<имя переменной> <- execute dst=<имя класса процессов/ядро> ...
Переменной будет присвоено значение SID, даже если запуск процесса заданного класса (или ядра) запрещен тестируемой политикой, но решение "запрещено" является ожидаемым.
В языке PAL поддерживаются сокращенные формы описаний событий безопасности:
security
: <SID процесса
>!
<квалифицированно имя метода интерфейса безопасности
> соответствуетsecurity src=
<SID процесса
>method=
<квалифицированное имя метода интерфейса безопасности
>.request
: <SID клиента
>~>
<SID сервера/ядра
>:
<квалифицированное имя службы.имя метода
> соответствуетrequest src=
<SID клиента
>dst=
<SID сервера/ядра
>endpoint=
<квалифицированное имя службы
>method=
<имя метода
>.response
: <SID клиента
><~
<SID сервера/ядра
>:
<квалифицированное имя службы.имя метода
> соответствуетresponse src=
<SID сервера/ядра
>dst=
<SID клиента
>endpoint=
<квалифицированное имя службы
>method=
<имя метода
>.
Если у интерфейсного метода есть параметры, то их значения задаются разделенными запятой конструкциями:
<имя параметра> : <значение>
Имена и типы параметров должны соответствовать IDL-описанию. Порядок следования параметров не важен.
Пример задания значений параметров
{ param1 : 23, param2 : "bar", param3: { collection : [5,7,12], filehandle : 15 }, param4 : { name : ["foo", "baz" } }
В этом примере через параметр param1
передается число. Через параметр param2
передается строковый буфер. Через параметр param3
передается структура, состоящая из двух полей. Поле collection
содержит массив или последовательность из трех числовых элементов. Поле filehandle
содержит SID. Через параметр param4
передается объединение или структура с одни полем. Поле name
содержит массив или последовательность из двух строковых буферов.
В настоящее время в качестве значения параметра типа Handle
можно указывать только SID, а возможности указать SID совместно с маской прав дескриптора нет. Поэтому нельзя тестировать политику безопасности решения в тех случаях, когда маски прав дескрипторов влияют на решения модуля безопасности.
Примеры описаний тестов политик
См. "Примеры описаний тестов политик безопасности решений на базе KasperskyOS".
Тестовая процедура
Описания тестов помещаются в PSL-файлы, включая те, которые содержат описание политики безопасности решения (например, в файл security.psl
).
Чтобы выполнить тесты, нужно использовать параметр --tests run
при запуске компилятора nk-psl-gen-c
:
$ nk-psl-gen-c --tests run <остальные параметры> security.psl
Также компилятору nk-psl-gen-c
нужно указать следующие сведения:
- Директории, которые содержат вспомогательные файлы из состава KasperskyOS SDK (
common
,sysroot-*-kos/include
,toolchain/include
). Этот набор директорий задается параметрами-I, -include-dir
<путь к файлам
>. - Директории, которые содержат PSL-, IDL-, CDL-, EDL-файлы, относящиеся к решению. Этот набор директорий задается параметрами
-I, --include-dir
<путь к файлам
>. - Путь к файлу, в который будет сохранен исходный код модуля безопасности Kaspersky Security Module и тестов. Этот путь задается параметром
-o, --output
<путь к файлу
>.
Компилятор nk-psl-gen-c
генерирует исходный код модуля безопасности и тестов на языке C, сохраняет его в файл, а затем запускает компиляцию этого кода с использованием gcc и выполнение полученной тестовой программы. Тестовая программа запускается в среде, где установлен KasperskyOS SDK, то есть на компьютере под управлением ОС Linux. Ядро KasperskyOS, а также системное и прикладное ПО решения не используются.
Чтобы сгенерировать исходный код модуля безопасности и тестов, но не компилировать его, нужно использовать параметр --tests generate
при запуске компилятора nk-psl-gen-c
.
По умолчанию результаты тестирования выводятся в консоль. Чтобы вывести результаты тестирования в файл, нужно использовать параметр --test-output
<путь к файлу
> при запуске компилятора nk-psl-gen-c
.
Пример результатов тестирования:
# PAL test run
## Execute (1/2)
* Happy path: FAIL
Step 2/2: ExpectGrant Execute "This should not fail"
component/secure_platform/kss/nk/psl/nk-psl-gen-c/tests/examples/include/router.psl:38:5-40:3
* No rule: PASS
## IPC (2/2)
* Happy path: PASS
* No rule: PASS
## Security (2/2)
* Happy path: PASS
* No rule: PASS
Результаты тестирования содержат сведения о том, прошел или не прошел каждый тест. Если тест не прошел, то указывается, какой тестовый пример из этого теста не прошел, а также сведения о размещении описания непрошедшего тестового примера в PSL-файле.
В началоТипы данных в языке PSL
Типы данных, поддерживаемые в языке PSL, приведены в таблице ниже.
Типы данных в языке PSL
Обозначения типов |
Описание типов |
---|---|
|
Беззнаковое целое число |
|
Знаковое целое число |
|
Логический тип Логический тип включает два значения: |
|
Текстовый тип |
|
Тип Тип |
|
Текстовый литерал Текстовый литерал включает одно неизменяемое текстовое значение. Примеры определений текстовых литералов:
|
< |
Целочисленный литерал Целочисленный литерал включает одно неизменяемое целочисленное значение. Примеры определений числовых литералов:
|
< |
Вариантный тип Вариантный тип объединяет два и более типов и может выступать в роли любого из них. Примеры определений вариантных типов:
|
|
Словарь Словарь состоит из полей одного или нескольких типов. Словарь может быть пустым. Примеры определений словарей:
|
|
Кортеж Кортеж состоит из полей одного или нескольких типов, расположенных в порядке перечисления типов. Кортеж может быть пустым. Примеры определений кортежей:
|
|
Множество Множество включает ноль и более уникальных элементов одного типа. Примеры определений множеств:
|
|
Список Список включает ноль и более элементов одного типа. Примеры определений списков:
|
|
Ассоциативный массив Ассоциативный массив включает ноль и более записей типа "ключ-значение" с уникальными ключами. Пример определения ассоциативного массива:
|
|
Массив Массив включает заданное число элементов одного типа. Пример определения массива:
|
|
Последовательность Последовательность включает от ноля до заданного числа элементов одного типа. Пример определения последовательности:
|
Псевдонимы некоторых типов PSL
В файле nk/base.psl
из состава KasperskyOS SDK определены типы данных, которые используются как типы параметров (или структурных элементов параметров) и возвращаемых значений для методов разных моделей безопасности. Псевдонимы и определения этих типов приведены в таблице ниже.
Псевдонимы и определения некоторых типов данных в языке PSL
Псевдоним типа |
Определение типа |
---|---|
|
Беззнаковое целое число
|
|
Знаковое целое число
|
|
Целое число
|
|
Скалярный литерал
|
|
Литерал
|
|
Тип идентификатора безопасности SID
|
|
Тип идентификатора безопасности SID
|
|
Словарь, содержащий поля для SID и маски прав дескриптора
|
|
Тип данных, принимаемых выражениями моделей безопасности, вызываемыми в конструкции
|
|
Тип данных, задающих условия выполнения аудита безопасности
|
Отображение типов IDL на типы PSL
Для описания параметров интерфейсных методов используются типы данных языка IDL. Входные данные для методов моделей безопасности имеют типы из языка PSL. Набор типов данных в языке IDL отличается от набора типов данных в языке PSL. Поскольку параметры интерфейсных методов, передаваемые в IPC-сообщениях, могут использоваться как входные данные для методов моделей безопасности, разработчику описания политики нужно понимать, как типы IDL отображаются на типы PSL.
Целочисленные типы IDL отображаются на целочисленные типы PSL, а также на вариантные типы PSL, объединяющие эти целочисленные типы (в том числе с другими типами). Например, знаковые целочисленные типы IDL отображаются на тип Signed
в PSL, целочисленные типы IDL отображаются на тип ScalarLiteral
в PSL.
Тип Handle
в IDL отображается на тип HandleDesc
в PSL.
Объединения и структуры IDL отображаются на словари PSL.
Массивы и последовательности IDL отображаются на массивы и последовательности PSL соответственно.
Строковые буферы в IDL отображаются на текстовый тип PSL.
В настоящее время байтовые буферы в IDL не отображаются на типы PSL. Соответственно, данные, содержащиеся в байтовых буферах, не могут использоваться как входы для методов моделей безопасности.
В началоПримеры привязок методов моделей безопасности к событиям безопасности
Перед тем как рассматривать примеры, нужно ознакомиться со сведениями о модели безопасности Base.
Обработка инициации запусков процессов
/* Ядру KasperskyOS и любому процессу
* в решении разрешено запускать любой
* процесс. */
execute { grant () }
/* Ядру разрешено запускать процесс
* класса Einit. */
execute src=kl.core.Core, dst=Einit { grant () }
/* Процессу класса Einit разрешено
* запускать любой процесс в решении. */
execute src=Einit { grant () }
Обработка запуска ядра KasperskyOS
/* Ядру KasperskyOS разрешено запускаться.
* (Эта привязка нужна, чтобы сообщить модулю
* безопасности SID ядра. Ядро запускается независимо
* от того, разрешено ли это политикой безопасности решения
* или нет. Если политика безопасности решения запрещает
* запуск ядра, после запуска ядро прекратит свое
* исполнение.) */
execute src=kl.core.Core, dst=kl.core.Core { grant () }
Обработка отправки IPC-запросов
/* Любому клиенту в решении разрешено обращаться к
* любому серверу и ядру KasperskyOS. */
request { grant () }
/* Клиенту класса Client разрешено обращаться
* к любому серверу в решении и ядру. */
request src=Client { grant () }
/* Любому клиенту в решении разрешено обращаться
* к серверу класса Server. */
request dst=Server { grant () }
/* Клиенту класса Client запрещено
* обращаться к серверу класса Server. */
request src=Client dst=Server { deny () }
/* Клиенту класса Client разрешено
* обращаться к серверу класса Server,
* вызывая метод Ping службы net.Net. */
request src=Client dst=Server endpoint=net.Net method=Ping {
grant ()
}
/* Любому клиенту в решении разрешено обращаться
* к серверу класса Server, вызывая метод Send
* службы с интерфейсом MessExch. */
request dst=Server interface=MessExch method=Send {
grant ()
}
Обработка отправки IPC-ответов
/* Серверу класса Server разрешено отвечать на
* обращения клиента класса Client, который
* вызывает метод Ping службы net.Net. */
response src=Server, dst=Client, endpoint=net.Net, method=Ping {
grant ()
}
/* Серверу, который содержит компонент kl.drivers.KIDF,
* предоставляющий службы с интерфейсом monitor, разрешено
* отвечать на обращения клиента класса DriverManager,
* который использует эти службы. */
response dst=DriverManager component=kl.drivers.KIDF interface=monitor {
grant ()
}
Обработка отправки IPC-ответов, содержащих сведения об ошибках
/* Серверу класса Server запрещено сообщать клиенту
* класса Client об ошибках, которые возникают,
* когда клиент обращается к серверу, вызывая метод
* Ping службы net.Net. */
error src=Server, dst=Client, endpoint=net.Net, method=Ping {
deny ()
}
Обработка обращений процессов к модулю безопасности Kaspersky Security Module
/* Процесс класса Sdcard получит решение
* "разрешено" от модуля безопасности Kaspersky Security Module,
* вызывая метод Register интерфейса безопасности.
* (Используется интерфейс безопасности, заданный
* в EDL-описании.) */
security src=Sdcard, method=Register {
grant ()
}
/* Процесс класса Sdcard получит решение "запрещено"
* от модуля безопасности, вызывая метод Comp.Register
* интерфейса безопасности. (Используется интерфейс
* безопасности, заданный в CDL-описании.) */
security src=Sdcard, method=Comp.Register {
deny ()
}
Использование match-секций
/* Клиенту класса Client разрешено обращаться к
* серверу класса Server, вызывая методы Send
* и Receive службы net. */
request src=Client, dst=Server, endpoint=net {
match method=Send { grant () }
match method=Receive { grant () }
}
/* Клиенту класса Client разрешено обращаться к
* серверу класса Server, вызывая методы Send
* и Receive службы sn.Net и методы Write и
* Read службы sn.Storage. */
request src=Client, dst=Server {
match endpoint=sn.Net {
match method=Send { grant () }
match method=Receive { grant () }
}
match endpoint=sn.Storage {
match method=Write { grant () }
match method=Read { grant () }
}
}
Задание профилей аудита
/* Задание глобального профиля аудита default
* и начального уровня аудита 0 */
audit default = global 0
request src=Client, dst=Server {
/* Задание профиля аудита parent на уровне
* привязки методов моделей безопасности к
* событиям безопасности */
audit parent
match endpoint=net.Net, method=Send {
/* Задание профиля аудита child на
* на уровне match-секции */
audit child
grant ()
}
/* В этой match-секции применяется профиль
* аудита parent. */
match endpoint=net.Net, method=Receive {
grant ()
}
}
/* В этой привязке метода модели безопасности
* к событию безопасности применяется профиль
* аудита global. */
response src=Client, dst=Server {
grant ()
}
Примеры описаний простейших политик безопасности решений на базе KasperskyOS
Перед тем как рассматривать примеры, нужно ознакомиться со сведениями о моделях безопасности Struct, Base и Flow.
Пример 1
Политика безопасности решения в этом примере разрешает любые взаимодействия процессов классов Client
, Server
и Einit
между собой и с ядром KasperskyOS. При обращении процессов к модулю безопасности Kaspersky Security Module всегда будет получено решение "разрешено". Эту политику можно использовать только в качестве заглушки на ранних стадиях разработки решения на базе KasperskyOS, чтобы модуль безопасности Kaspersky Security Module "не мешал" взаимодействиям. В реальном решении на базе KasperskyOS применять такую политику недопустимо.
security.psl
execute: kl.core.Execute
use nk.base._
use EDL Einit
use EDL Client
use EDL Server
use EDL kl.core.Core
execute { grant () }
request { grant () }
response { grant () }
error { grant () }
security { grant () }
Пример 2
Политика безопасности решения в этом примере накладывает ограничения на обращения клиентов класса FsClient
к серверам класса FsDriver
. Когда клиент открывает ресурс, управляемый сервером класса FsDriver
, с этим ресурсом ассоциируется конечный автомат в состоянии unverified
. Клиенту класса FsClient
разрешено читать данные из ресурса, управляемого сервером класса FsDriver
, только если конечный автомат, ассоциированный с этим ресурсом, находится в состоянии verified
. Чтобы перевести конечный автомат, ассоциированный с ресурсом, из состояния unverified
в состояние verified
, процессу класса FsVerifier
нужно обратиться к модулю безопасности Kaspersky Security Module.
В реальном решении на базе KasperskyOS эту политику применять нельзя, поскольку разрешено избыточное множество взаимодействий процессов между собой и с ядром KasperskyOS.
security.psl
execute: kl.core.Execute
use nk.base._
use nk.flow._
use nk.basic._
policy object file_state : Flow {
type States = "unverified" | "verified"
config = {
states : ["unverified" , "verified"],
initial : "unverified",
transitions : {
"unverified" : ["verified"],
"verified" : []
}
}
}
execute { grant () }
request { grant () }
response { grant () }
use EDL kl.core.Core
use EDL Einit
use EDL FsClient
use EDL FsDriver
use EDL FsVerifier
response src=FsDriver, endpoint=operationsComp.operationsImpl, method=Open {
file_state.init {sid: message.handle.handle}
}
request src=FsClient, dst=FsDriver, endpoint=operationsComp.operationsImpl, method=Read {
file_state.allow {sid: message.handle.handle, states: ["verified"]}
}
security src=FsVerifier, method=Approve {
file_state.enter {sid: message.handle.handle, state: "verified"}
}
Примеры описаний профилей аудита безопасности
Перед тем как рассматривать примеры, нужно ознакомиться со сведениями о моделях безопасности Base, Regex и Flow.
Пример 1
// Описание профиля аудита безопасности trace
// base – объект модели безопасности Base
// session – объект модели безопасности Flow
audit profile trace =
/* Если уровень аудита равен 0, аудитом покрываются
* правила объекта base, когда эти правила возвращают
* результат "запрещено". */
{ 0 :
{ base :
{ kss : ["denied"]
}
}
/* Если уровень аудита равен 1, аудитом покрываются методы
* объекта session в следующих случаях:
* 1. Правила объекта session возвращают результат "разрешено"
* или "запрещено", и конечный автомат находится в состоянии,
* отличном от closed.
* 2. Выражение query объекта session вызывается, и конечный
* автомат находится в состоянии, отличном от closed. */
, 1 :
{ session :
{ kss : ["granted", "denied"]
, omit : ["closed"]
}
}
/* Если уровень аудита равен 2, аудитом покрываются методы
* объекта session в следующих случаях:
* 1. Правила объекта session возвращают результат "разрешено"
* или "запрещено".
* 2. Выражение query объекта session вызывается. */
, 2 :
{ session :
{ kss : ["granted", "denied"]
}
}
}
Пример 2
// Описание профиля аудита безопасности test
// base – объект модели безопасности Base
// re – объект модели безопасности Regex
audit profile test =
/* Если уровень аудита равен 0, правила объекта base
* и выражения объекта re не покрываются аудитом. */
{ 0 :
{ base :
{ kss : []
}
, re :
{ kss : []
, emit : []
}
}
/* Если уровень аудита равен 1, правила объекта
* base не покрываются аудитом, выражения объекта
* re покрываются аудитом.*/
, 1 :
{ base :
{ kss : []
}
, re :
{ kss : []
, emit : ["match", "select"]
}
}
/* Если уровень аудита равен 2, правила объекта base
* и выражения объекта re покрываются аудитом. Правила
* объекта base покрываются аудитом независимо от
* результата, который они возвращают.*/
, 2 :
{ base :
{ kss : ["granted", "denied"]
}
, re :
{ kss : []
, emit : ["match", "select"]
}
}
}
Примеры описаний тестов политик безопасности решений на базе KasperskyOS
Пример 1
/* Описание набора тестов, который включает один тест. */
assert "some tests" {
/* Описание теста, который включает четыре тестовых примера. */
sequence "first sequence" {
/* Ожидается, что запуск процесса класс Server разрешен.
* Если это так, переменной s будет присвоено значение SID
* запущенного процесса класса Server. */
s <- execute dst=Server
/* Ожидается, что запуск процесса класс Client разрешен.
* Если это так, переменной c будет присвоено значение SID
* запущенного процесса класса Client. */
c <- execute dst=Client
/* Ожидается, что клиенту класса Client разрешено обращаться к
* серверу класса Server, вызывая метод Ping службы pingComp.pingImpl
* с параметром value, равным 100. */
grant "Client calls Ping" request src=c dst=s endpoint=pingComp.pingImpl
method=Ping { value : 100 }
/* Ожидается, что серверу класса Server запрещено отвечать клиенту
* класса Client, если клиент вызывает метод Ping службы pingComp.pingImpl.
* (IPC-ответ не содержит параметров, так как интерфейсный метод Ping
* не имеет выходных параметров.) */
deny "Server cannot respond" response src=s dst=c endpoint=pingComp.pingImpl
method=Ping {}
}
}
Пример 2
/* Описание набора тестов, который включает два теста. */
assert "ping tests"{
/* Начальная часть каждого из двух тестов */
setup {
s <- execute dst=Server
c <- execute dst=Client
}
/* Описание теста, который включает два тестовых примера. */
sequence "ping-ping is denied" {
/* Ожидается, что клиенту класса Client разрешено обращаться к
* серверу класса Server, вызывая метод Ping службы pingComp.pingImpl
* с параметром value, равным 100. */
c ~> s : pingComp.pingImpl.Ping { value : 100 }
/* Ожидается, что клиенту класса Client запрещено обращаться к
* серверу класса Server, повторно вызывая метод Ping службы pingComp.pingImpl
* с параметром value, равным 100. */
deny c ~> s : pingComp.pingImpl.Ping { value : 100 }
}
/* Описание теста, который включает два тестовых примера. */
sequence "ping-pong is granted" {
/* Ожидается, что клиенту класса Client разрешено обращаться к
* серверу класса Server, вызывая метод Ping службы pingComp.pingImpl
* с параметром value, равным 100. */
c ~> s : pingComp.pingImpl.Ping { value: 100 }
/* Ожидается, что клиенту класса Client разрешено обращаться к
* серверу класса Server, вызывая метод Pong службы pingComp.pingImpl
* с параметром value, равным 100. */
c ~> s : pingComp.pingImpl.Pong { value: 100 }
}
}
Пример 3
/* Описание набора тестов, который включает один тест. */
assert {
/* Описание теста, который включает восемь тестовых примеров. */
sequence {
storage <− execute dst=test.kl.UpdateStorage
manager <− execute dst=test.kl.UpdateManager
deployer <− execute dst=test.kl.UpdateDeployer
downloader <− execute dst=test.kl.UpdateDownloader
grant manager ~>
downloader:UpdateDownloader.Downloader.LoadPackage { url : ”url012345678” }
grant response src=downloader dst=manager endpoint=UpdateDownloader.Downloader
method=LoadPackage { handle : 29, result : 1 }
deny manager ~> deployer:UpdateDeployer.Deployer.Start { handle : 29 }
deny request src=manager dst=deployer endpoint=UpdateDeployer.Deployer
method=Start { handle : 29 }
}
}
Модель безопасности Pred
Модель безопасности Pred позволяет выполнять операции сравнения.
PSL-файл с описанием модели безопасности Pred находится в KasperskyOS SDK по пути:
toolchain/include/nk/basic.psl
Объект модели безопасности Pred
В файле basic.psl
содержится декларация, которая создает объект модели безопасности Pred с именем pred
. Соответственно, включение файла basic.psl
в описание политики безопасности решения обеспечивает создание объекта модели безопасности Pred по умолчанию.
Объект модели безопасности Pred не имеет параметров и не может быть покрыт аудитом безопасности.
Создавать дополнительные объекты модели безопасности Pred не требуется.
Методы модели безопасности Pred
Модель безопасности Pred содержит выражения, которые выполняют операции сравнения и возвращают значения типа Boolean
. Для вызова этих выражений нужно использовать операторы сравнения:
- <
ScalarLiteral
>==
<ScalarLiteral
> – "равно"; - <
ScalarLiteral
>!=
<ScalarLiteral
> – "не равно"; - <
Number
><
<Number
> – "меньше"; - <
Number
><=
<Number
> – "меньше или равно"; - <
Number
>>
<Number
> – "больше"; - <
Number
>>=
<Number
> – "больше или равно".
Также модель безопасности Pred содержит выражение empty
, которое позволяет определить, содержат ли данные свои структурные элементы. Выражение возвращает значения типа Boolean
. Если данные не содержат своих структурных элементов (например, множество является пустым), выражение возвращает true
, иначе возвращает false
. Чтобы вызвать выражение, нужно использовать конструкцию:
pred.empty <Text | Set | List | Map | ()>
Модель безопасности Bool
Модель безопасности Bool позволяет выполнять логические операции.
PSL-файл с описанием модели безопасности Bool находится в KasperskyOS SDK по пути:
toolchain/include/nk/basic.psl
Объект модели безопасности Bool
В файле basic.psl
содержится декларация, которая создает объект модели безопасности Bool с именем bool
. Соответственно, включение файла basic.psl
в описание политики безопасности решения обеспечивает создание объекта модели безопасности Bool по умолчанию.
Объект модели безопасности Bool не имеет параметров и не может быть покрыт аудитом безопасности.
Создавать дополнительные объекты модели безопасности Bool не требуется.
Методы модели безопасности Bool
Модель безопасности Bool содержит выражения, которые выполняют логические операции и возвращают значения типа Boolean
. Для вызова этих выражений нужно использовать логические операторы:
!
<Boolean
> – "логическое НЕ";- <
Boolean
>&&
<Boolean
> – "логическое И"; - <
Boolean
>||
<Boolean
> – "логическое ИЛИ"; - <
Boolean
>==>
<Boolean
> – "импликация" (!
<Boolean
>||
<Boolean
>).
Также модель безопасности Bool содержит выражения all
, any
и cond
.
Выражение all
выполняет "логическое И" для произвольного числа значений типа Boolean
. Возвращает значения типа Boolean
. Если передать через параметр пустой список значений ([]
), возвращает true
. Чтобы вызвать выражение, нужно использовать конструкцию:
bool.all <List<Boolean>>
Выражение any
выполняет "логическое ИЛИ" для произвольного числа значений типа Boolean
. Возвращает значения типа Boolean
. Если передать через параметр пустой список значений ([]
), возвращает false
. Чтобы вызвать выражение, нужно использовать конструкцию:
bool.any <List<Boolean>>
Выражение cond
выполняет тернарную условную операцию. Возвращает значения типа ScalarLiteral
. Чтобы вызвать выражение, нужно использовать конструкцию:
bool.cond
{ if : <Boolean> // Условие
, then : <ScalarLiteral> // Значение, возвращаемое при истинности условия
, else : <ScalarLiteral> // Значение, возвращаемое при ложности условия
}
Помимо выражений модель безопасности Bool включает правило assert
, которое работает так же, как одноименное правило модели безопасности Base.
Модель безопасности Math
Модель безопасности Math позволяет выполнять операции целочисленной арифметики.
PSL-файл с описанием модели безопасности Math находится в KasperskyOS SDK по пути:
toolchain/include/nk/basic.psl
Объект модели безопасности Math
В файле basic.psl
содержится декларация, которая создает объект модели безопасности Math с именем math
. Соответственно, включение файла basic.psl
в описание политики безопасности решения обеспечивает создание объекта модели безопасности Math по умолчанию.
Объект модели безопасности Math не имеет параметров и не может быть покрыт аудитом безопасности.
Создавать дополнительные объекты модели безопасности Math не требуется.
Методы модели безопасности Math
Модель безопасности Math содержит выражения, которые выполняют операции целочисленной арифметики. Для вызова части этих выражений нужно использовать арифметические операторы:
- <
Number
>+
<Number
> – "сложение". Возвращает значения типаNumber
. - <
Number
>-
<Number
> – "вычитание". Возвращает значения типаNumber
. - <
Number
>*
<Number
> – "умножение". Возвращает значения типаNumber
.
Другая часть включает следующие выражения:
neg
<Signed
> – "изменение знака числа". Возвращает значения типаSigned
.abs
<Signed
> – "получение модуля числа". Возвращает значения типаSigned
.sum
<List<Number>
> – "сложение чисел из списка". Возвращает значения типаNumber
. Если передать через параметр пустой список значений ([]
), возвращает0
.product
<List<Number>
> – "перемножение чисел из списка". Возвращает значения типаNumber
. Если передать через параметр пустой список значений ([]
), возвращает1
.
Для вызова этих выражений нужно использовать конструкцию:
math.<имя выражения> <параметр>
Модель безопасности Struct
Модель безопасности Struct позволяет получать доступ к структурным элементам данных.
PSL-файл с описанием модели безопасности Struct находится в KasperskyOS SDK по пути:
toolchain/include/nk/basic.psl
Объект модели безопасности Struct
В файле basic.psl
содержится декларация, которая создает объект модели безопасности Struct с именем struct
. Соответственно, включение файла basic.psl
в описание политики безопасности решения обеспечивает создание объекта модели безопасности Struct по умолчанию.
Объект модели безопасности Struct не имеет параметров и не может быть покрыт аудитом безопасности.
Создавать дополнительные объекты модели безопасности Struct не требуется.
Методы модели безопасности Struct
Модель безопасности Struct содержит выражения, которые обеспечивают доступ к структурным элементам данных. Для вызова этих выражений нужно использовать следующие конструкции:
- <
{...}
>.
<имя поля
> – "получение доступа к полю словаря". Тип возвращаемых данных соответствует типу поля словаря. - <
List | Set | Sequence | Array
>.[
<номер элемента
>]
– "получение доступа к элементу данных". Тип возвращаемых данных соответствует типу элементов. Нумерация элементов начинается с нуля. При выходе за границы набора данных выражение завершается некорректно, и модуль безопасности Kaspersky Security Module возвращает решение "запрещено". - <
HandleDesc
>.handle
– "получение SID". Возвращает значения типаHandle
. (О взаимосвязи между дескрипторами и значениями SID см. "Управление доступом к ресурсам"). - <
HandleDesc
>.rights
– "получение маски прав дескриптора". Возвращает значения типаUInt32
.
Параметры интерфейсных методов сохраняются в специальном словаре message
. Чтобы получить доступ к параметру интерфейсного метода, нужно использовать конструкцию:
message.<имя параметра интерфейсного метода>
Имя параметра нужно указать в соответствии с IDL-описанием.
Чтобы получить доступ к структурным элементам параметров, нужно использовать конструкции, соответствующие выражениям модели безопасности Struct.
Чтобы использовать выражения модели безопасности Struct, описание события безопасности должно быть настолько точным, чтобы ему соответствовали IPC-сообщения одного типа (подробнее см. "Привязка методов моделей безопасности к событиям безопасности"). IPC-сообщения этого типа должны содержать заданные параметры интерфейсного метода, и параметры интерфейсного метода должны содержать заданные структурные элементы.
Модель безопасности Base
Модель безопасности Base позволяет реализовать простейшую логику.
PSL-файл с описанием модели безопасности Base находится в KasperskyOS SDK по пути:
toolchain/include/nk/base.psl
Объект модели безопасности Base
В файле base.psl
содержится декларация, которая создает объект модели безопасности Base с именем base
. Соответственно, включение файла base.psl
в описание политики безопасности решения обеспечивает создание объекта модели безопасности Base по умолчанию. Методы этого объекта можно вызывать без указания имени объекта.
Объект модели безопасности Base не имеет параметров.
Объект модели безопасности Base может быть покрыт аудитом безопасности. Условия выполнения аудита, специфичные для модели безопасности Base, отсутствуют.
Необходимость создавать дополнительные объекты модели безопасности Base возникает в следующих случаях:
- Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности Base (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
- Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности Base (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
Методы модели безопасности Base
Модель безопасности Base содержит следующие правила:
grant ()
Имеет параметр типа
()
. Возвращает результат "разрешено".Пример:
/* Клиенту класса foo разрешено
* обращаться к серверу класса bar. */
request src=foo dst=bar { grant () }
assert
<Boolean
>Возвращает результат "разрешено", если через параметр передать значение
true
. Иначе возвращает результат "запрещено".Пример:
/* Любому клиенту в решении будет разрешено обращаться к серверу класса
* foo, вызывая метод Send службы net.Net, если через параметр port
* метода Send будет передаваться значение больше 80. Иначе любому
* клиенту в решении будет запрещено обращаться к серверу класса
* foo, вызывая метод Send службы net.Net. */
request dst=foo endpoint=net.Net method=Send { assert (message.port > 80) }
deny
<Boolean | ()
>Возвращает результат "запрещено", если через параметр передать значение
true
или()
. Иначе возвращает результат "разрешено".Пример:
/* Серверу класса foo запрещено
* отвечать клиенту класса bar. */
response src=foo dst=bar { deny () }
set_level
<UInt8
>Устанавливает уровень аудита безопасности равным значению, переданному через параметр. Возвращает результат "разрешено". (Подробнее об уровне аудита безопасности см. "Описание профилей аудита безопасности".)
Пример:
/* Процесс класса foo получит решение "разрешено" от модуля
* безопасности Kaspersky Security Module, если вызовет метод интерфейса безопасности
* SetAuditLevel, чтобы изменить уровень аудита безопасности. */
security src=foo method=SetAuditLevel { set_level (message.audit_level) }
Модель безопасности Regex
Модель безопасности Regex позволяет реализовать валидацию текстовых данных по статически заданным регулярным выражениям.
PSL-файл с описанием модели безопасности Regex находится в KasperskyOS SDK по пути:
toolchain/include/nk/regex.psl
Объект модели безопасности Regex
В файле regex.psl
содержится декларация, которая создает объект модели безопасности Regex с именем re
. Соответственно, включение файла regex.psl
в описание политики безопасности решения обеспечивает создание объекта модели безопасности Regex по умолчанию.
Объект модели безопасности Regex не имеет параметров.
Объект модели безопасности Regex может быть покрыт аудитом безопасности. При этом нужно задать условия выполнения аудита, специфичные для модели безопасности Regex. Для этого в описании конфигурации аудита нужно использовать следующие конструкции:
emit : ["match"]
– аудит выполняется, если вызван методmatch
;emit : ["select"]
– аудит выполняется, если вызван методselect
;emit : ["match", "select"]
– аудит выполняется, если вызван методmatch
илиselect
;emit : []
– аудит не выполняется.
Необходимость создавать дополнительные объекты модели безопасности Regex возникает в следующих случаях:
- Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности Regex (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
- Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности Regex (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
Методы модели безопасности Regex
Модель безопасности Regex
содержит следующие выражения:
match {text :
<Text
>, pattern :
<Text
>}
Возвращает значение типа
Boolen
. Если текстtext
соответствует регулярному выражениюpattern
, возвращаетtrue
. Иначе возвращаетfalse
.Пример:
assert (re.match {text : message.text, pattern : "[0-9]*"})
select {text :
<Text
>}
Предназначено для использования в качестве выражения, проверяющего выполнение условий в конструкции
choice
(о конструкцииchoice
см. "Привязка методов моделей безопасности к событиям безопасности"). Проверяет соответствие текстаtext
регулярным выражениям. В зависимости от результатов этой проверки выполняются различные варианты обработки события безопасности.Пример:
choice (re.select {text : "hello world"}) {
"hello\ .*": grant ()
".*world" : grant ()
_ : deny ()
}
Синтаксис регулярных выражений модели безопасности Regex
Регулярное выражение для метода match
модели безопасности Regex можно записать двумя способами: внутри многострочного блока regex
или как текстовый литерал.
При записи регулярного выражения как текстового литерала все вхождения обратного слеша необходимо удвоить.
Например, два регулярных выражения идентичны:
// Регулярное выражение внутри многострочного блока regex
{ pattern:
```regex
Hello\ world\!
```
, text: "Hello world!"
}
// Регулярное выражение как текстовый литерал (обратный слеш удвоен)
{ pattern: "Hello\\ world\\!"
, text: "Hello world!"
}
Регулярные выражения для метода select
модели безопасности Regex записываются как текстовые литералы с удвоением обратного слеша.
Регулярное выражение задается в виде строки-шаблона и может содержать:
- литералы (обычные символы);
- метасимволы (символы со специальными значениями);
- пробельные символы;
- наборы символов;
- группы символов;
- операторы для работы с символами.
Регулярные выражения чувствительны к регистру.
Литералы и метасимволы в регулярных выражениях
- Литералом является любой ASCII-символ, за исключением метасимволов
.()*&|!?+[]\
и знака пробела. (Символы Unicode не поддерживаются.)Например, регулярному выражению
KasperskyOS
соответствует текстKasperskyOS
. - Метасимволы имеют специальные значения, которые приведены в таблице ниже.
Специальные значения метасимволов
Метасимвол
Специальное значение
[]
Квадратные скобки обозначают начало и конец набора символов.
()
Круглые скобки обозначают начало и конец группы символов.
*
Звездочка обозначает оператор, определяющий, что символ, который ему предшествует, может повторяться ноль или больше раз.
+
Плюс обозначает оператор, определяющий, что символ, который ему предшествует, может повторяться один или больше раз.
?
Вопрос обозначает оператор, определяющий, что символ, который ему предшествует, может повторяться ноль или один раз.
!
Восклицательный знак обозначает оператор, исключающий последующий символ из списка допустимых символов.
|
Вертикальная черта обозначает оператор выбора между символами (близок по смыслу к союзу "ИЛИ").
&
Амперсанд обозначает оператор пересечения нескольких условий (близок по смыслу к союзу "И").
.
Точка обозначает соответствие любому символу.
Например, регулярному выражению
K.S
соответствуют последовательности символов:KОS
,KoS
,KES
и множество других последовательностей из трех символов, которые начинаются наK
и заканчиваются наS
, и где второй символ может быть любым: литералом, метасимволом или самой точкой.\
\
<metaSymbol
>Обратный слеш указывает, что следующий за ним метасимвол будет интерпретирован как литерал и потеряет свое специальное значение. Добавление обратного слеша перед метасимволом называется экранированием метасимвола.
Например, регулярному выражению, которое состоит из метасимвола точки
.
, соответствует любой символ, а регулярному выражению, которое состоит из обратного слеша с точкой\.
, соответствует только сам символ точки.Аналогично обратный слеш действует и на самого себя. Регулярному выражению
С:\\Users
соответствует последовательность символовC:\Users
. - Символы
^
и$
как обозначения начала и конца строки не используются.
Пробельные символы в регулярных выражениях
- Знак пробела имеет ASCII-код, равный
20
, в шестнадцатеричной системе счисления и ASCII-код, равный40
, в восьмеричной системе счисления. Знак пробела не имеет специального значения, но во избежание неоднозначной трактовки данного символа интерпретатором регулярных выражений, пробел необходимо экранировать.Например, регулярному выражению
Hello\ world
соответствует последовательность символовHello world
. \r
Символ возврата каретки.
\n
Символ переноса строки.
\t
Символ горизонтальной табуляции.
Определение символа по его восьмеричному или шестнадцатеричному коду в регулярных выражениях
\x{
<hex
>}
Определение символа его шестнадцатеричным кодом
hex
из таблицы ASCII-символов. Код символа должен быть меньше, чем0x100
.Например, регулярному выражению
Hello\x{20}world
соответствует последовательность символовHello world
.\o{
<octal
>}
Определение символа его восьмеричным кодом
octal
из таблицы ASCII-символов. Код символа должен быть меньше, чем0o400
.Например, регулярному выражению
\o{75}
соответствует символ=
.
Наборы символов в регулярных выражениях
Набор символов задается внутри квадратных скобок []
перечислением или диапазоном символов. Набор символов указывает интерпретатору регулярных выражений, что на этом месте в последовательности символов может стоять только один из перечисленных в наборе или диапазоне символов. Набор символов не может быть пустым.
[
<BracketSpec
>]
– набор символов.Один символ соответствует любому символу из набора символов
BracketSpec
.Например, регулярному выражению
K[OE]S
соответствуют последовательности символовKOS
иKES
.[^
<BracketSpec
>]
– набор символов с инверсией.Один символ соответствует любому символу, не входящему в набор символов
BracketSpec
.Например, регулярному выражению
K[^OE]S
соответствуют последовательности символовKAS
,K8S
и любые другие последовательности из трех символов, которые начинаются наK
и заканчиваются наS
, кромеKОS
иKES
.
Набор символов BracketSpec
может быть перечислен явно или определен как диапазон символов. Чтобы определить диапазон символов, первый и последний символ в наборе разделяют дефисом.
[
<Digit1
>-
<DigitN
>]
Любая цифра из диапазона
Digit1
,Digit2
, ... ,DigitN
.Например, регулярному выражению
[0-9]
соответствует любая цифра. Записи регулярных выражений[0-9]
и[0123456789]
идентичны.Обратите внимание, что диапазон определяется одним символом до и одним символом после дефиса. Регулярному выражению
[1-35]
соответствуют символы1
,2
,3
и5
, а не диапазон чисел от1
до35
.[
<Letter1
>-
<LetterN
>]
Любая латинская буква из диапазона
Letter1
,Letter2
, ... ,LetterN
(буквы должны быть в одинаковых регистрах).Например, регулярному выражению
[a-zA-Z]
соответствуют все буквы в нижнем и верхнем регистре из таблицы ASCII-символов.
ASCII-код символа верхней границы диапазона должен быть больше ASCII-кода символа нижней границы диапазона.
Например, регулярные выражения типа [5-2]
или [z-a]
недопустимы.
Знак дефиса (минуса) -
рассматривается как специальный символ только внутри набора символов. Вне набора символов дефис является литералом, поэтому дефису не обязан предшествовать метасимвол \
. Для использования дефиса как литерала внутри набора символов необходимо указывать его первым или последним в наборе.
Примеры:
Регулярным выражениям [-az]
и [az-]
соответствуют символы a
, z
и -
.
Регулярному выражению [a-z]
соответствует любая из 26 латинских букв от a
до z
в нижнем регистре.
Регулярному выражению [-a-z]
соответствует любая из 26 латинских букв от a
до z
в нижнем регистре и -
.
Циркумфлекс (символ вставки) ^
рассматривается как специальный символ только внутри набора символов, когда он расположен сразу после открывающей квадратной скобки. Вне набора символов циркумфлекс является литералом, поэтому циркумфлексу не обязан предшествовать метасимвол \
. Для использования циркумфлекса как литерала внутри набора символов необходимо указывать его не первым в наборе.
Примеры:
Регулярному выражению [0^9]
соответствуют символы 0
, 9
и ^
.
Регулярному выражению [^09]
соответствует любой символ, кроме 0
и 9
.
Внутри набора символов метасимволы *.&|!?+
теряют свое специальное значение и интерпретируются как литералы, поэтому предварять их метасимволом \
не обязательно. Обратный слеш \
сохраняет свое специальное значение внутри набора символов.
Например, регулярные выражения [a.]
и [a\.]
идентичны, и им соответствуют символ a
и точка как литерал.
Группы символов и операторы в регулярных выражениях
Группа символов выделяет из регулярного выражения его часть (подвыражение) с помощью круглых скобок ()
. Обычно группы используются для выделения подвыражений в качестве операндов. Группы могут быть вложены друг в друга.
Операторы применяются более чем к одному символу в регулярном выражении, только если они стоят сразу перед или после определения набора или группы символов. В этом случае действие оператора распространяется на всю группу или набор символов.
В синтаксисе определены следующие операторы (перечислены в порядке убывания приоритета):
!
<Expression
>, гдеExpression
может быть символом, набором или группой символов.Оператор означает исключение выражения
Expression
из списка допустимых выражений.Примеры:
Регулярному выражению
K!OS
соответствуют последовательности символовKoS
,KES
и множество других последовательностей, которые состоят из трех символов, начинаются наK
и заканчиваются наS
, кромеKОS
.Регулярному выражению
K!(OS)
соответствуют последовательности символовKos
,KES
,KOT
и множество других последовательностей, которые состоят из трех символов и начинаются наK
, кромеKОS
.Регулярному выражению
K![OE]S
соответствуют последовательности символовKoS
,KeS
,K;S
и множество других последовательностей, которые состоят из трех символов, начинаются наK
и заканчиваются наS
, кромеKОS
иKES
.- <
Expression
>*
, гдеExpression
может быть символом, набором или группой символов.Оператор означает, что выражение
Expression
может встретиться в этой позиции ноль или больше раз.Примеры:
Регулярному выражению
0-9*
соответствуют последовательности символов0-
,0-9
,0-99
, ... .Регулярному выражению
(0-9)*
соответствуют пустая последовательность""
и последовательности символов0-9
,0-90-9
, ... .Регулярному выражению
[0-9]*
соответствуют пустая последовательность""
и любая непустая последовательность цифр. - <
Expression
>+
, гдеExpression
может быть символом, набором или группой символов.Оператор означает, что выражение
Expression
может встретиться в этой позиции один или больше раз.Примеры:
Регулярному выражению
0-9+
соответствуют последовательности символов0-9
,0-99
,0-999
, ... .Регулярному выражению
(0-9)+
соответствуют последовательности символов0-9
,0-90-9
, ... .Регулярному выражению
[0-9]+
соответствует любая непустая последовательность цифр. - <
Expression
>?
, гдеExpression
может быть символом, набором или группой символов.Оператор означает, что выражение
Expression
может встретиться в данной позиции ноль или один раз.Примеры:
Регулярному выражению
https?://
соответствуют последовательности символовhttp://
иhttps://
.Регулярному выражению
K(aspersky)?OS
соответствуют последовательности символовKOS
иKasperskyOS
. - <
Expression1
><Expression2
> – конкатенация.Expression1
иExpression2
могут быть символами, наборами или группами символов.Оператор не имеет обозначения. В результирующем выражении за выражением
Expression1
следует выражениеExpression2
.Например, результатом конкатенации последовательностей символов
микро
иядро
будет последовательность символовмикроядро
. - <
Expression1
>|
<Expression2
> – дизъюнкция.Expression1
иExpression2
могут быть символами, наборами или группами символов.Оператор означает выбор выражения
Expression1
или выраженияExpression2
.Примеры:
Регулярному выражению
KO|ES
соответствуют последовательности символовKO
иES
, но неKОS
и неKES,
так как оператор конкатенации имеет приоритет выше, чем оператор дизъюнкции.Регулярному выражению
Press (OK|Cancel)
соответствуют последовательности символовPress OK
илиPress Cancel
.Регулярному выражению
[0-9]|()
соответствуют цифры от0
до9
или пустая строка. - <
Expression1
>&
<Expression2
> – конъюнкция.Expression1
иExpression2
могут быть символами, наборами или группами символов.Оператор означает пересечение результата выражения
Expression1
с результатом выраженияExpression2
.Примеры:
Регулярному выражению
[0-9]&[^3]
соответствуют цифры от0
до9
, кроме3
.Регулярному выражению
[a-zA-Z]&()
соответствуют все латинские буквы и пустая строка.
Модель безопасности HashSet
Модель безопасности HashSet позволяет ассоциировать с ресурсами одномерные таблицы уникальных значений одного типа, добавлять и удалять эти значения, а также проверять, входит ли заданное значение в таблицу. Например, можно ассоциировать процесс, в контексте которого выполняется сетевой сервер, с набором портов, который разрешено открывать этому серверу. Эту ассоциацию можно использовать, чтобы проверить, допустимо ли открытие порта, инициированное сервером.
PSL-файл с описанием модели безопасности HashSet находится в KasperskyOS SDK по пути:
toolchain/include/nk/hashmap.psl
Объект модели безопасности HashSet
Чтобы использовать модель безопасности HashSet, нужно создать объект (объекты) этой модели.
Объект модели безопасности HashSet содержит пул одномерных таблиц одинакового размера, предназначенных для хранения значений одного типа. Ресурс может быть ассоциирован только с одной таблицей из пула таблиц каждого объекта модели безопасности HashSet.
Объект модели безопасности HashSet имеет следующие параметры:
type Entry
– тип значений в таблицах (поддерживаются целочисленные типы, типBoolean
, а также словари и кортежи на базе целочисленных типов и типаBoolean
);config
– конфигурация пула таблиц:set_size
– размер таблицы;pool_size
– число таблиц в пуле.
Все параметры объекта модели безопасности HashSet являются обязательными.
Пример:
policy object S : HashSet {
type Entry = UInt32
config =
{ set_size : 5
, pool_size : 2
}
}
Объект модели безопасности HashSet может быть покрыт аудитом безопасности. Условия выполнения аудита, специфичные для модели безопасности HashSet, отсутствуют.
Необходимость создавать несколько объектов модели безопасности HashSet возникает в следующих случаях:
- Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности HashSet (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
- Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности HashSet (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
- Если нужно использовать таблицы разных размеров и/или с разными типами значений.
Правило init модели безопасности HashSet
init {sid : <Sid>}
Ассоциирует свободную таблицу из пула таблиц с ресурсом sid
. Если свободная таблица содержит значения после предыдущего использования, то эти значения удаляются.
Возвращает результат "разрешено", если создало ассоциацию таблицы с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- В пуле нет свободных таблиц.
- Ресурс
sid
уже ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet. - Значение
sid
вне допустимого диапазона.
Пример:
/* Запуск процесса класса Server будет разрешен, если
* при инициации запуска будет создана ассоциация этого
* процесса с таблицей. Иначе запуск процесса класса
* Server будет запрещен. */
execute dst=Server {
S.init {sid : dst_sid}
}
Правило fini модели безопасности HashSet
fini {sid : <Sid>}
Удаляет ассоциацию таблицы с ресурсом sid
(таблица становится свободной).
Возвращает результат "разрешено", если удалило ассоциацию таблицы с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet. - Значение
sid
вне допустимого диапазона.
Правило add модели безопасности HashSet
add {sid : <Sid>, entry : <Entry>}
Добавляет значение entry
в таблицу, ассоциированную с ресурсом sid
.
Возвращает результат "разрешено" в следующих случаях:
- Правило добавило значение
entry
в таблицу, ассоциированную с ресурсомsid
. - В таблице, ассоциированной с ресурсом
sid
, уже содержится значениеentry
.
Возвращает результат "запрещено" в следующих случаях:
- Таблица, ассоциированная с ресурсом
sid
, полностью заполнена. - Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet. - Значение
sid
вне допустимого диапазона.
Пример:
/* Процесс класса Server получит решение "разрешено" от
* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса
* безопасности Add, если при вызове этого метода значение
* 5 будет добавлено в таблицу, ассоциированную с этим
* процессом, или уже содержится в этой таблице. Иначе
* процесс класса Server получит решение "запрещено" от
* модуля безопасности, вызывая метод интерфейса
* безопасности Add. */
security src=Server, method=Add {
S.add {sid : src_sid, entry : 5}
}
Правило remove модели безопасности HashSet
remove {sid : <Sid>, entry : <Entry>}
Удаляет значение entry
из таблицы, ассоциированной с ресурсом sid
.
Возвращает результат "разрешено" в следующих случаях:
- Правило удалило значение
entry
из таблицы, ассоциированной с ресурсомsid
. - В таблице, ассоциированной с ресурсом
sid
, нет значенияentry
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet. - Значение
sid
вне допустимого диапазона.
Выражение contains модели безопасности HashSet
contains {sid : <Sid>, entry : <Entry>}
Проверяет, содержится ли значение entry
в таблице, ассоциированной с ресурсом sid
.
Возвращает значение типа Boolean
. Если значение entry
содержится в таблице, ассоциированной с ресурсом sid
, возвращает true
. Иначе возвращает false
.
Выполняется некорректно в следующих случаях:
- Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности HashSet. - Значение
sid
вне допустимого диапазона.
Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".
Пример:
/* Процесс класса Server получит решение "разрешено" от
* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса
* безопасности Check, если значение 42 содержится в таблице,
* ассоциированной с этим процессом. Иначе процесс класса
* Server получит решение "запрещено" от модуля безопасности,
* вызывая метод интерфейса безопасности Check. */
security src=Server, method=Check {
assert(S.contains {sid : src_sid, entry : 42})
}
Модель безопасности StaticMap
Модель безопасности StaticMap позволяет ассоциировать с ресурсами двумерные таблицы типа "ключ–значение", читать и изменять значения ключей. Например, можно ассоциировать процесс, в контексте которого выполняется драйвер, с регионом памяти MMIO, который разрешено использовать этому драйверу. Для этого потребуется два ключа, значения которых задают начальный адрес и размер региона памяти MMIO. Эту ассоциацию можно использовать, чтобы проверить, может ли драйвер обращаться к региону памяти MMIO, к которому он пытается получить доступ.
Ключи в таблице имеют одинаковый тип и является уникальными и неизменяемыми. Значения ключей в таблице имеют одинаковый тип.
Одновременно существует два экземпляра таблицы: базовый и рабочий. Оба экземпляра инициализируются одинаковыми данными. Изменения заносятся сначала в рабочий экземпляр, а затем могут быть добавлены в базовый экземпляр или, наоборот, заменены прежними значениями из базового экземпляра. Значения ключей могут быть прочитаны как из базового, так и из рабочего экземпляра таблицы.
PSL-файл с описанием модели безопасности StaticMap находится в KasperskyOS SDK по пути:
toolchain/include/nk/staticmap.psl
Объект модели безопасности StaticMap
Чтобы использовать модель безопасности StaticMap, нужно создать объект (объекты) этой модели.
Объект модели безопасности StaticMap содержит пул двумерных таблиц типа "ключ–значение", которые имеют одинаковый размер. Ресурс может быть ассоциирован только с одной таблицей из пула таблиц каждого объекта модели безопасности StaticMap.
Объект модели безопасности StaticMap имеет следующие параметры:
type Value
– тип значений ключей в таблицах (поддерживаются целочисленные типы);config
– конфигурация пула таблиц:keys
– таблица, содержащая ключи и их значения по умолчанию (ключи имеют типKey = Text | List<UInt8>
);pool_size
– число таблиц в пуле.
Все параметры объекта модели безопасности StaticMap являются обязательными.
Пример:
policy object M : StaticMap {
type Value = UInt16
config =
{ keys:
{ "k1" : 0
, "k2" : 1
}
, pool_size : 2
}
}
Объект модели безопасности StaticMap может быть покрыт аудитом безопасности. Условия выполнения аудита, специфичные для модели безопасности StaticMap, отсутствуют.
Необходимость создавать несколько объектов модели безопасности StaticMap возникает в следующих случаях:
- Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности StaticMap (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
- Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности StaticMap (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
- Если нужно использовать таблицы с разными наборами ключей и/или разными типами значений ключей.
Правило init модели безопасности StaticMap
init {sid : <Sid>}
Ассоциирует свободную таблицу из пула таблиц с ресурсом sid
. Ключи инициализируются значениями по умолчанию.
Возвращает результат "разрешено", если создало ассоциацию таблицы с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- В пуле нет свободных таблиц.
- Ресурс
sid
уже ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Пример:
/* Запуск процесса класса Server будет разрешен, если
* при инициации запуска будет создана ассоциация этого
* процесса с таблицей. Иначе запуск процесса класса
* Server будет запрещен. */
execute dst=Server {
M.init {sid : dst_sid}
}
Правило fini модели безопасности StaticMap
fini {sid : <Sid>}
Удаляет ассоциацию таблицы с ресурсом sid
(таблица становится свободной).
Возвращает результат "разрешено", если удалило ассоциацию таблицы с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Правило set модели безопасности StaticMap
set {sid : <Sid>, key : <Key>, value : <Value>}
Задает значение value
ключу key
в рабочем экземпляре таблицы, ассоциированной с ресурсом sid
.
Возвращает результат "разрешено", если задало значение value
ключу key
в рабочем экземпляре таблицы, ассоциированной с ресурсом sid
. (Текущее значение ключа будет перезаписано, даже если оно равно новому.)
Возвращает результат "запрещено" в следующих случаях:
- Ключ
key
не содержится в таблице, ассоциированной с ресурсомsid
. - Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Пример:
/* Процесс класса Server получит решение "разрешено" от
* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса
* безопасности Set, если при вызове этого метода значение 2
* будет задано ключу k1 в рабочем экземпляре таблицы,
* ассоциированной с этим процессом. Иначе процесс класса
* Server получит решение "запрещено" от модуля безопасности,
* вызывая метод интерфейса безопасности Set. */
security src=Server, method=Set {
M.set {sid : src_sid, key : "k1", value : 2}
}
Правило commit модели безопасности StaticMap
commit {sid : <Sid>}
Копирует значения ключей из рабочего в базовый экземпляр таблицы, ассоциированной с ресурсом sid
.
Возвращает результат "разрешено", если скопировало значения ключей из рабочего в базовый экземпляр таблицы, ассоциированной с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Правило rollback модели безопасности StaticMap
rollback {sid : <Sid>}
Копирует значения ключей из базового в рабочий экземпляр таблицы, ассоциированной с ресурсом sid
.
Возвращает результат "разрешено", если скопировало значения ключей из базового в рабочий экземпляр таблицы, ассоциированной с ресурсом sid
.
Возвращает результат "запрещено" в следующих случаях:
- Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Выражение get модели безопасности StaticMap
get {sid : <Sid>, key : <Key>}
Возвращает значение ключа key
из базового экземпляра таблицы, ассоциированной с ресурсом sid
.
Возвращает значение типа Value
.
Выполняется некорректно в следующих случаях:
- Ключ
key
не содержится в таблице, ассоциированной с ресурсомsid
. - Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".
Пример:
/* Процесс класса Server получит решение "разрешено" от
* модуля безопасности Kaspersky Security Module, вызывая метод интерфейса
* безопасности Get, если значение ключа k1 в базовом
* экземпляре таблицы, ассоциированной с этим процессом,
* отлично от нуля. Иначе процесс класса Server получит
* решение "запрещено" от модуля безопасности, вызывая
* метод интерфейса безопасности Get. */
security src=Server, method=Get {
assert(M.get {sid : src_sid, key : "k1"} != 0)
}
Выражение get_uncommited модели безопасности StaticMap
get_uncommited {sid: <Sid>, key: <Key>}
Возвращает значение ключа key
из рабочего экземпляра таблицы, ассоциированной с ресурсом sid
.
Возвращает значение типа Value
.
Выполняется некорректно в следующих случаях:
- Ключ
key
не содержится в таблице, ассоциированной с ресурсомsid
. - Ресурс
sid
не ассоциирован с таблицей из пула таблиц используемого объекта модели безопасности StaticMap. - Значение
sid
вне допустимого диапазона.
Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".
В началоМодель безопасности 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 ()
}
}
Модель безопасности Mic
Модель безопасности Mic позволяет реализовать мандатный контроль целостности. То есть эта модель безопасности дает возможность управлять информационными потоками между процессами, а также между процессами и ядром KasperskyOS, контролируя уровни целостности процессов, ядра и ресурсов, используемых через IPC.
В терминах модели безопасности Mic процессы и ядро называются субъектами, а ресурсы называются объектами. Однако сведения в этом разделе приведены с отступлением от терминологии модели безопасности Mic. Это отступление заключается в том, что термин "объект" не используется в значении "ресурс".
Информационные потоки между субъектами возникают, когда субъекты взаимодействуют через IPC.
Уровень целостности субъекта/ресурса – это степень доверия к субъекту/ресурсу. Степень доверия к субъекту определяется, например, исходя из того, взаимодействует ли субъект с недоверенными внешними программно-аппаратными системами, или имеет ли субъект доказанный уровень качества. (Ядро имеет высокий уровень целостности.) Степень доверия к ресурсу определяется, например, с учетом того, был ли этот ресурс создан доверенным субъектом внутри программно-аппаратной системы под управлением KasperskyOS или получен из недоверенной внешней программно-аппаратной системы.
Модель безопасности Mic характеризуют следующие положения:
- По умолчанию информационные потоки от менее целостных к более целостным субъектам запрещены. Опционально такие информационные потоки могут быть разрешены. При этом нужно гарантировать, что более целостные субъекты не будут компрометированы.
- Потребителю ресурсов запрещено записывать данные в ресурс, если уровень целостности ресурса выше уровня целостности потребителя ресурсов.
- По умолчанию потребителю ресурсов запрещено читать данные из ресурса, если уровень целостности ресурса ниже уровня целостности потребителя ресурсов. Опционально потребителю ресурсов может быть разрешена такая операция. При этом нужно гарантировать, что потребитель ресурсов не будет компрометирован.
Методы модели безопасности Mic позволяют назначать субъектам и ресурсам уровни целостности, проверять допустимость информационных потоков на основе сравнения уровней целостности, повышать уровни целостности ресурсов.
PSL-файл с описанием модели безопасности Mic находится в KasperskyOS SDK по пути:
toolchain/include/nk/mic.psl
В качестве примера использования модели безопасности Mic можно рассмотреть безопасное обновление ПО программно-аппаратной системы под управлением KasperskyOS. В обновлении участвуют четыре процесса:
Downloader
– низкоцелостный процесс, который загружает низкоцелостный образ обновления с удаленного сервера в интернете.Verifier
– высокоцелостный процесс, который проверяет цифровую подпись низкоцелостного образа обновления (высокоцелостный процесс, который может читать данные из низкоцелостного ресурса).FileSystem
– высокоцелостный процесс, который управляет файловой системой.Updater
– высокоцелостный процесс, который применяет обновление.
Обновление ПО выполняется по следующему сценарию:
Downloader
загружает образ обновления и сохраняет его в файл, передав содержимое образа вFileSystem
. Этому файлу назначается низкий уровень целостности.Verifier
получает образ обновления уFileSystem
, прочитав низкоцелостный файл, и проверяет его цифровую подпись. Если подпись корректна,Verifier
обращается кFileSystem
, чтобыFileSystem
создал копию файла с образом обновления. Новому файлу назначается высокий уровень целостности.Updater
получает образ обновления уFileSystem
, прочитав высокоцелостный файл, и применяет обновление.
В этом примере модель безопасности Mic обеспечивает то, что высокоцелостный процесс Updater
может читать данные только из высокоцелостного образа обновления. Вследствие этого обновление может быть применено только после проверки цифровой подписи образа обновления.
Объект модели безопасности Mic
Чтобы использовать модель безопасности Mic, нужно создать объект (объекты) этой модели. При этом нужно задать множество уровней целостности субъектов/ресурсов.
Объект модели безопасности Mic имеет следующие параметры:
config
– множество уровней целостности или конфигурация множества уровней целостности:degrees
– множество градаций для формирования множества уровней целостности;categories
– множество категорий для формирования множества уровней целостности.
Примеры:
policy object mic : Mic {
config = ["LOW", "MEDIUM", "HIGH"]
}
policy object mic_po : Mic {
config =
{ degrees : ["low", "high"]
, categories : ["net", "log"]
}
}
Множество уровней целостности представляет собой частично упорядоченное множество, которое является линейно упорядоченным или содержит несравнимые элементы. Множество {LOW, MEDIUM, HIGH} является линейно упорядоченным, так как все его элементы сравнимы между собой. Несравнимые элементы появляются, когда множество уровней целостности задается через множество градаций и множество категорий. В этом случае множество уровней целостности L представляет собой декартово произведение булеана множества категорий C на множество градаций D:
Параметры degrees
и categories
в примере задают следующее множество:
{
{}/low, {}/high,
{net}/low, {net}/high,
{log}/low, {log}/high,
{net,log}/low, {net,log}/high
}
В этом множестве {} означает пустое множество.
Отношение порядка между элементами множества уровней целостности L задается следующим образом:
Согласно этому отношению порядка j-й элемент превышает i-й элемент, если подмножество категорий E включает подмножество категорий A, и градация F больше градации A либо равна ей. Примеры сравнения элементов множества уровней целостности L:
- Элемент {net,log}/high превышает элемент {log}/low, так как градация high больше градации low, и подмножество категорий {net,log} включает подмножество категорий {log}.
- Элемент {net,log}/low превышает элемент {log}/low, так как уровни градаций для этих элементов равны между собой, и подмножество категорий {net,log} включает подмножество категорий {log}.
- Элемент {net,log}/high является наибольшим, так как превышает все остальные элементы.
- Элемент {}/low является наименьшим, так как все остальные элементы превышают этот элемент.
- Элементы {net}/low и {log}/high являются несравнимыми, так как градация high больше градации low, но подмножество категорий {log} не включает подмножество категорий {net}.
- Элементы {net,log}/low и {log}/high являются несравнимыми, так как градация high больше градации low, но подмножество категорий {log} не включает подмножество категорий {net,log}.
Для субъектов и ресурсов с несравнимыми уровнями целостности модель безопасности Mic предусматривает условия, аналогичные тем, которые эта модель безопасности предусматривает для субъектов и ресурсов со сравнимыми уровнями целостности.
По умолчанию информационные потоки между субъектам с несравнимыми уровнями целостности запрещены, но опционально такие информационные потоки могут быть разрешены. (Нужно гарантировать, что субъекты, принимающие данные, не будут компрометированы.) Потребителю ресурсов запрещено записывать данные в ресурс и читать данные из ресурса, если уровень целостности ресурса несравним с уровнем целостности потребителя ресурсов. Опционально потребителю ресурсов может быть разрешено чтение данных из ресурса. (Нужно гарантировать, что потребитель ресурсов не будет компрометирован.)
Объект модели безопасности Mic может быть покрыт аудитом безопасности. Условия выполнения аудита, специфичные для модели безопасности Mic, отсутствуют.
Необходимость создавать несколько объектов модели безопасности Mic возникает в следующих случаях:
- Если нужно по-разному настроить аудит безопасности для разных объектов модели безопасности Mic (например, для разных объектов можно применять разные профили аудита или разные конфигурации аудита одного профиля).
- Если нужно различать вызовы методов, предоставляемых разными объектами модели безопасности Mic (поскольку в данные аудита включается как имя метода модели безопасности, так и имя объекта, предоставляющего этот метод, можно понять, что был вызван метод конкретного объекта).
- Если нужно использовать несколько вариантов мандатного контроля целостности, например, с разными множествами уровней целостности субъектов/ресурсов.
Правило create модели безопасности Mic
create { source : <Sid>
, target : <Sid>
, container : <Sid | ()>
, driver : <Sid>
, level : <Level | ... | ()>
}
Назначает ресурсу target
уровень целостности level
в следующей ситуации:
- Процесс
source
инициирует создание ресурсаtarget
. - Ресурсом
target
управляет субъектdriver
, который является поставщиком ресурсов или ядром KasperskyOS. - Ресурс
container
является контейнером для ресурсаtarget
(например, директория является контейнером для файлов и/или других директорий).
Если значение container
не задано (container : ()
), ресурс target
рассматривается как корневой, то есть не имеющий контейнера.
Чтобы задать уровень целостности level
, используются значения типа Level
:
type Level = LevelFull | LevelNoCategory
type LevelFull =
{ degree : Text | ()
, categories : List<Text> | ()
}
type LevelNoCategory = Text
Правило возвращает результат "разрешено", если назначило ресурсу target
уровень целостности level
.
Правило возвращает результат "запрещено" в следующих случаях:
- Значение
level
превышает уровень целостности процессаsource
, субъектаdriver
или ресурсаcontainer
. - Значение
level
несравнимо с уровнем целостности процессаsource
, субъектаdriver
или ресурсаcontainer
. - Процессу
source
, субъектуdriver
или ресурсуcontainer
не назначен уровень целостности. - Значение
source
,target
,container
илиdriver
вне допустимого диапазона.
Пример:
/* Серверу класса updater.Realmserv будет разрешено отвечать на
* обращения любого клиента в решении, вызывающего метод resolve
* службы realm.Reader, если ресурсу, создание которого запрашивает
* клиент, при инициации ответа будет назначен уровень целостности LOW.
* Иначе серверу класса updater.Realmserv будет запрещено отвечать на
* обращения любого клиента, вызывающего метод resolve службы realm.Reader. */
response src=updater.Realmserv,
endpoint=realm.Reader {
match method=resolve {
mic.create { source : dst_sid
, target : message.handle.handle
, container : ()
, driver : src_sid
, level : "LOW"
}
}
}
Правило execute модели безопасности Mic
execute <ExecuteImage | ExecuteLevel>
type ExecuteImage =
{ image : Sid
, target : Sid
, level : Level | ... | ()
, levelR : Level | ... | ()
}
type ExecuteLevel =
{ image : Sid | ()
, target : Sid
, level : Level | ...
, levelR : Level | ... | ()
}
Назначает субъекту target
уровень целостности level
и задает минимальный уровень целостности субъектов и ресурсов, из которых этот субъект может принимать данные (levelR
). Код субъекта target
содержится в исполняемом файле image
.
Если значение level
не задано (level : ()
), субъекту target
назначается уровень целостности исполняемого файла image
. Если значение image
не задано (image : ()
), должно быть задано значение level
.
Если значение levelR
не задано (levelR : ()
), то значение levelR
равно level
.
Чтобы задать уровни целостности level
и levelR
, используются значения типа Level
. Определение типа Level
см. в "Правило create модели безопасности Mic".
Правило возвращает результат "разрешено", если назначило субъекту target
уровень целостности level
и задало минимальный уровень целостности субъектов и ресурсов, из которых этот субъект может принимать данные (levelR
).
Правило возвращает результат "запрещено" в следующих случаях:
- Значение
level
превышает уровень целостности исполняемого файлаimage
. - Значение
level
несравнимо с уровнем целостности исполняемого файлаimage
. - Значение
levelR
превышает значениеlevel
. - Значения
level
иlevelR
несравнимы. - Исполняемому файлу
image
не назначен уровень целостности. - Значение
image
илиtarget
вне допустимого диапазона.
Пример:
/* Запуск процесса класса updater.Manager будет разрешен,
* если при инициации запуска этому процессу будет назначен
* уровень целостности LOW, а также будет задан минимальный
* уровень целостности процессов и ресурсов, из которых этот
* процесс может принимать данные (LOW). Иначе запуск процесса
* класса updater.Manager будет запрещен. */
execute src=Einit, dst=updater.Manager, method=main {
mic.execute { target : dst_sid
, image : ()
, level : "LOW"
, levelR : "LOW"
}
}
Правило upgrade модели безопасности Mic
upgrade { source : <Sid>
, target : <Sid>
, container : <Sid | ()>
, driver : <Sid>
, level : <Level | ...>
}
Повышает назначенный ранее уровень целостности ресурса target
до значения level
в следующей ситуации:
- Процесс
source
инициирует повышение уровня целостности ресурсаtarget
. - Ресурсом
target
управляет субъектdriver
, который является поставщиком ресурсов или ядром KasperskyOS. - Ресурс
container
является контейнером для ресурсаtarget
(например, директория является контейнером для файлов и/или других директорий).
Если значение container
не задано (container : ()
), ресурс target
рассматривается как корневой, то есть не имеющий контейнера.
Чтобы задать уровень целостности level
, используются значения типа Level
. Определение типа Level
см. в "Правило create модели безопасности Mic".
Правило возвращает результат "разрешено", если повысило назначенный ранее уровень целостности ресурса target
до значения level
.
Правило возвращает результат "запрещено" в следующих случаях:
- Значение
level
не превышает уровень целостности ресурсаtarget
. - Значение
level
превышает уровень целостности процессаsource
, субъектаdriver
или ресурсаcontainer
. - Уровень целостности ресурса
target
превышает уровень целостности процессаsource
. - Процессу
source
, субъектуdriver
или ресурсуcontainer
не назначен уровень целостности. - Значение
source
,target
,container
илиdriver
вне допустимого диапазона.
Правило call модели безопасности Mic
call {source : <Sid>, target : <Sid>}
Проверяет допустимость информационных потоков от субъекта target
к субъекту source
.
Возвращает результат "разрешено" в следующих случаях:
- Уровень целостности субъекта
source
не превышает уровень целостности субъектаtarget
. - Уровень целостности субъекта
source
превышает уровень целостности субъектаtarget
, но минимальный уровень целостности субъектов и ресурсов, из которых субъектsource
может принимать данные, не превышает уровень целостности субъектаtarget
. - Уровень целостности субъекта
source
несравним с уровнем целостности субъектаtarget
, но минимальный уровень целостности субъектов и ресурсов, из которых субъектsource
может принимать данные, не превышает уровень целостности субъектаtarget
.
Возвращает результат "запрещено" в следующих случаях:
- Уровень целостности субъекта
source
превышает уровень целостности субъектаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых субъектsource
может принимать данные, превышает уровень целостности субъектаtarget
. - Уровень целостности субъекта
source
превышает уровень целостности субъектаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых субъектsource
может читать данные, несравним с уровнем целостности субъектаtarget
. - Уровень целостности субъекта
source
несравним с уровнем целостности субъектаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых субъектsource
может принимать данные, превышает уровень целостности субъектаtarget
. - Уровень целостности субъекта
source
несравним с уровнем целостности субъектаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых субъектsource
может принимать данные, несравним с уровнем целостности субъектаtarget
. - Субъекту
source
или субъектуtarget
не назначен уровень целостности. - Значение
source
илиtarget
вне допустимого диапазона.
Пример:
/* Любому клиенту в решении разрешено обращаться к
* любому серверу (ядру), если информационные потоки от
* сервера (ядра) к клиенту допускаются моделью
* безопасности Mic. Иначе любому клиенту в решении
* запрещено обращаться к любому серверу (ядру). */
request {
mic.call { source : src_sid
, target : dst_sid
}
}
Правило invoke модели безопасности Mic
invoke {source : <Sid>, target : <Sid>}
Проверяет допустимость информационных потоков от субъекта source
к субъекту target
.
Возвращает результат "разрешено", если уровень целостности субъекта target
не превышает уровень целостности субъекта source
.
Возвращает результат "запрещено" в следующих случаях:
- Уровень целостности субъекта
target
превышает уровень целостности субъектаsource
. - Уровень целостности субъекта
target
несравним с уровнем целостности субъектаsource
. - Субъекту
source
или субъектуtarget
не назначен уровень целостности. - Значение
source
илиtarget
вне допустимого диапазона.
Правило read модели безопасности Mic
read {source : <Sid>, target : <Sid>}
Проверяет допустимость чтения данных из ресурса target
потребителем ресурсов source
.
Возвращает результат "разрешено" в следующих случаях:
- Уровень целостности потребителя ресурсов
source
не превышает уровень целостности ресурсаtarget
. - Уровень целостности потребителя ресурсов
source
превышает уровень целостности ресурсаtarget
, но минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсовsource
может принимать данные, не превышает уровень целостности ресурсаtarget
. - Уровень целостности потребителя ресурсов
source
несравним с уровнем целостности ресурсаtarget
, но минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсовsource
может принимать данные, не превышает уровень целостности ресурсаtarget
.
Возвращает результат "запрещено" в следующих случаях:
- Уровень целостности потребителя ресурсов
source
превышает уровень целостности ресурсаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсовsource
может принимать данные, превышает уровень целостности ресурсаtarget
. - Уровень целостности потребителя ресурсов
source
превышает уровень целостности ресурсаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсовsource
может принимать данные, несравним с уровнем целостности ресурсаtarget
. - Уровень целостности потребителя ресурсов
source
несравним с уровнем целостности ресурсаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсовsource
может принимать данные, превышает уровень целостности ресурсаtarget
. - Уровень целостности потребителя ресурсов
source
несравним с уровнем целостности ресурсаtarget
, и минимальный уровень целостности субъектов и ресурсов, из которых потребитель ресурсовsource
может принимать данные, несравним с уровнем целостности ресурсаtarget
. - Потребителю ресурсов
source
или ресурсуtarget
не назначен уровень целостности. - Значение
source
илиtarget
вне допустимого диапазона.
Пример:
/* Любому клиенту в решении разрешено обращаться к серверу
* класса updater.Realmserv, вызывая метод read службы
* realm.Reader, если модель безопасности Mic допускает
* чтение данных этим клиентом из ресурса, который требуется
* этому клиенту. Иначе любому клиенту в решении запрещено
* обращаться к серверу класса updater.Realmserv, вызывая
* метод read службы realm.Reader. */
request dst=updater.Realmserv,
endpoint=realm.Reader {
match method=read {
mic.read { source : src_sid,
, target : message.handle.handle
}
}
}
Правило write модели безопасности Mic
write {source : <Sid>, target : <Sid>}
Проверяет допустимость записи данных в ресурс target
потребителем ресурсов source
.
Возвращает результат "разрешено", если уровень целостности ресурса target
не превышает уровень целостности потребителя ресурсов source
.
Возвращает результат "запрещено" в следующих случаях:
- Уровень целостности ресурса
target
превышает уровень целостности потребителя ресурсовsource
. - Уровень целостности ресурса
target
несравним с уровнем целостности потребителя ресурсовsource
. - Потребителю ресурсов
source
или ресурсуtarget
не назначен уровень целостности. - Значение
source
илиtarget
вне допустимого диапазона.
Выражение query_level модели безопасности Mic
query_level {source : <Sid>}
Предназначено для использования в качестве выражения, проверяющего выполнение условий в конструкции choice
(о конструкции choice
см. "Привязка методов моделей безопасности к событиям безопасности"). Проверяет уровень целостности субъекта или ресурса source
. В зависимости от результатов этой проверки выполняются различные варианты обработки события безопасности.
Выполняется некорректно в следующих случаях:
- Субъекту или ресурсу
source
не назначен уровень целостности. - Значение
source
вне допустимого диапазона.
Когда выражение выполняется некорректно, модуль безопасности Kaspersky Security Module возвращает решение "запрещено".
В начало