Ich möchte ein Skript ausführen, wenn ein neuer Root-Prozess gestartet wird. (unter Linux) Wie kann ich das einfach machen?
Vielen Dank
linux
unix
monitoring
process
Cerisier
quelle
quelle
Antworten:
Das klingt nach einem perfekten Job für auditd. Sobald Sie auditd, einen Standarddienst auf modernen RedHat-basierten Systemen, ausgeführt haben, können Sie eine Regel erstellen, die genau das tut, was Sie möchten, indem Sie sie ausführen
auditctl -a task,always -F uid=0
Wenn Sie diese Befehlsregel auflösen und die Manpage übermäßig nutzen, stellen Sie fest, dass:
Schreiben Sie daher immer einen Datensatz für diese Aktion, wenn ein Fork- oder Clone-Systemaufruf beendet wird.
Die letzte Option kann als eine Filterzeichenfolge betrachtet werden. Bei unserer Verwendung
-F uid=0
werden wir einfach auf Fälle beschränkt, in denen die UID des Prozesseigners 0 ist.Beachten Sie, dass diese Regel zur Laufzeit ausgeführt werden kann, indem Sie sicherstellen, dass auditd ordnungsgemäß konfiguriert ist, und die Regel
-a task,always -F uid=0
höchstwahrscheinlich in die für Ihre Distribution relevante Datei einfügen
/etc/audit/audit.rules
Denken Sie daran, dass dies ziemlich laut sein wird, und wer auch immer Ihre Protokollprüfungen durchführt, muss darauf vorbereitet sein.
quelle
Ich glaube nicht, dass es eine saubere Möglichkeit gibt, dies zu tun, ohne Ihren Kernel mit CONFIG_PROC_EVENTS und / oder CONFIG_KPROBES neu zu kompilieren (obwohl ich gerne wissen würde, ob es eine Möglichkeit gibt, dies zu tun, also habe ich Ihre Frage hochgestuft).
Ich hatte die Idee, iwatch / inotify für die Verzeichniserstellung in / proc zu verwenden, aber es schien nicht zu funktionieren, und auditctl auch nicht. Es sieht so aus, als ob Sie die beste Wahl treffen, obwohl Sie dreckig sind, wenn Sie ps kontinuierlich analysieren, um eine Änderung an einem Skript vorzunehmen. Der folgende Perl-Code würde es tun, obwohl er dazu neigen würde, etwas zu verpassen und zu ignorieren
ps
(da er sich sonst selbst auslösen würde):quelle
Der beste Weg, den ich mir vorstellen kann, wäre, die Snoopy- Bibliothek aufzubauen . snoopy ist eine sehr kleine gemeinsam genutzte Bibliothek, die sich in Systemaufrufe einhakt
/etc/ld.so.preload
und diese umschließtexecve()
. Es kann so konfiguriert werden, dass alleexec()
oder nur die von root protokolliert werden . In seiner aktuellen Inkarnation protokolliert sich snoopy jedes Mal in syslog, wenn ein passendes Ereignis (ein Systemaufruf anexecve()
) eintritt. Es ist jedoch kein großes Programm (höchstens ein paar Hundert Codezeilen) und kann ohne große Schwierigkeiten geändert werden, um ein Skript auszuführen, anstatt (oder zusätzlich zu) die Aktivität zu protokollieren. Snoopy ist in C geschrieben.Ein paar Dinge zu beachten:
quelle