KasperskyOS Community Edition 1.2

Пример включения в решение системной программы KlogStorage, направляющей данные аудита в стандартный вывод ошибок

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

klog_storage/src/klog_storage_entity.c

#include <klog_storage/server.h> #include <ping/KlogStorageEntity.edl.h> #include <stdio.h> /* Определение типа данных для фиктивного контекста. * Требуется для определения функций, реализующих * интерфейсные методы, и настройки диспетчера. */ struct Context { int some_data; }; /* Определение функции, направляющей данные аудита в стандартный * вывод ошибок. (Параметр ctx не требуется использовать, но параметр * типа void* должен быть первым параметром в сигнатуре функции, чтобы * соответствовать типу указателя, который используется диспетчером * для вызова этой функции.) */ static int _write(struct Context *ctx, const struct kl_KlogStorage_Entry *entry) { fprintf(stderr, "%s\n", entry->msg); return 0; } /* Определение фиктивной функции чтения данных аудита. * (Требуется для настройки диспетчера, чтобы избежать ошибки, * если будет вызван интерфейсный метод чтения данных аудита.) */ static int _read_range(struct Context *ctx, nk_uint64_t first_id, nk_uint64_t last_id, struct kl_KlogStorage_Entry *entries) { return 0; } /* Определение фиктивной функции чтения данных аудита. * (Требуется для настройки диспетчера, чтобы избежать ошибки, * если будет вызван интерфейсный метод чтения данных аудита.) */ static int _read(struct Context *ctx, nk_uint32_t num_entries, struct kl_KlogStorage_Entry *entries) { return 0; } int main(int argc, char *argv[]) { /* Объявление фиктивного контекста */ static struct Context ctx; /* Настройка диспетчера, чтобы при получении от программы Klog * IPC-запросов с данными аудита была вызвана функция, направляющая * эти данные в стандартный вывод ошибок. (Функции чтения данных аудита * и контекст являются фиктивными. Однако можно создать собственные * реализации функций _write(), _read() и _read_range() для работы с * хранилищем данных аудита. В этом случае контекст может быть * использован для хранения состояния хранилища.) */ struct kl_KlogStorage *iface = klog_storage_IKlog_storage_dispatcher(&ctx, (kl_KlogStorage_write_func)_write, (kl_KlogStorage_read_func)_read, (kl_KlogStorage_read_range_func)_read_range); struct kl_KlogStorage_component *comp =klog_storage_storage_component(iface); /* В результате вызова этой функции будет запущен цикл обработки IPC-запросов. * (Константы ping_KlogStorageEntity_klogStorage_iidOffset и * ping_KlogStorageEntity_klogStorage_storage_iid определены в заголовочном файле * KlogStorageEntity.edl.h, который содержит автоматически сгенерированный * транспортный код.) */ return klog_storage_run(KLOG_STORAGE_SERVER_CONNECTION_ID, ping_KlogStorageEntity_klogStorage_iidOffset, ping_KlogStorageEntity_klogStorage_storage_iid, comp); }

Сборка программы

klog_storage/CMakeLists.txt

# Импорт библиотек KlogStorage из состава # KasperskyOS SDK find_package (klog_storage REQUIRED) include_directories (${klog_storage_INCLUDE}) # Генерация транспортного кода на основе формальной спецификации # программы KlogStorage nk_build_edl_files (klog_storage_edl_files NK_MODULE "ping" # Файл KlogStorageEntity.edl и другие файлы # формальной спецификации программы KlogStorage # поставляются в составе KasperskyOS SDK. EDL "${RESOURCES}/edl/KlogStorageEntity.edl") # Создание исполняемого файла программы KlogStorage add_executable (KlogStorageEntity "src/klog_storage_entity.c") target_link_libraries (KlogStorageEntity ${klog_storage_SERVER_LIB}) add_dependencies (KlogStorageEntity klog_edl_files klog_storage_edl_files)

Словарь процесса программы в шаблоне init-описания

einit/src/init.yaml.in

... - name: ping.KlogStorageEntity ...

Описание политики для программы

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._ ... /* Взаимодействие с программой Klog */ 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.KlogStorageEntity { grant () } ... } match method=Wait { ... match src=ping.KlogStorageEntity { grant () } ... } } match endpoint=task.Task { match method=FreeSelfEnv { ... match src=ping.KlogStorageEntity { grant () } ... } match method=GetPath { ... match src=ping.KlogStorageEntity { grant () } ... } match method=GetName { ... match src=ping.KlogStorageEntity { grant () } ... } match method=Exit { ... match src=ping.KlogStorageEntity { grant () } ... } } match endpoint=vmm.VMM { match method=Allocate { ... match src=ping.KlogStorageEntity { grant () } ... } match method=Commit { ... match src=ping.KlogStorageEntity { grant () } ... } match method=Protect { ... match src=ping.KlogStorageEntity { grant () } ... } match method=Free { ... match src=ping.KlogStorageEntity { grant () } ... } } match endpoint=thread.Thread { match method=SetTls { ... match src=ping.KlogStorageEntity { grant () } ... } match method=Create { ... match src=ping.KlogStorageEntity { grant () } ... } match method=Resume { ... match src=ping.KlogStorageEntity { grant () } ... } } match endpoint=hal.HAL { match method=GetEntropy { ... match src=ping.KlogStorageEntity { grant () } ... } match method=DebugWrite { ... match src=ping.KlogStorageEntity { grant () } ... } match method=GetEnv { ... match src=ping.KlogStorageEntity { grant () } ... } } match endpoint=handle.Handle { match method=Close { ... match src=ping.KlogStorageEntity { grant () } ... } } } response src=kl.core.Core { ... match dst=ping.KlogStorageEntity { grant () } ... } error src=kl.core.Core { ... match dst=ping.KlogStorageEntity { grant () } ... } ...