So protokollieren Sie alle Systemaufrufe eines Prozesses und aller seiner Nachkommen mit auditd

12

ich kann

auditctl -a always,exit -S all -F pid=1234

So protokollieren Sie alle Systemaufrufe von PID 1234 und:

auditctl -a always,exit -S all -F ppid=1234

Für seine Kinder, aber wie decke ich die Enkel und ihre Kinder (gegenwärtig und zukünftig) ab?

Ich kann mich nicht auf (e) uid / (e) gid verlassen, die sich ändern.

(Beachten Sie, dass die Verwendung auch stracekeine Option ist.)

Stéphane Chazelas
quelle
4
omg, omg, omg, Stephane fragt eine Frage ... (Ich kam hier nur aus dem Titel, denken strace -s^^ aber dann habe ich sah , wer fragte , und wusste sofort , „er , dass schon weiß!“) ... Stephane, können Sie Vielleicht: 1) Erstelle die Liste der Pids mit der "Baum" -Option von ps, 2) starte auditctl (s) für alle im Baum aufgelisteten Pids? (dh können Sie mehrere "pid = ...." oder mehrere auditctl haben, jeweils auf einem?) oder die "dumme" Methode: auditctl alles und eine Art egrep auf dem "pid | pid | pid", wenn sie erscheinen in jeder Zeile?) (Vorsichtsmaßnahme: Ich habe keinen Zugang zu Linux Atm, daher habe ich keine Ahnung, wie Infos erscheinen)
Olivier Dulac
Ein Trick, den Sie vielleicht anwenden könnten (ich kenne die Besonderheiten von auditd noch nicht und kann es auch im Moment nicht versuchen): Geben Sie eine bestimmte Umgebungsvariable an, wenn Sie das oberste übergeordnete Element starten, und prüfen Sie alle Prozesse, für die diese Variable festgelegt ist.
Olivier Dulac
@OlivierDulac, den Prozess in irgendeiner Weise zu markieren (das wird von Kindern geerbt), ist eine Sache, die ich im Sinn habe. Aber die Liste der Dinge, mit denen Prüfregeln übereinstimmen können, ist ziemlich dünn (nicht einmal sid, pgid ...). Vielleicht die SELinux, aber ich kenne SELinux nicht als erstes. Vielleicht Namensräume verarbeiten?
Stéphane Chazelas
Vielleicht kann der oberste Elternteil in einer eigenen Prozessgruppe sein? ( de.wikipedia.org/wiki/Prozessgruppe )
Olivier Dulac
2
Ich dachte, Sie könnten Ihr Programm in einem bestimmten Container ausführen, wenn dies für Sie eine Option ist. Wenn ich diesen Bug-Thread richtig verstehe , sollte das mit einem Kernel ≥3.13 funktionieren. Abgesehen davon sehe ich keine andere Methode als SELinux und die Audit-UID . Wäre die AUID für Ihren Anwendungsfall anwendbar?
Gilles 'SO- hör auf böse zu sein'

Antworten:

1

Schlagen Sie einfach etwas vor, ohne dass Sie es jetzt ausprobieren können ... aber raten Sie einfach von der Post aus

Hier ist ein Lösungsvorschlag:

Angenommen, die oberste Prozess-ID befindet sich in $ pid, und auch unter Linux wird der Prozessbaum ausgegeben ps -T(ich kann momentan nicht auf Linux zugreifen).

for eachpid in $(ps -T "$pid" | awk '{print $1}' | grep -v 'PID')
do
   auditctl -a always,exit -S all -F pid=$eachpid  >somelog_${eachpid}.log 2>&1
done

Ersetzen Sie natürlich durch ps -T "$pid"das Äquivalent für Linux, wenn dieses unter Linux nicht funktioniert (oder indem Sie die Ausgabe "pstree -p" aktivieren, wird die pid in Klammern gesetzt).

Olivier Dulac
quelle
2
Vielen Dank, aber das gilt nicht für "zukünftige" Kinder, und das Ausführen in einer Schleife gilt häufig nicht für kurzlebige Prozesse. Und die Wiederverwendung von PID würde ebenfalls ein Problem verursachen.
Stéphane Chazelas
alle gültigen Punkte ... Dann glaube ich, dass das, was Sie wollen, wahrscheinlich ein "meistgesuchtes" Feature ist und daher bereits auf der Auditctl-Ebene vorhanden sein könnte (aber es wird momentan sicherlich nicht in der Manpage angezeigt): Möglicherweise hat es für eine zukünftige Version vorgeschlagen (oder geschrieben) werden. Ich kann mich nicht erinnern, wie ich einem Baum von Prozessen folgen könnte ... aber Sie könnten vielleicht einen nach dem anderen implementieren, indem Sie ein Skript reguläre "ps-t" -Äquivalente ausführen lassen. 2) Ein anderes Skript beendet das erste, sobald es fertig ist Die PID stirbt 3) Jedes Mal, wenn sich die Liste der PIDs von 1) ändert, wird das AuditCTL für diese PIDs hinzugefügt / entfernt. (nicht zu schwer zu tun)
Olivier Dulac
1
(Mein letzter Kommentar löst die Pb nicht für sehr kurzlebige Prozesse. Möglicherweise ist etwas auf Kernelebene selbst erforderlich, und ich weiß nicht genug, um Ihnen zu sagen, ob es dafür etwas gibt. Vielleicht ist es eine Frage wert die Kernel-Mailinglisten)
Olivier Dulac