KasperskyOS Community Edition 1.2

Использование системных программ Klog и KlogStorage для выполнения аудита безопасности

Для выполнения аудита безопасности системная программа Klog получает данные аудита от ядра KasperskyOS, используя библиотеку libkos, декодирует эти данные и передает через IPC системной программе KlogStorage, выступающей в этом IPC-взаимодействии в качестве сервера. Программа KlogStorage направляет данные аудита в стандартный вывод (или стандартный вывод ошибок) либо сохраняет в файл, используя VFS. Также программа KlogStorage может передавать данные аудита, записанные в файл, другим программам через IPC.

Исполняемые файлы программ Klog и KlogStorage не поставляются в составе KasperskyOS SDK. Их нужно создать на основе поставляемых статических библиотек.

В этом разделе

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

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

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

В начало
[Topic klog_klogstorage_usage]

Пример включения в решение системной программы 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 () } ... } ...
В начало
[Topic klog_usage_example]

Пример включения в решение системной программы 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 () } ... } ...
В начало
[Topic klogstorage_usage_example_stderr]

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

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

klog_storage/src/klog_storage_entity.c

#include <klog_storage/server.h> #include <klog_storage/file_storage.h> #include <ping/KlogStorageEntity.edl.h> int main(int argc, char *argv[]) { /* В результате вызова этой функции будет запущен цикл обработки IPC-запросов. * Данные аудита будут записываться в файл /etc/klog_storage.log, который может * вместить не более 100 записей. При полном заполнении файла предыдущие * записи будут заменяться новыми с начала файла. Если в последнем параметре * функции указано значение, отличное от 1, программа KlogStorage при запуске * откроет существующий файл и начнет запись данных аудита с той позиции, * которая была установлена в файле после предыдущей записи. Если в последнем * параметре функции указано значение 1, будет создан новый пустой файл. * (Константы ping_KlogStorageEntity_klogStorage_iidOffset и * ping_KlogStorageEntity_klogStorage_storage_iid определены в заголовочном * файле KlogStorageEntity.edl.h, который содержит автоматически сгенерированный * транспортный код.) */ return klog_storage_file_storage_run(KLOG_STORAGE_SERVER_CONNECTION_ID, "/etc/klog_storage.log", ping_KlogStorageEntity_klogStorage_iidOffset, ping_KlogStorageEntity_klogStorage_storage_iid, 100, 0); }

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

CMake-команды для сборки программы KlogStorage, выполняющей запись данных аудита в файл, отличаются от CMake-команд для сборки версии этой программы, направляющей данные аудита в стандартный вывод ошибок, следующим изменением:

klog_storage/CMakeLists.txt

... # При создании исполняемого файла программы KlogStorage нужно # выполнить компоновку с библиотекой klog_storage_file_storage. target_link_libraries (KlogStorageEntity ${klog_storage_FILE_STORAGE_LIB}) ...

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

einit/src/init.yaml.in

... - name: ping.KlogStorageEntity connections: - target: file_vfs.FileVfs id: {var: _VFS_CONNECTION_ID, include: vfs/defs.h} ...

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

Описание политики для программы KlogStorage, выполняющей запись данных аудита в файл, отличается от описания политики для версии этой программы, направляющей данные аудита в стандартный вывод ошибок, следующим дополнением:

einit/src/security.psl.in

... use EDL file_vfs.FileVfs ... use vfs._ ...

einit/src/vfs.psl

... /* Взаимодействие с программой VFS */ request dst=file_vfs.FileVfs { match src=ping.KlogStorageEntity { grant () } } response src=file_vfs.FileVfs { match dst=ping.KlogStorageEntity { grant () } } error src=file_vfs.FileVfs { match dst=ping.KlogStorageEntity { grant () } } ...

Передача данных аудита другим программам

Чтобы передавать через IPC данные аудита, записанные в файл, программа KlogStorage предоставляет интерфейсные методы read и readRange, определенные в файле sysroot-*-kos/include/kl/KlogStorage.idl из состава KasperskyOS SDK.

Исполняемый файл программы, которой требуется получать данные аудита, должен быть скомпонован с клиентской библиотекой программы KlogStorage:

klog_reader/CMakeLists.txt

# Импорт библиотек KlogStorage из состава # KasperskyOS SDK find_package (klog_storage REQUIRED) include_directories (${klog_storage_INCLUDE}) ... # Создание исполняемого файла программы, которой требуется # получать данные аудита от программы KlogStorage. add_executable (KlogReader "src/klog_reader.c") target_link_libraries (KlogReader ${klog_storage_CLIENT_LIB}) ...

Исходный код для получения данных аудита от программы KlogStorage:

klog_reader/src/klog_reader.c

#include <klog_storage/client.h> ... int main(int argc, char *argv[]) { ... struct Klog_storage_ctx *storage = klog_storage_init(KLOG_STORAGE_SERVER_CONNECTION_ID); struct kl_KlogStorage_Entry first_entries[10], latest_entries [10]; /* Чтение десяти первых записей */ int f_count = klog_storage_read_range(klog_storage_IKlog_storage(storage), 1, 10, first_entries); /* Чтение десяти последних записей */ int l_count = klog_storage_read(klog_storage_IKlog_storage(storage), 10, latest_entries); ... }
В начало
[Topic klogstorage_usage_example_file]