Как регистрировать все системные вызовы, сделанные процессом и его потомками, с помощью audd

13

я могу сделать

auditctl -a always,exit -S all -F pid=1234

Чтобы записать все системные вызовы, сделанные pid 1234 и:

auditctl -a always,exit -S all -F ppid=1234

Для своих детей, но как мне охватить внуков и их детей (нынешних и будущих)?

Я не могу полагаться на (e) uid / (e) gid, которые меняются.

(обратите внимание, что использование straceтоже не вариант)

Стефан Шазелас
источник
4
Боже мой , Боже мой , Стефан задает вопрос ... (Я пришел сюда только из заголовка, подумав strace -s^^, но потом я увидел, кто спрашивал, и сразу понял, что "он это уже знает!") ... Стефан, вы можете возможно: 1) построить список pids, используя опцию «tree» ps, 2) запустить auditctl (s) для всех pids, перечисленных в дереве? (то есть, у вас может быть несколько «pid = ....»? или несколько audctl, каждый по одному?) или «тупой» способ: audctl everything, и какой-то egrep для «pid | pid | pid», если они появляются в каждой строке?) (предостережение: у меня нет доступа к linux atm, поэтому я понятия не имею, как появляется информация)
Оливье Дюлак
трюк, который вы могли бы использовать (еще раз, я не знаю специфики Auditd, и я не могу попробовать в данный момент): указать конкретную переменную окружения при запуске самого верхнего родителя, и Auditctl всех процессов с этой переменной?
Оливье Дюлак
@OlivierDulac, пометка процесса каким-то образом (который наследуется детьми) - это одна вещь, которую я имею в виду. Но список правил аудита, с которыми можно сопоставить, довольно тонкий (даже sid, pgid ...). Может быть, SELinux, но я не знаю, что в первую очередь о SELinux. Может быть, обрабатывать пространства имен?
Стефан Шазелас
может быть, самый верхний родитель может быть в своей собственной группе процессов? ( en.wikipedia.org/wiki/Process_group )
Оливье Дюлак
2
Я подумал, может быть, запустить вашу программу в определенном контейнере, если это вариант для вас. Если я правильно понимаю этот поток ошибок , это должно работать с ядром ≥3.13. Кроме этого, я не вижу никакого другого метода, кроме SELinux и UID аудита . Подойдет ли AUID для вашего варианта использования?
Жиль "ТАК - перестать быть злым"

Ответы:

1

Просто предлагая что-то, не имея возможности попробовать это прямо сейчас ... но просто догадываясь из самого поста

Вот предложение решения:

Предполагая, что самый верхний идентификатор процесса находится в $ pid, и что в linux также ps -Tвыдает дерево процессов (в настоящее время у меня нет доступа к linux)

for eachpid in $(ps -T "$pid" | awk '{print $1}' | grep -v 'PID')
do
   auditctl -a always,exit -S all -F pid=$eachpid  >somelog_${eachpid}.log 2>&1
done

Конечно, замените ps -T "$pid"его эквивалентом для linux, если тот не работает на linux (или найдите его, запустив вывод «pstree -p», pid будет в скобках)

Оливье Дюлак
источник
2
Спасибо, но это не распространяется на «будущих» детей, и выполнение этого в цикле часто не будет охватывать недолговечные процессы. И повторное использование pid также может вызвать проблемы.
Стефан Шазелас
все действительные точки ... Тогда я считаю, что то, что вы хотите, это, вероятно, "наиболее востребованная" функция, и, следовательно, она уже может присутствовать на уровне audctl (но она, конечно, не отображается прямо сейчас на странице руководства): она может иметь быть предложенным (или ... написанным) для будущей версии. Я не помню, чтобы какой-то способ «следовал за деревом» процессов ... но вы могли бы реализовать один за другим: 1) иметь какой-нибудь скрипт, выполняющий обычные эквиваленты «ps -T», 2) другой скрипт убивает первый, как только pid умирает 3) каждый раз, когда список pid из 1) изменяется, добавить / удалить audctl для этих pids? (не слишком сложно сделать)
Оливье Дюлак
1
(Мой последний комментарий не решает pb для очень недолговечных процессов ... это может потребовать чего-то на самом уровне ядра, и я не знаю достаточно, чтобы сказать вам, существует ли что-то для этого. Может быть, стоит списки рассылки ядра)
Оливье Дюлак