Я пытаюсь написать процесс на C / C ++, который будет анализировать события audd в режиме реального времени.
В настоящее время я использую плагин af_unix для чтения событий аудита из сокета Unix (/var/run/audisp_events
по умолчанию).
Я пытался с помощью select()
, recv()
потреблять события из сокета следующим образом:
select(FD_SETSIZE, &set, NULL, NULL, NULL);
recv(sockfd, message, size, MSG_DONTWAIT);
А затем отправка в auparse callback для синтаксического анализа буфера пример:
auparse_feed(au, buf, (size_t)len);
auparse_flush_feed(au);
Проблема здесь в том, что события audd могут быть событиями с несколькими записями (например, SYSCALL) и использовать recv()
потребляют только некоторые записи, а не все, поэтому при обратном вызове синтаксического анализа у меня нет всей информации.
Затем я попытался с помощью getline()
потреблять одну запись за раз, но я все еще не могу определить, является ли запись одним событием записи или событиями с несколькими записями.
После прочтения документации audd Вот, Я нашел это:
EOE Triggered to record the end of a multi-record event.
Я могу использовать это, чтобы знать, когда прекратить потребление (потому что getline()
это операция блокировки) но EOE
Событие существует только в событиях с несколькими записями.
Мои вопросы:
af_unix
плагин — лучший способ использовать события audd в режиме реального времени?Для этого вы должны использовать плагин Audit Dispatcher (audisp).
Вот некоторые ресурсы:
handle_event
функцияЧтобы узнать количество записей в событии, позвоните auparse_get_num_records.
Других решений пока нет …