Пример включения в решение системной программы 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);

...

}

В начало