D-Bus-интерфейс sdjd
sdjd — это системный сервис сбора событий безопасности. Подробнее…
Шина: | системная |
Служба: | ru.omprussia.SystemLogs |
Объект: | /ru/omprussia/SystemLogs |
Интерфейс: | ru.omprussia.SystemLogs |
Cвойства
- ApiVersion : const string
Сигналы
- newEvent(const vector<string, Variant> &event)
- newEventFiltered(const vector<string, Variant> &event)
Методы
- 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
, но в строковом представлении.