Wie kann ich ausführbare Dateien verfolgen, die von meinem Benutzer unter Linux erstellt wurden?

11

Unter Linux möchte ich die ausführbaren Dateien verfolgen, die in meinem Namen ausgeführt werden, einschließlich der gesamten Befehlszeile (in der Praxis wird jeder exec * () als mein eigener Benutzer ausgeführt). Ein Programm, das ich nicht kontrolliere, soll, um eine Aufgabe zu erledigen, das Programm ausführen, das ich übergebe, aber ich möchte sicherstellen, dass es dies tut und welche Optionen es verwendet. Das Programm, das ich nicht kontrolliere, ist hinterhältig und scheint das Verhalten abhängig vom Namen des Programms zu ändern, das es für die Aufgabe ausführen soll. Daher kann ich kein Shell-Skript übergeben, das die Informationen protokolliert und das Real aufruft Programm.

Kann ich über alle Exec * () informiert werden, die als mein Benutzer auf dem System unter Linux ausgeführt wurden, einschließlich der vollständigen Befehlszeile? Das heißt, es läuft nicht psin einer Schleife. Ich mache es lieber direkt auf dem System, auf dem ich arbeite und keinen Root-Zugriff benötige, aber wenn nötig, kann ich ein System erzeugen, auf dem ich Root-Zugriff habe, die Programme installieren und dort nachforschen.

Verwenden von Ubuntu 12.4 LTS.

Pierre Lebeaupin
quelle
Ich frage hier eher als Ubuntu zu fragen, da es sich eher um eine Unix / Linux-Frage als um eine echte Ubuntu-Frage handelt.
Pierre Lebeaupin
1
Wie hinterhältig ist das Programm? Versucht es, Debugger zu erkennen oder zu umgehen? Ist es dynamisch verknüpft? Wenn es zu hinterhältig ist, müssen Sie möglicherweise eine virtuelle Maschine verwenden, auf der Sie root sind. (Dies ist möglicherweise die einfachste Strategie, selbst für ein Programm, das nicht besonders hinterhältig ist.)
Gilles 'SO - hör auf böse zu sein'
@ Gilles Das ist in der Tat eine Möglichkeit, ich werde eine VM ausprobieren und dann die Frage aktualisieren, ob sich herausstellt, dass dies funktioniert.
Pierre Lebeaupin
Hinweis: Sie möchten anscheinend tatsächlich den Programmnamen und die Argumente, die die Antwort mit auditgibt, aber eine 'ganze Befehlszeile' in der Shell kann sich auch auf den untergeordneten Prozess auswirken, indem Umleitungs- / Piping- und envvar-Einstellungen verwendet werden und Substitutionen / Erweiterungen sowie nicht signifikante Anführungszeichen enthalten und Abstand und Kontrollstrukturen wie doa && dob, und Sie werden diese nicht bekommen.
Dave_thompson_085

Antworten:

10

Sie müssen konfigurieren auditd, um execveEreignisse aufzuzeichnen . Beispiel für RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

Ich ignoriere die Bogenwarnung und es scheint keine Rolle zu spielen, aber Sie können sie verwenden -F arch=b64oder -F arch=b32einstellen, wenn Sie möchten.

Das Ergebnis des oben Gesagten ist:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

Das ist natürlich schnell und schmutzig, aber das sind die Grundlagen dafür, wie Sie es tun. Was Sie genau tun müssen, hängt wahrscheinlich stark davon ab, was Sie genau tun möchten. Sie können den Überwachungsfluss mithilfe verschiedener Filter im auditctlBefehl reduzieren, aber ich kenne keine dieser Informationen, sodass ich nicht weiß, was ich einschließen soll. Wenn Sie etwas Spezifischeres benötigen, empfehlen wir Ihnen, entweder die Manpage zu überprüfen oder einen Kommentar zu dieser Antwort zu schreiben, und ich werde sie weiter aktualisieren.

Ich hoffe, das hilft Ihnen, in die richtige Richtung zu gehen.

BEARBEITEN:

Da Ihre Frage die Betrachtung eines bestimmten Benutzers beinhaltet, kann ich Ihnen Folgendes zeigen:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Identisch mit den oben genannten, aber nur execvevon jemandem, der mit der effektiven Benutzer-ID von ausgeführt 16777216wird, wird protokolliert. Wenn Sie den loginuidWert des Benutzers angeben müssen (als den er sich ursprünglich am System angemeldet hat), filtern Sie auidstattdessen nach:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

AUID / loginuid-Filter wären beispielsweise nützlich, wenn der Benutzer ein suoder ein sudoRoot- Verfahren ausführt . In dieser Situation werden viele Dinge als root ausgeführt, aber Sie befassen sich nur mit den Dingen, die vom betreffenden Benutzer gestartet wurden. auditctlAußerdem können Sie Filter stapeln, sodass Sie nach beiden filtern können euidund auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"
Bratchley
quelle
1
"Beachten Sie, dass ich keinen Root-Zugriff habe". (Sonst wäre dies eine gute Antwort.)
Gilles 'SO - hör auf böse zu sein'
Verdammt ... so nah ...
Bratchley
Danke, das hat funktioniert. Ich sollte hinzufügen, dass ich auditctl per apt-get installieren musste, es war nicht unter Ubuntu vorinstalliert.
Pierre Lebeaupin
Vielen Dank. Schöne Beispiele. Aber gibt es eine Möglichkeit, den Exit-Code aus dem Überwachungsprotokoll zu entfernen?
Kaos
0

Sie haben etwas Einfaches gefragt. Ich habe ein Beispiel mit gemacht, mplayeraber ich denke, es kann an andere Situationen angepasst werden:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Wie Sie sehen, ist dies sehr einfach: Es analysiert das erste Argument, da es sich um eine Datei handelt, wird ein Protokoll in die zentrale Datei erstellt $LOGund zu einer Datei verkettet (die immer denselben Namen mplayer.logim selben Verzeichnis hat.

So kann der Benutzer den neuesten Film erhalten, den er in jedem Verzeichnis gelesen hat.

MUY Belgien
quelle
Das Q sagte ausdrücklich, dass das Ersetzen eines Skripts nicht funktionieren würde.
Dave_thompson_085
Möglich, aber das passt besser zu meiner Situation: Ich habe kein Sicherheitsproblem und kann das Skript auswählen, das ich ausführe. So unglaublich es auch scheinen mag, ich habe trotz dieser einfachsten und einfachsten Lösung vielleicht jemand anderes daran interessiert, sich nicht nur mit Geeks zu beschäftigen. Ich gebe zu, die vorherige Lösung ist sicherer!
MUY Belgien