Использование шаблонизации при создании описания политики безопасности решения на базе KasperskyOS

12 января 2026

ID ssp_descr_templating

При создании описания политики можно использовать шаблонизатор Ginger, интегрированный в компилятор nk-psl-gen-c. Для управления шаблонизатором нужно использовать параметры компилятора nk-psl-gen-c или параметры CMake-команд build_kos_qemu_image() и build_kos_hw_image().

PSL-шаблон Ginger представляет собой PSL-файл, который, помимо деклараций на языке PSL, содержит синтаксические конструкции шаблонизатора Ginger. Такие файлы, как security.psl.in, security.psl, core.psl, являются PSL-шаблонами Ginger, если в них содержаться синтаксические конструкции шаблонизатора Ginger. (Файл security.psl.in одновременно является PSL-шаблоном в другом контексте, так как в этом файле могут использоваться макросы и переменные, не связанные с шаблонизатором Ginger.)

Описание синтаксических конструкций шаблонизатора Ginger приведено в официальной документации на этот шаблонизатор. Например, можно использовать макросы.

Пример определения макроса:

{% macro VMMSafe(src) %}

match method=Allocate {

match src={{ src }} { grant () }

}

{% endmacro %}

Пример вызова макроса:

{{ VMMSafe(["Einit"]) }}

В результате этого вызова будет создана следующая конструкция:

match method=Allocate {

match src=Einit { grant () }

}

Пример определения макроса с циклами:

{% macro VMMSafe(srcs) %}

{% for method in ["Allocate", "Commit", "Decommit"] %}

match method={{ method }} {

{% for src in srcs %}

match src={{ src }} { grant () }

{% endfor %}

}

{% endfor %}

{% endmacro %}

Пример конструкции с вызовом макроса:

match endpoint=vmm.VMM {

{{ VMMSafe(["Einit", "client.Client", "consumer.Consumer",

"kl.bc.BlobContainer", "kl.core.NameServer",

"kl.VfsEntity", "scm.Producer", "execution_manager.ExecMgrEntity",

"scm.SecurityConfigMgrEntity", "kl.drivers.ATA", "kl.drivers.PCIE"]) }}

}

В результате раскрытия макроса в этой конструкции будет создана следующая конструкция:

match endpoint=vmm.VMM {

match method=Allocate {

match src=Einit { grant () }

match src=client.Client { grant () }

match src=consumer.Consumer { grant () }

match src=kl.bc.BlobContainer { grant () }

match src=kl.core.NameServer { grant () }

match src=kl.VfsEntity { grant () }

match src=scm.Producer { grant () }

match src=execution_manager.ExecMgrEntity { grant () }

match src=scm.SecurityConfigMgrEntity { grant () }

match src=kl.drivers.ATA { grant () }

match src=kl.drivers.PCIE { grant () }

}

match method=Commit {

match src=Einit { grant () }

match src=client.Client { grant () }

match src=consumer.Consumer { grant () }

match src=kl.bc.BlobContainer { grant () }

match src=kl.core.NameServer { grant () }

match src=kl.VfsEntity { grant () }

match src=scm.Producer { grant () }

match src=execution_manager.ExecMgrEntity { grant () }

match src=scm.SecurityConfigMgrEntity { grant () }

match src=kl.drivers.ATA { grant () }

match src=kl.drivers.PCIE { grant () }

}

match method=Decommit {

match src=Einit { grant () }

match src=client.Client { grant () }

match src=consumer.Consumer { grant () }

match src=kl.bc.BlobContainer { grant () }

match src=kl.core.NameServer { grant () }

match src=kl.VfsEntity { grant () }

match src=scm.Producer { grant () }

match src=execution_manager.ExecMgrEntity { grant () }

match src=scm.SecurityConfigMgrEntity { grant () }

match src=kl.drivers.ATA { grant () }

match src=kl.drivers.PCIE { grant () }

}

}

В PSL-шаблонах Ginger можно использовать комментарии:

{# Комментарий, который будет удален при раскрытии шаблона. #}

Также в PSL-шаблонах Ginger можно использовать конструкцию включения файла.

Пример конструкции включения файла:

{% include "defs.ginger" %}

Файл defs.ginger может содержать, например, определения макросов, используемых в PSL-шаблоне Ginger. Этот файл должен находится в одной директории с PSL-шаблоном Ginger, который содержит эту конструкцию.

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!