Документация
ОС Аврора 5.1.5

D-Bus-интерфейс sdjd

sdjd — это системный сервис сбора событий безопасности. Подробнее…

Шина: системная
Служба: ru.omprussia.SystemLogs
Объект: /ru/omprussia/SystemLogs
Интерфейс: ru.omprussia.SystemLogs

Cвойства

Сигналы

Методы

  • applyFilter(const string &filter, int32 &status)
  • getEventsAfterId(uint64 id, vector<vector<string, Variant>> &events, bool &hasMore, bool &eventsMissed)
  • getLastEventId(uint64 &id)
  • getNEventsAfterId(uint64 id, uint32 limit, vector<vector<string, Variant>> &events, bool &hasMore, bool &eventsMissed)
  • sendEvent(uint32 eventType, uint8 level, const string &message, int32 &status)
  • sendEventStringAlt(const string &eventType, const string &level, const string &message, int32 &status)

Подробное описание

sdjd — это системный сервис сбора событий безопасности, которые отправляются различными компонентами ОС Аврора. Перечень актуальных событий приведён в таблице.

Сигналы newEvent и getEventsAfterId, а также методы getEventsAfterId, getLastEventId и getNEventsAfterId позволяют получать информацию о событиях. С помощью applyFilter события можно фильтровать.

В sdjd размер поля message события (текстовая заметка к событию) ограничен 8 Кб.

Процесс фильтрации событий увеличивает время обработки событий. Поскольку по умолчанию таймаут D-Bus-соединения составляет 25 секунд, то большое количество событий не успевает пройти процесс фильтрации, и соединение обрывается. Данный таймаут изменить нельзя из-за ограничений утилиты gdbus-codegen. Поэтому для получения всего списка событий рекомендуется использовать getEventsAfterId с шагом в 1000-5000 событий.

sdjd может выполнять аудит файлов. При каждом запуске sdjd загружает правила аудита, прописанные в конфигурационном файле /usr/share/security-audit/security-audit-rules.conf. Правила должны строиться по следующему принципу:

имя_правила=-a действие1,действие2,... -S сисвызов1,сисвызов2,... [-F ключ=значение]

После опции -a указываются действия, для которых устанавливается правило. После опции -S указываются названия или номера системных вызовов. После опции -F можно указать ключ и значение события. Правила полностью соответствуют настройке утилиты auditctl.

Правила должны быть прописаны в секции audit-rules, например:

[audit-rules]
Rule-001=-a always,exit -S all -F perm=x -F exit=-EPERM  -F key=x

Конфигурационный файл можно отредактировать, обновляя правила, после чего будет необходимо перезагрузить устройство.

Для дампа событий, зафиксированных в sdjd, можно использовать утилиту sdjd-dump. Пользователь может получить дамп событий, принадлежащих только его сессии. Администратору устройства доступна опция --all:

sdjd-dump --all

Чтобы использовать D-Bus-интерфейс sdjd в Аврора SDK, требуются следующие разрешения:

  • для записи данных о событиях нужно указать разрешение LogSecurityEvents;
  • для использования всех интерфейсов sdjd необходимо разрешение AccessSecurityLog.

Из приведённых выше разрешений только LogSecurityEvents является разрешением для приложений. Оно позволяет писать события, но не читать.

Описание свойств

ApiVersion : const string

Текущая версия интерфейса D-Bus-сервиса sdjd. Состоит из двух чисел: major.minor. Старшее число версии увеличивается при изменении API без обратной совместимости: переименование или удаление методов и аргументов, изменение типов аргументов. Младшее число увеличивается при совместимом с предыдущей версией расширением API. В настоящий момент доступна версия API 2.1. Таким образом, клиенты должны работать с сервисом при расширении API (изменении младшей цифры), кроме случаев, когда изменения несовместимы.

Описание сигналов

newEvent(const vector<string, Variant> &event)

Позволяет получать в реальном времени информацию о поступающих событиях безопасности. Одно событие передаётся в выходном параметре event, являющимся ассоциативным массивом, организованным по принципу ключ-значение, где ключом является строка, а значение — variant. Тип выбирается в зависимости от типа конкретного поля события. Подробное описание ключей приведено в таблице.

Ключ ASCII Описание
id t Уникальный идентификатор события. В данном случае это монотонно возрастающий номер
type u Тип события
usec t Время события в микросекундах с 01.01.1970
level y Уровень важности сообщения
message s Опциональный текст сообщения или пустая строка
pid i PID процесса-отправителя
ppid i PID родительского процесса для процесса-отправителя
ruid u UID процесса-отправителя
euid u Эффективный UID процесса-отправителя
suid u Сохранённый UID процесса-отправителя
fsuid u UID процесса-отправителя в файловой системе
rgid u Реальный GID процесса-отправителя
egid u Эффективный GID процесса-отправителя
sgid u Сохранённый GID процесса-отправителя
fsgid u GID процесса-отправителя в файловой системе
groups au Дополнительные группы процесса-отправителя
cap_effective t Эффективные привилегии процесса-отправителя
exe s Полный путь к исполняемому файлу процесса-отправителя
security_context s Контекст безопасности процесса-отправителя (текущая роль или метка SELinux)
event_string s Текстовое представление идентификатора события для удобства отладки
newEventFiltered(const vector<string, Variant> &event)

Работает аналогично сигналу newEvent, но получает информацию только о тех событиях безопасности, которые попали под фильтр, заданный при помощи метода applyFilter.

