Использование шаблонизации при создании описания политики безопасности решения на базе KasperskyOS
При создании описания политики можно использовать шаблонизатор Ginger, интегрированный в генератор исходного кода модуля безопасности Kaspersky Security Module. Для управления шаблонизатором нужно использовать параметры CMake-команды build_vendor_romfs ().
PSL-шаблон Ginger представляет собой PSL-файл, который, помимо деклараций на языке PSL, содержит синтаксические конструкции шаблонизатора Ginger. Такие файлы, как security.psl, core.psl, являются PSL-шаблонами Ginger, если в них содержаться синтаксические конструкции шаблонизатора 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.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.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.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.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, который содержит эту конструкцию.