KasperskyOS Community Edition 1.3

Пример включения в решение системной программы Klog

Исходный код программы

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 () } ... } ...