Adakah yang tahu cara sederhana untuk memantau proses root menelurkan

13

Saya ingin mengeksekusi skrip ketika proses root baru muncul. (di Linux) Bagaimana saya bisa melakukan itu?

Terima kasih

pemain langit
sumber
Ini adalah pertanyaan yang menarik, tetapi apakah ada aplikasi praktis untuk ini? Saya telah mengacaukan otak saya dan saya sedang mengosongkan ...
Steven Monday

Jawaban:

9

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=0hanya 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.

Scott Pack
sumber
Sebenarnya, sekarang setelah saya menulis ini, tiba-tiba saya menyadari bahwa saya menjawab pertanyaan dalam judul, dan bukan pertanyaan dalam pertanyaan. Semoga bermanfaat.
Scott Pack
Mengapa Anda terkadang menggunakan pid = 0 dan terkadang uid = 0
Dakusan
@dakusan Kebanyakan karena saya butuh editor. Diperbaiki sekarang
Scott Pack
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 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"; } } }
James L.
sumber
Anda melewatkan satu kutipan di akhir kode Anda. Tidak dapat mengeditnya karena SO memerlukan setidaknya 6 karakter untuk berubah. Juga, untuk semua pengguna, gunakan "-ax" alih-alih "-U root -u root"
Dakusan
1

Cara terbaik yang dapat saya pikirkan adalah membangun perpustakaan snoopy . snoopy adalah perpustakaan bersama yang sangat kecil yang terhubung /etc/ld.so.preloaddan 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:

  • Jika Anda menjalankan skrip setiap kali proses root muncul, skrip Anda akan menjadi proses root, yang perlu memunculkan skrip lagi, yang akan menjadi proses root lain, dll. Berhati-hatilah agar Anda tidak masuk ke lingkaran sana.
  • Pada kotak Linux yang umum, ada banyak proses yang dijalankan sebagai root, dan muncul secara teratur. Sebagai contoh, cron dapat menelurkan cronjobs sistem sebagai root setiap menit atau beberapa menit. Jika Anda hanya mencari ini terjadi ketika pengguna login sebagai root, itu akan lebih berhasil.
Christopher Cashell
sumber