Yanıtlar:
Bu denetim için mükemmel bir iş gibi geliyor. Modern RedHat tabanlı sistemlerde varsayılan bir hizmet olan denetleme çalıştıktan sonra, çalıştırarak tam olarak ne istediğinizi yapacak bir kural oluşturabilirsiniz
auditctl -a task,always -F uid=0
Bu komut kuralını bozarak, man sayfasını aşırı kullanarak şunları buluyoruz:
-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.
Bu nedenle, bir çatal veya klon sistemi çağrısı her çıktığında bu işlem için her zaman bir kayıt yazın.
Son seçenek bir filtre dizesi olarak düşünülebilir, kullanımımızda -F uid=0
bizi sadece süreç sahibinin uid'inin 0 olduğu durumlarda kısıtlar.
Bu kuralın, denetimin doğru şekilde yapılandırıldığından emin olarak ve kuralı
-a task,always -F uid=0
dağıtımınız için ilgili dosyaya ekleyerek büyük olasılıkla çalışma zamanında yürütülebilir./etc/audit/audit.rules
Bunun oldukça dang gürültülü olacağını ve günlük yorumlarınızı kimin yaptığını bunun için hazırlaması gerektiğini unutmayın.
Çekirdeğinizi CONFIG_PROC_EVENTS ve / veya CONFIG_KPROBES ile yeniden derlemeden bunu yapmanın temiz bir yolu olduğunu düşünmüyorum (bunu yapmanın bir yolu olup olmadığını bilmek isterim, bu yüzden sorunuzu iptal ettim).
İçinde / proc içinde dizin oluşturma için iwatch / inotify kullanma hakkında bir fikrim var ama işe yaramadı, ne audctl. Kirli olmasına rağmen, en iyi seçiminiz, ps'den bir betikteki değişiklik için sürekli olarak ayrıştırmak gibi görünüyor. Aşağıdaki Perl kodu bunu yapardı, ancak bazılarını özlemeye eğilimli ve göz ardı edilebilir ps
(aksi takdirde kendini tetikleyeceği gibi):
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"; } } }
Düşünebileceğim en iyi yol snoopy kütüphanesini oluşturmak olabilir . snoopy, sistem çağrılarına /etc/ld.so.preload
bağlanan ve etrafına saran çok küçük bir paylaşılan kütüphanedir execve()
. Hepsini exec()
veya yalnızca kökten gelenleri günlüğe kaydetmek için yapılandırılabilir . Mevcut enkarnasyonunda, snoopy eşleşen bir olay (sistem çağrısı execve()
) her gerçekleştiğinde syslog günlüğüne kaydeder . Yine de büyük bir program değil (en fazla birkaç yüz satır kod) ve etkinliği günlüğe kaydetmek (veya buna ek olarak) yerine bir komut dosyasını yürütmek için bu kadar zorlanmadan değiştirilebilir. Snoopy C harfiyle yazılmıştır.
Unutulmaması gereken birkaç nokta: