ไม่มีใครรู้วิธีง่าย ๆ ในการตรวจสอบกระบวนการรูต


13

ฉันต้องการเรียกใช้สคริปต์เมื่อกระบวนการรูทใหม่เกิดขึ้น (บน Linux) ฉันจะทำสิ่งนั้นได้อย่างไร?

ขอบคุณ


นี่เป็นคำถามที่น่าสนใจ แต่มีแอปพลิเคชันที่ใช้งานได้จริงหรือไม่ ฉันได้รับการ wracking สมองของฉันและฉันวาดภาพที่ว่างเปล่า ...
สตีเว่นจันทร์

คำตอบ:


9

ดูเหมือนจะเป็นงานที่สมบูรณ์แบบสำหรับ auditd เมื่อคุณเปิดใช้งาน auditd แล้วบริการเริ่มต้นบนระบบที่ใช้ RedHat สมัยใหม่คุณสามารถสร้างกฎที่จะทำสิ่งที่คุณต้องการโดยการดำเนินการ

auditctl -a task,always -F uid=0

การแบ่งคำสั่งนี้ออกกฎใช้ประโยชน์มากเกินไปของ man page เราพบว่า:

   -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.

ดังนั้นให้เขียนระเบียนสำหรับการกระทำนี้ทุกครั้งที่มีการเรียกระบบ fork หรือ clone ออก

ตัวเลือกสุดท้ายอาจถือได้ว่าเป็นสตริงตัวกรองในการใช้งานของเราจะ-F uid=0จำกัด เฉพาะกรณีที่ uid ของเจ้าของกระบวนการเป็น 0

โปรดทราบว่ากฎนี้สามารถดำเนินการได้ในขณะดำเนินการโดยตรวจสอบให้แน่ใจว่า auditd ได้รับการกำหนดค่าอย่างเหมาะสมและเพิ่มกฎ
-a task,always -F uid=0
ลงในไฟล์ที่เกี่ยวข้องสำหรับการแจกจ่ายของคุณ/etc/audit/audit.rules

เพียงจำไว้ว่าสิ่งนี้จะมีเสียงดังและใครก็ตามที่กำลังทำคำวิจารณ์บันทึกของคุณจะต้องมีการเตรียมพร้อมสำหรับมัน


จริงๆแล้วตอนนี้ฉันเขียนมันขึ้นมาทันใดนั้นฉันก็ตระหนักว่าฉันตอบคำถามในชื่อไม่ใช่คำถามในคำถาม ฉันหวังว่ามันจะยังคงมีประโยชน์
Scott Pack

ทำไมบางครั้งคุณใช้ pid = 0 และบางครั้ง uid = 0
Dakusan

@dakusan เป็นส่วนใหญ่เพราะฉันต้องการแก้ไข แก้ไขแล้ว
Scott Pack

2

ฉันไม่คิดว่ามีวิธีที่สะอาดในการทำเช่นนี้โดยไม่ต้องคอมไพล์เคอร์เนลของคุณอีกครั้งด้วย CONFIG_PROC_EVENTS และ / หรือ CONFIG_KPROBES (แม้ว่าฉันจะชอบที่จะรู้ว่ามีวิธีการทำเช่นนั้นหรือไม่

ฉันมีความคิดในการใช้ iwatch / inotify สำหรับการสร้างไดเรกทอรีภายใน / proc แต่ดูเหมือนจะไม่ทำงานและไม่ได้ auditctl ดูเหมือนว่าทางเลือกที่ดีที่สุดของคุณแม้ว่าสกปรกคือการแยกวิเคราะห์ ps อย่างต่อเนื่องเพื่อการเปลี่ยนแปลงจากสคริปต์ รหัส Perl ต่อไปนี้จะทำแม้ว่าจะมีแนวโน้มที่จะพลาดบางส่วนและไม่สนใจps(เพราะมันจะเรียกตัวเอง):

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"; } } }

คุณไม่มีใบเสนอราคาเดียวในตอนท้ายของรหัส ไม่สามารถแก้ไขได้เนื่องจาก SO ต้องการอย่างน้อย 6 ตัวอักษรในการเปลี่ยนแปลง นอกจากนี้สำหรับผู้ใช้ทั้งหมดให้ใช้ "-ax" แทน "-U root -u root"
Dakusan

1

วิธีที่ดีที่สุดที่ฉันคิดได้ก็คือการสร้างห้องสมุดสนูปปี้ snoopy เป็นไลบรารีที่ใช้ร่วมกันขนาดเล็กมากที่ได้รับการติด/etc/ld.so.preloadและล้อมรอบexecve()สายระบบ มันสามารถกำหนดค่าให้บันทึกทั้งหมดexec()หรือจากราก ในการเกิดในปัจจุบัน snoopy บันทึกการ syslog ทุกครั้งที่มีเหตุการณ์ที่ตรงกัน (syscall to execve()) เกิดขึ้น ไม่ใช่โปรแกรมขนาดใหญ่ (อย่างน้อยสองร้อยบรรทัดของโค้ด) และสามารถแก้ไขได้โดยไม่ต้องลำบากมากในการเรียกใช้สคริปต์แทน (หรือเพิ่มเติมจาก) การบันทึกกิจกรรม สนูปปี้เขียนด้วยภาษาซี

สิ่งที่ควรทราบ:

  • หากคุณเรียกใช้สคริปต์ทุกครั้งที่กระบวนการรูทเกิดขึ้นสคริปต์ของคุณจะเป็นกระบวนการรูทซึ่งจะต้องวางไข่สคริปต์อีกครั้งซึ่งจะเป็นกระบวนการรูตอีกครั้ง ฯลฯ โปรดระวังว่าคุณไม่ได้วนซ้ำ ที่นั่น
  • บนกล่องลีนุกซ์ทั่วไป, มีโพรเซสมากมายที่รันเป็นรูท, และวางไข่เป็นประจำ ตัวอย่างเช่น cron อาจวางระบบ cronjobs เป็น root ทุกนาทีหรือไม่กี่นาที หากคุณเพียงแค่กำลังมองหาสิ่งนี้ที่จะเกิดขึ้นเมื่อผู้ใช้เข้าสู่ระบบในฐานะรูทมันจะทำงานได้มากกว่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.