Wie protokolliere ich Befehle innerhalb eines „sudo su -“?

Wie protokolliere ich Befehle innerhalb eines „sudo su -“?

Wenn ich:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

Dann kann ich das in den Protokollen sehen:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

aber wenn ich:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

Ich kann es nicht in den Protokollen sehen:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

Meine Frage: Wie kann ich die Protokollierung für die Befehle innerhalb von "sudo su -" einschalten?

Das Betriebssystem ist Ubuntu 12.04, die Frage ist jedoch allgemeiner Natur.

UPDATE#1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

Antwort1

log_inputDa Sie Ubuntu 12.04 verwenden, sehen Sie sich die über die Optionen und aktivierten E/A-Protokollierungsfunktionen an log_output.

log_input

    Wenn gesetzt, sudowird der Befehl in einem Pseudo-TTY ausgeführt und alle Benutzereingaben protokolliert. Wenn die Standardeingabe aufgrund einer E/A-Umleitung oder weil der Befehl Teil einer Pipeline ist, nicht mit dem TTY des Benutzers verbunden ist, wird diese Eingabe ebenfalls erfasst und in einer separaten Protokolldatei gespeichert.

    Die Eingabe wird in das durch die Option angegebene Verzeichnis protokolliert iolog_dir( /var/log/sudo-iostandardmäßig) und zwar mit einer eindeutigen Sitzungs-ID, die in der normalen sudo-Protokollzeile enthalten ist und mit dem Präfix beginnt TSID=. Mit der iolog_fileOption kann das Format der Sitzungs-ID gesteuert werden.

    Beachten Sie, dass Benutzereingaben vertrauliche Informationen wie Passwörter enthalten können (auch wenn sie nicht auf dem Bildschirm angezeigt werden), die unverschlüsselt in der Protokolldatei gespeichert werden. In den meisten Fällen ist es lediglich erforderlich, die Befehlsausgabe über log_output zu protokollieren.

log_output

    Wenn gesetzt, sudowird der Befehl in einem Pseudo-TTY ausgeführt und alle Ausgaben, die an den Bildschirm gesendet werden, protokolliert, ähnlich dem Befehl script(1). Wenn die Standardausgabe oder der Standardfehler aufgrund einer E/A-Umleitung oder weil der Befehl Teil einer Pipeline ist, nicht mit dem TTY des Benutzers verbunden ist, wird diese Ausgabe ebenfalls erfasst und in separaten Protokolldateien gespeichert.

    Die Ausgabe wird in das durch die Option angegebene Verzeichnis protokolliert iolog_dir( /var/log/sudo-iostandardmäßig) und verwendet dabei eine eindeutige Sitzungs-ID, die in der normalen sudo-Protokollzeile mit dem Präfix enthalten ist TSID=. Die iolog_fileOption kann verwendet werden, um das Format der Sitzungs-ID zu steuern.

    Ausgabeprotokolle können mit dem Dienstprogramm sudoreplay(8) angezeigt werden, mit dem auch die verfügbaren Protokolle aufgelistet oder gesucht werden können.

IMPLEMENTIERUNG: Mindestens Sudo-Version: 1.7.4p4 erforderlich.

/etc/sudoersÄnderung: Sie müssen lediglich allen erforderlichen Sudoers-Einträgen (wo „su“ angegeben ist, entweder mit Befehl oder Alias) zwei Tags hinzufügen: LOG_INPUT und LOG_OUTPUT.

Beispiel:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

Fügen Sie die folgende Standardstruktur für das Protokollverzeichnis hinzu sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}

Antwort2

Ihr grep„When doing“ sudo su -schlägt fehl, weil Sie nicht ausführen echo 1234567zz, sondern ausführen su -, wodurch eine Shell gestartet wird. Die Shell führt dann Ihr aus echo.

Dies ist Absicht, und das Protokollieren jedes einzelnen ausgeführten Befehls würde Ihr Syslog mit nutzlosen Informationen überfluten (normalerweise werden im Hintergrund Unmengen von Programmen ausgeführt, die Sie normalerweise nicht sehen).

Wenn Sie Ihr grep ändern, grep 'COMMAND=/bin/su -' *werden Sie es sehen.


sudo su -ist auch eine sinnlose Verwendung von su. sudo -itut das Gleiche.

Antwort3

Mit zunehmender Komplexität gibt es drei Möglichkeiten zum Protokollieren der innerhalb von „sudo su -“ ausgegebenen Befehle:

  1. Verlassen Sie sich auf den Bash-Befehlsverlauf
  2. Installieren Sie einen Execve-Logging-Wrapper
  3. Verwenden Sie auditd von SELinux

Was geeignet ist, hängt wirklich davon ab, was Sie mit der Protokollierung erreichen möchten.

1) Bash-Befehlsverlauf

Sie sollten die History-Funktion so konfigurieren, dass genügend Zeilen erhalten bleiben, keine Einträge aus anderen Sitzungen überschrieben werden, keine Befehle ignoriert werden und entsprechende Zeitstempel vorhanden sind. (Siehe HIST*-Variablen imBash-Handbuch). Kann leicht umgangen werden, indem man die Verlaufsdatei bearbeitet, die Umgebung manipuliert oder eine andere Shell ausführt.

2) Execve-Wrapper

Snoopy-Loggerist eins. Fügen Sie eine Überprüfung hinzu, /etc/profileob die Logger-Bibliothek in der Speicherzuordnung des Prozesses vorhanden ist ( /proc/<pid>/maps), und wenn nicht, setzen Sie sie LD_PRELOADund starten Sie neu (mit exec $SHELL --login "$@"). Alternativ können Sie einen Eintrag zu /etc/ld.so.preload hinzufügen mit $LIB/snoopy.sooderäquivalente(r) Pfad(e)zu Ihren 32/64-Bit-Versionen von snoopy.so.

Obwohl es schwieriger ist, LD_PRELOADkönnte die Version des oben Gesagten mit Umgebungsvariablen immer noch unterlaufen werden, indem die Ausführungsumgebung so manipuliert wird, dass der Schnüffelcode nicht länger ausgeführt wird.

Damit die Inhalte vertrauenswürdig sind, sollte das Syslog außerhalb der Box gesendet werden.

3) geprüft

Etwas einfacher zu konfigurieren als der Execve-Wrapper, aber schwieriger, die Informationen daraus zu extrahieren. Dies ist die Antwort auf die Frage, die Sie sich wahrscheinlich wirklich stellen: „Gibt es eine Möglichkeit, zu protokollieren, welche Auswirkungen der Benutzer auf ein System hatte, nachdem er etwas ausgegeben hat sudo su -?“. Syslog sollte außerhalb der Box gesendet werden, damit die Inhalte vertrauenswürdig sind.

DasServerfehler-Antwortscheint eine ziemlich umfassende Konfiguration für die Verwendung mit auditd zu sein.

Es gibt noch einige andere Vorschläge für eineähnliche Frage zu Serverfault.

Antwort4

Wie andere bereits gesagt haben: sudoDas geht nicht.

Verwenden Sie stattdessen auditd. Wenn Sie sich anmelden möchtenallesvon root erledigt werden (einschließlich z. B. Dinge, die von crontab erledigt werden), verwenden Sie Folgendes:

sudo auditctl -a exit,always -F euid=0

ETA: Beachten Sie, dass die Protokollierung aller Daten die Leistung beeinträchtigt. Sie sollten sie daher wahrscheinlich etwas einschränken. man auditctlBeispiele finden Sie hier.

Wenn Sie nur Systemaufrufe protokollieren möchten, bei denen die ursprüngliche Anmelde-UID nicht „root“ ist, verwenden Sie stattdessen Folgendes:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

Die Protokolle landen normalerweise im Verzeichnis /var/log/audit/audit.log. Sie können sie mit durchsuchen ausearch.

Weitere Informationen finden Sie in den Manpages für auditctlund .audit.rulesausearch

verwandte Informationen