Як реєструвати всі системні виклики, здійснені процесом, та всіх його нащадків за допомогою аудиту


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
omg, omg, omg, Стефан, задаючи питання ... (Я прийшов сюди просто з назви, думаючи strace -s^^, але тоді я побачив, хто питає, і одразу зрозумів, "він це знає вже!") ... Стефане, чи можете ви можливо: 1) скласти список підказок, використовуючи опцію "дерево" ps, 2) запустити auditctl (s) на всіх підписаних на дереві підписах? (тобто, чи можете ви мати кілька "pid = ...."? або кілька auditctl, кожен на один?) або "німий" спосіб: auditctl все, і якась неполадка на "pid | pid | pid", якщо вони відображаються в кожному рядку?) (застереження: Я не маю доступу до ATM Linux, тому я не маю уявлення, як з'являються дані)
Олів'є Дулак

трюк, який ви могли б використати (ще раз, я не знаю специфіки аудита, і не можу спробувати на даний момент): вкажіть конкретну змінну оточення під час запуску найвищого батьківського і ревізуйте всі процеси, що мають цю змінну?
Олів'є Дулак

@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 (але це, звичайно, не відображається зараз на сторінці сторінки): це може бути бути запропонованим (або ... написаним) для майбутньої версії. Я не пригадую якийсь спосіб "слідувати за деревом" процесів ... але ви можете, можливо, реалізувати один за одним), якщо якийсь сценарій виконує регулярні еквіваленти "ps-T", 2) інший сценарій вбиває 1-й, як тільки pid вмирає 3) щоразу, коли список pid з 1) змінюється, додає / видаляє auditctl для цих підписів? (не надто важко це зробити)
Олів'є Дулак

1
(мій останній коментар не вирішує pb для дуже короткочасних процесів ... для цього може знадобитися щось на самому рівні ядра, і я не знаю достатньо, щоб сказати вам, чи існує щось для цього. Можливо, варто питання списки розсилки ядра)
Олів'є Дулак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.