Описание методов

applyFilter(const string &filter, int32 &status)

Применяется приложением, когда нужно отфильтровать список событий, получаемых через события getEventsAfterId и getEventsAfterId, а также при подписке на сигнал newEventFiltered, чтобы присутствовала возможность в реальном времени отслеживать события, попавшие под заданный фильтр.

На вход получает строку filter в определённом формате, которая задаёт параметры фильтрации.

Для фильтров определены следующие параметры:

type
int, соответствующий id события из libomplog.h.
level
INFO_LEVEL, WARN_LEVEL, DEBUG_LEVEL, ALERT_LEVEL.
exe
Путь до исполняемого файла.
uid
ID пользователя, который запустил процесс. Только в режиме администратора можно задавать фильтр по этому параметру. В режиме пользователя возвращается ошибка.
cur_user_uuid
UUID пользователя в рамках сессии (см. currentUserUuid из user-managerd). Только в режиме администратора можно задавать фильтр по этому параметру. В режиме пользователя возвращается ошибка. Поле будет заполняться sdjd самостоятельно в соответствии с требованием о разделении логов для сессионных пользователей.
time
Метка времени, для которого требуется получать события (включает дату и время). Время задаётся в формате ISO 8601, c точностью до секунд: YYYY-MM-DDThh:mm:ss. Пример: 2005-08-09T18:31:42. Это наибольшая точность для времени. Если нужно получить данные за более длительный период, необходимо не добавлять единицы измерения. Например, 2021-12-09 позволит получить события за 9 декабря 2021 года.

Все поля являются опциональными, поэтому можно задать пустой фильтр, к которому sdjd самостоятельно добавит поле cur_user_uuid.

Поля задаются в строгом формате следующим образом:

критерий=значение из допустимых значений (если есть ограничения);

Кроме единичных значений, существуют поддержка диапазонов для полей type, uid, time. Диапазон задаётся двумя входящими пограничными значениями, которые разделены символом |.

Для разграничения и группирования параметров фильтрации используются разделители:

Разделитель Назначение
! Логическое отрицание
, Логическое «И» для значений в рамках одного параметра

Примеры простых фильтров:

  • фильтр для получения только событий об изменении пароля:
    type=5;
  • фильтр для получения событий за 11 февраля 2022 года для пользователя с UUID {cd6bcf2c-a6ba-46df-b622-319f07c90070}:
    time=2022-02-11;cur_user_uuid={cd6bcf2c-a6ba-46df-b622-319f07c90070};
  • фильтр для получения только критических событий от lipstick:
    level=ALERT_LEVEL;exe=/usr/bin/lipstick.

Примеры сложных фильтров:

  • фильтр для получения всех событий антивируса, кроме антивирусной информации:
    type=52|64,!62;
  • фильтр для получения всех критических событий в период с 00:30 до 5:30 2 января 2022 года:
    level=ALERT_LEVEL;time=2022-01-02T00:30|2022-01-02T05:30.
getEventsAfterId(uint64 id, vector<vector<string, Variant>> &events, bool &hasMore, bool &eventsMissed)

Позволяет получить массив событий с идентификаторами, большими, чем значение параметра id. Идентификатором события является 64-битное беззнаковое целое число. Нумерация событий начинается с 1. Чтобы получить все события в логе, требуется передать 0 в качестве начального идентификатора.

Данный метод возвращает события в виде массива словарей. Каждое отдельное событие представлено словарём (ассоциативным массивом), где ключом является строка, а значением – variant. Тип выбирается в зависимости от типа конкретного поля события.

Значение true у выходного параметра hasMore означает, что были переданы не все события, и клиент может продолжать вызывать данный метод для получения всех событий, передавая идентификатор последнего полученного события. Данный выходной параметр необходим из-за ограничений на размер сообщений D-Bus.

Значение true у выходного параметра eventsMissed означает, что в логе не нашлось события с номером id + 1, потому что с момента прошлого вызова метода лог был перезаписан полностью и часть старых событий оказалась недоступна, то есть произошла потеря событий с точки зрения клиента.

getLastEventId(uint64 &id)

Возвращает идентификатор последнего события в логе. Если в логе событий нет (в реальности эта ситуация невозможна), возвращается 0.

getNEventsAfterId(uint64 id, uint32 limit, vector<vector<string, Variant>> &events, bool &hasMore, bool &eventsMissed)

Работает аналогично методу getEventsAfterId, позволяет указать максимальное количество возвращаемых сообщений через параметр limit.

sendEvent(uint32 eventType, uint8 level, const string &message, int32 &status)

Предназначен для отправки событий в лог. Метод принимает: тип события в поле eventType, уровень важности события в поле level и опциональное сообщение в поле message. Список типов актуальных событий описан в таблице.

Идентификаторы важности указаны в следующей таблице:

Важность события Байт
INFO_LEVEL 1
WARN_LEVEL 2
DEBUG_LEVEL 3
ALERT_LEVEL 4

Метод возвращает status:

Код Статус отправки
0 Событие успешно отправлено в лог
-1 Неизвестен идентификатор события
-2 Неправильные параметры
-3 Системная ошибка
sendEventStringAlt(const string &eventType, const string &level, const string &message, int32 &status)

Работает аналогично методу sendEvent, принимает на вход те же поля, что и sendEvent, но в строковом представлении.

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.