
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_input
Da Sie Ubuntu 12.04 verwenden, sehen Sie sich die über die Optionen und aktivierten E/A-Protokollierungsfunktionen an log_output
.
log_input
Wenn gesetzt,
sudo
wird 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-io
standardmäßig) und zwar mit einer eindeutigen Sitzungs-ID, die in der normalen sudo-Protokollzeile enthalten ist und mit dem Präfix beginntTSID=
. Mit deriolog_file
Option 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,
sudo
wird 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-io
standardmäßig) und verwendet dabei eine eindeutige Sitzungs-ID, die in der normalen sudo-Protokollzeile mit dem Präfix enthalten istTSID=
. Dieiolog_file
Option 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 -i
tut das Gleiche.
Antwort3
Mit zunehmender Komplexität gibt es drei Möglichkeiten zum Protokollieren der innerhalb von „sudo su -“ ausgegebenen Befehle:
- Verlassen Sie sich auf den Bash-Befehlsverlauf
- Installieren Sie einen Execve-Logging-Wrapper
- 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/profile
ob die Logger-Bibliothek in der Speicherzuordnung des Prozesses vorhanden ist ( /proc/<pid>/maps
), und wenn nicht, setzen Sie sie LD_PRELOAD
und starten Sie neu (mit exec $SHELL --login "$@"
). Alternativ können Sie einen Eintrag zu /etc/ld.so.preload hinzufügen mit $LIB/snoopy.so
oderäquivalente(r) Pfad(e)zu Ihren 32/64-Bit-Versionen von snoopy.so.
Obwohl es schwieriger ist, LD_PRELOAD
kö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: sudo
Das 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 auditctl
Beispiele 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 auditctl
und .audit.rules
ausearch