Solusi 1:
Ini terdengar seperti pekerjaan yang sempurna untuk auditd. Setelah Anda menjalankan audit, layanan default pada sistem berbasis RedHat modern, Anda dapat membuat aturan yang akan melakukan apa yang Anda inginkan dengan mengeksekusi
auditctl -a task,always -F uid=0
Melanggar aturan perintah ini, memanfaatkan halaman manual secara berlebihan, kami menemukan bahwa:
-a list,action task Add a rule to the per task list. This rule list is used only at the time a task is created -- when fork() or clone() are called by the parent task. When using this list, you should only use fields that are known at task creation time, such as the uid, gid, etc. always Allocate an audit context, always fill it in at syscall entry time, and always write out a record at syscall exit time.
Jadi, selalu tuliskan catatan untuk tindakan ini setiap kali panggilan sistem fork atau tiruan keluar.
Opsi terakhir dapat dianggap sebagai filter string, dalam penggunaan -F uid=0
kita hanya membatasi kami untuk kasus di mana uid dari pemilik proses adalah 0.
Perhatikan bahwa aturan ini dapat dijalankan pada waktu proses dengan memastikan bahwa auditd telah dikonfigurasi dengan benar, dan menambahkan aturan tersebut
-a task,always -F uid=0
ke dalam file yang relevan untuk distribusi Anda, kemungkinan besar /etc/audit/audit.rules
Perlu diingat bahwa ini akan sangat berisik, dan siapa pun yang melakukan tinjauan log Anda harus siap untuk itu.
Solusi 2:
Saya tidak berpikir ada cara yang bersih untuk melakukan ini tanpa mengkompilasi ulang kernel Anda dengan CONFIG_PROC_EVENTS dan/atau CONFIG_KPROBES (walaupun saya ingin tahu apakah ada cara untuk melakukannya, jadi saya telah menjawab pertanyaan Anda).
Saya memang punya ide untuk menggunakan iwatch/inotify untuk pembuatan direktori di dalam/proc tetapi sepertinya tidak berhasil, begitu pula auditctl. Sepertinya pilihan terbaik Anda, meskipun kotor, adalah terus mengurai ps untuk perubahan dari skrip. Kode Perl berikut akan melakukannya, meskipun cenderung melewatkan beberapa dan mengabaikan ps
(karena jika tidak akan memicu dirinya sendiri):
perl -e 'my %pids; while(1) { my @pids = `ps -U root -u root`; foreach (@pids) { next if /ps$/; ($pid) = /^\s*(\d+)\D/; if (!$pids{$pid}) { $pids{$pid}++; print "Process $pid created (" . `cat /proc/$pid/cmdline` . ")\n"; } } }