Gibt es eine einfache Möglichkeit, alle ausgeführten Befehle einschließlich der Befehlszeilenargumente zu protokollieren?

11

Ich versuche herauszufinden, wie eine bestimmte Instanziierung protokolliert werden kann rrdtool, um festzustellen, ob der empfangene Pfad falsch ist.

Ich weiß, dass ich die ausführbare Datei in ein Shell-Skript einbinden könnte, das die Parameter protokolliert, aber ich habe mich gefragt, ob es eine kernelspezifische Möglichkeit gibt, dies zu überwachen, möglicherweise einen Dateisystem-Rückruf, der erkennt, wann ein bestimmtes / proc / pid / exe vorliegt stimmt mit einer bestimmten Binärdatei überein?

Peter Grace
quelle
Gibt es eine Möglichkeit, auditddie Befehlszeilenargumente sowie das ausgeführte Programm aufzuzeichnen? serverfault.com/questions/765179/…
Neil

Antworten:

16

Ja, es gibt eine Kernelfunktion: das Audit-Subsystem. Der auditdDämon führt die Protokollierung durch, und der Befehl auditctlrichtet die Protokollierungsregeln ein. Sie können alle Anrufe mit einigen Filtern an einem bestimmten System protokollieren. Wenn Sie alle ausgeführten Befehle und ihre Argumente protokollieren möchten, protokollieren Sie den execveSystemaufruf:

auditctl -a exit,always -S execve

Fügen Sie der ausführbaren Programmdatei einen Filter hinzu, um den Aufruf eines bestimmten Programms gezielt zu verfolgen:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

Die Protokolle werden in angezeigt /var/log/audit.log oder überall dort angezeigt, wo Ihre Distribution sie platziert. Sie müssen root sein, um das Audit-Subsystem zu steuern.

Verwenden Sie nach Abschluss der Untersuchung dieselbe Befehlszeile mit, -danstatt -aeine Protokollierungsregel zu löschen oder auszuführenauditctl -D , um alle Überwachungsregeln zu löschen.

Zum Debuggen bietet das Ersetzen des Programms durch ein Wrapper-Skript mehr Flexibilität beim Protokollieren von Elementen wie der Umgebung, Informationen zum übergeordneten Prozess usw.

Gilles 'SO - hör auf böse zu sein'
quelle
Warum das -F path=/ust/bin/rrdtool? Ich verstehe nicht, wie rrdtoolüberhaupt verwandte Software ist.
Graeme
@Graeme Das in der Frage beschriebene Problem bestand darin, einen Aufruf von zu verfolgen rrdtool. Wenn Sie Aufrufe aller Programme protokollieren möchten, löschen Sie das -F path=…Teil (Sie erhalten natürlich viele Protokolle).
Gilles 'SO - hör auf böse zu sein'
Richtig ... erste Zeile der Frage. Vielen Dank.
Graeme
Das ist alles großartig, aber wie setze ich die Konfiguration auf den Ausgangszustand zurück? Andernfalls wird das Protokoll weiterhin mit neuen und neu gestarteten Befehlen gefüllt ... oder ist dieser auditctlBefehl nur bis zum Neustart wirksam?
Ruslan
@ Ruslan Der Effekt von auditctlbleibt nur bis zum Neustart bestehen, aber das ist trotzdem ein guter Punkt. Ich habe Anweisungen zum Entfernen hinzugefügt, ohne meine Antwort neu zu starten.
Gilles 'SO - hör auf böse zu sein'
6

Sie könnten snoopy verwenden .

Snoopy ist eine leichtere Lösung, da keine Kernel-Kooperation erforderlich ist. Alles, was benötigt wird, ist ein dynamischer Loader (dl), der die Snoopy-Bibliothek vorlädt, deren Pfad in angegeben ist /etc/ld.so.preload.

Offenlegung: Ich bin derzeit Snoopy Maintainer.

Bostjan Skufca
quelle
Ist es möglich, nur Befehle zu protokollieren, die direkt oder indirekt von einer bestimmten Shell stammen?
RV
Ich bin nicht sicher, ob ich Ihre Frage verstehe. Meinen Sie "Shell" als spezifisches Programm, das als Shell verwendet wird (Bash, Dash, Zsh usw.), oder Sie meinen, Sie möchten nur ein bestimmtes PTY protokollieren? Snoopy bietet ein Filter-Framework, aber derzeit sind nur einige sehr grundlegende Filter implementiert. Die Liste finden Sie hier: Link . Wenn Sie einen konkreten Anwendungsfall haben, der möglicherweise auf andere anwendbar ist, erläutern Sie dies bitte in der Funktionsanfrage. Patches sind übrigens willkommen :)
Bostjan Skufca,
Ich meinte nur einen bestimmten PTY.
RV
Es gibt keinen speziellen Filter für PTY-Geldautomaten. Sie können jedoch snoopy verwenden, um alles zu protokollieren, einschließlich des PTY, auf dem das Ereignis aufgetreten ist, und dann die Filterung in Ihrem Syslog-Daemon durchführen. Ich weiß nicht, welches Sie verwenden, aber syslog-ng (zum Beispiel) kann Regex-Matching durchführen, positiv oder negativ.
Bostjan Skufca
Sicher Danke! Das Tool und der Ansatz sind im Allgemeinen sehr nützlich. Ich kann leicht filtern, um das zu bekommen, was ich brauche.
RV
2

Das Linux-Kernel-Subsystem "audit" kann das tun, was Sie brauchen.

zB wenn Sie diese Befehle ausführen:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

Dann wird jedes Ausführungsereignis protokolliert und es werden viele Informationen dazu bereitgestellt

zB das ist die Ausgabe von mir läuft tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

Es gibt einige interessante Werte, die gesehen werden können; Beispiel: "auid" ist 500, was meine Login-ID ist, obwohl "uid" Null ist (weil ich unter laufe su). Auch wenn der Benutzer möglicherweise das Konto gewechselt hat suoder sudowir dennoch auf seine "Audit-ID" zurückgreifen können

Jetzt gehen diese auditctlBefehle bei einem Neustart verloren. Sie können sie in eine Konfigurationsdatei einfügen (z. B. im /etc/audit/rules.d/Verzeichnis unter CentOS 7). Der genaue Speicherort hängt von Ihrer Betriebssystemversion ab. Die auditctlHandbuchseite soll hier helfen.

Beachten Sie jedoch, dass dadurch viele Protokollnachrichten generiert werden. Stellen Sie sicher, dass Sie genügend Speicherplatz auf der Festplatte haben!

Bei Bedarf können die Regeln auf einen bestimmten Benutzer oder einen bestimmten Befehl beschränkt werden.

Und auch Vorsicht; Wenn ein Benutzer das Kennwort in die Befehlsausführung eingibt (z. B. mysql --user=username --password=passwd), wird dies protokolliert.

Stephen Harris
quelle