Исходный код программы
einit/src/klog_entity.c
#include <klog/system_audit.h>
#include <klog_storage/client.h>
#include <ping/KlogEntity.edl.h>
int main(int argc, char *argv[])
{
/* В результате вызова этой функции будет создан поток исполнения,
* который получает данные аудита от ядра, декодирует их и передает
* через IPC программе KlogStorage.
* (Константа ping_KlogEntity_klog_audit_iid определена в заголовочном
* файле KlogEntity.edl.h, который содержит автоматически сгенерированный
* транспортный код.) */
return klog_system_audit_run(KLOG_SERVER_CONNECTION_ID ":
" KLOG_STORAGE_SERVER_CONNECTION_ID,
ping_KlogEntity_klog_audit_iid);
}
Сборка программы
einit/CMakeLists.txt
...
# Импорт библиотек Klog из состава
# KasperskyOS SDK
find_package (klog REQUIRED)
include_directories (${klog_INCLUDE})
# Генерация транспортного кода на основе формальной спецификации
# программы Klog
nk_build_edl_files (klog_edl_files
NK_MODULE "ping"
# Файл KlogEntity.edl и другие файлы
# формальной спецификации программы Klog
# поставляются в составе KasperskyOS SDK.
EDL "${RESOURCES}/edl/KlogEntity.edl")
# Создание исполняемого файла программы Klog для аппаратной платформы
add_executable (KlogEntityHw "src/klog_entity.c")
target_link_libraries (KlogEntityHw ${klog_SYSTEM_AUDIT_LIB})
add_dependencies (KlogEntityHw klog_edl_files)
# Создание исполняемого файла программы Klog для QEMU.
# (Идентично созданию исполняемого файла программы Klog для
# аппаратной платформы, за исключением имени цели сборки.
# Требуется две цели сборки исполняемого файла программы
# Klog с разными именами, поскольку в параметре KLOG_ENTITY
# CMake-команд build_kos_hw_image() и build_kos_qemu_image()
# нужно указать разные цели сборки.)
add_executable (KlogEntityQemu "src/klog_entity.c")
target_link_libraries (KlogEntityQemu ${klog_SYSTEM_AUDIT_LIB})
add_dependencies (KlogEntityQemu klog_edl_files)
# Программу Klog не нужно указывать вместе с другими программами
# для включения в образ решения. Чтобы включить программу Klog
# в решение, нужно задать имя цели сборки исполняемого файла этой
# программы через параметр KLOG_ENTITY CMake-команд
# build_kos_hw_image() и build_kos_qemu_image().
set (ENTITIES Client Server KlogStorageEntity FileVfs)
...
# Переменная INIT_KlogEntity_PATH используется в файле init.yaml.in,
# чтобы задать имя исполняемого файла программы Klog. (Исполняемые
# файлы программы Klog для QEMU и для аппаратной платформы имеют
# разные имена, которые по умолчанию совпадают с именами целей сборки
# этих файлов.)
set (INIT_KlogEntity_PATH "KlogEntityHw")
# Нужно задать параметр KLOG_ENTITY
build_kos_hw_image (kos-image
EINIT_ENTITY EinitHw
...
KLOG_ENTITY KlogEntityHw
IMAGE_FILES ${ENTITIES})
# Переменная INIT_KlogEntity_PATH используется в файле init.yaml.in,
# чтобы задать имя исполняемого файла программы Klog. (Исполняемые
# файлы программы Klog для QEMU и для аппаратной платформы имеют
# разные имена, которые по умолчанию совпадают с именами целей сборки
# этих файлов.)
set (INIT_KlogEntity_PATH "KlogEntityQemu")
# Нужно задать параметр KLOG_ENTITY
build_kos_qemu_image (kos-qemu-image
EINIT_ENTITY EinitQemu
...
KLOG_ENTITY KlogEntityQemu
IMAGE_FILES ${ENTITIES})
Словарь процесса программы в шаблоне init-описания
einit/src/init.yaml.in
...
- name: ping.KlogEntity
# Переменная INIT_KlogEntity_PATH определена в файле einit/CMakeLists.txt.
path: @INIT_KlogEntity_PATH@
connections:
- target: ping.KlogStorageEntity
id: {var: KLOG_STORAGE_SERVER_CONNECTION_ID, include: klog_storage/client.h}
...
Описание политики для программы
einit/src/security.psl.in
...
use nk.base._
...
use EDL kl.core.Core
...
use EDL ping.KlogEntity
use EDL ping.KlogStorageEntity
...
use audit_profile._
use core._
...
/* Взаимодействие с программой KlogStorage */
request dst=ping.KlogStorageEntity {
match endpoint=klogStorage.storage {
match method=write {
match src=ping.KlogEntity { grant () }
}
}
}
response src=ping.KlogStorageEntity {
match endpoint=klogStorage.storage {
match method=write {
match dst=ping.KlogEntity { grant () }
}
}
}
error src=ping.KlogStorageEntity {
match endpoint=klogStorage.storage {
match method=write {
match dst=ping.KlogEntity { grant () }
}
}
}
...
einit/src/core.psl
...
/* Взаимодействие с ядром */
request dst=kl.core.Core {
match endpoint=sync.Sync {
match method=Wake {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Wait {
...
match src=ping.KlogEntity { grant () }
...
}
}
match endpoint=task.Task {
match method=FreeSelfEnv {
...
match src=ping.KlogEntity { grant () }
...
}
match method=GetPath {
...
match src=ping.KlogEntity { grant () }
...
}
match method=GetName {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Exit {
...
match src=ping.KlogEntity { grant () }
...
}
}
match endpoint=vmm.VMM {
match method=Allocate {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Commit {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Protect {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Free {
...
match src=ping.KlogEntity { grant () }
...
}
}
match endpoint=thread.Thread {
match method=SetTls {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Create {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Resume {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Attach {
...
match src=ping.KlogEntity { grant () }
...
}
match method=Exit {
...
match src=ping.KlogEntity { grant () }
...
}
match method=GetSchedPolicy {
...
match src=ping.KlogEntity { grant () }
...
}
match method=SetSchedPolicy {
...
match src=ping.KlogEntity { grant () }
...
}
}
match endpoint=hal.HAL {
match method=GetEntropy {
...
match src=ping.KlogEntity { grant () }
...
}
match method=DebugWrite {
...
match src=ping.KlogEntity { grant () }
...
}
match method=GetEnv {
...
match src=ping.KlogEntity { grant () }
...
}
}
match endpoint=handle.Handle {
match method=Close {
...
match src=ping.KlogEntity { grant () }
...
}
}
match endpoint=audit.Audit {
match src=ping.KlogEntity { grant () }
}
}
response src=kl.core.Core {
...
match dst=ping.KlogEntity { grant () }
...
}
error src=kl.core.Core {
...
match dst=ping.KlogEntity { grant () }
...
}
...
В начало