Saya ingin mengeksekusi skrip ketika proses root baru muncul. (di Linux) Bagaimana saya bisa melakukan itu?
Terima kasih
Saya ingin mengeksekusi skrip ketika proses root baru muncul. (di Linux) Bagaimana saya bisa melakukan itu?
Terima kasih
Jawaban:
Ini kedengarannya 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 menjalankan
auditctl -a task,always -F uid=0
Melanggar aturan ini, menggunakan 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 garpu atau panggilan sistem kloning keluar.
Opsi terakhir dapat dianggap sebagai string filter, dalam penggunaan kami -F uid=0
hanya membatasi kita untuk kasus-kasus di mana uid dari pemilik proses adalah 0.
Perhatikan bahwa aturan ini dapat dijalankan pada saat dijalankan dengan memastikan bahwa auditd dikonfigurasi dengan benar, dan menambahkan aturan
-a task,always -F uid=0
ke file yang relevan untuk distribusi Anda, kemungkinan besar/etc/audit/audit.rules
Hanya perlu diingat bahwa ini akan sangat berisik, dan siapa pun yang melakukan tinjauan log Anda harus siap untuk itu.
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 menjawab pertanyaan Anda).
Saya memang punya ide untuk menggunakan iwatch / inotify untuk pembuatan direktori di dalam / proc tetapi tampaknya tidak berfungsi, begitu pula auditctl. Sepertinya pilihan terbaik Anda, meskipun kotor, adalah untuk terus mengurai ps untuk perubahan dari skrip. Kode Perl berikut akan melakukannya, meskipun cenderung akan melewatkan beberapa dan mengabaikannya ps
(karena hal itu 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"; } } }
Cara terbaik yang dapat saya pikirkan adalah membangun perpustakaan snoopy . snoopy adalah perpustakaan bersama yang sangat kecil yang terhubung /etc/ld.so.preload
dan membungkus execve()
panggilan sistem. Dapat dikonfigurasi untuk mencatat semua exec()
, atau hanya yang dari root. Dalam inkarnasi saat ini, snoopy log ke syslog setiap kali acara yang cocok (syscall to execve()
) terjadi. Ini bukan program besar (beberapa ratus baris kode, paling banyak), dan dapat dimodifikasi tanpa banyak kesulitan untuk mengeksekusi skrip alih-alih (atau selain) mencatat aktivitas. Snoopy ditulis dalam C.
Beberapa hal yang perlu diperhatikan: