2013-03-29 18 views
6

Ich möchte alle Befehle in Unix/Linux von jedem Benutzer erfasst erfassen. Es gibt einige Alternativen wie die Verwendung von Script-Befehl oder Acct-Dienstprogramm. Aber das Problem mit ihnen ist, dass sie alles vom Terminal in eine Datei stumm oder nur die Zusammenfassung der Befehle bereitstellen. Ich suche nach einem Dienstprogramm, wo es mir alle Befehle geben wird, die von jedem Benutzer mit den Argumenten für die Befehle eingegeben werden. Ist es möglich? Gibt es Alternativen, wie zum Beispiel einen Haken bei Systemaufrufen zu machen?Wie erfasst man alle Befehle, die von einem Benutzer in Unix/Linux eingegeben wurden?

+2

Ist Shell-Geschichte eine praktikable Option? – wei2912

+0

Ich möchte nicht die Geschichte von Bash oder einer anderen Shell verwendet werden. – vinayag

+1

Ausgezeichnete Antwort auf: http://serverfault.com/questions/470755/log-all-commands-run-by-admins-on-production-servers – IvanD

Antwort

4

Es scheint einen ziemlich guten Artikel über Shell-Auditing bei http://administratosphere.wordpress.com/2011/05/20/logging-every-shell-command/ zu geben.

Dies berücksichtigt Dinge wie die Zuverlässigkeit von Benutzerverlaufsdateien (und bietet Informationen zur Verbesserung dieser), diskutiert aber auch explizite Prüffunktionen, die in Shells integriert sind. Es kann sein, dass in jeder Umgebung, die Sie verwenden, die Shells mit aktivierten Auditing-Funktionen nicht kompiliert werden. Wenn Sie jedoch die Quelle und Konfiguration für Ihre Builds zur Verfügung haben (wie Sie es zumindest für jede Linux-Distribution tun würden), Es ist zu schwierig, die Überwachungsfunktion zu aktivieren, während der Rest der Konfiguration so bleibt wie in der Standardverteilung.

Was dieser Ansatz noch offen lassen würde, sind die Befehle, die durch andere Befehle ausgeführt werden - oder Betriebssystemfunktionen, die in einem Programm aufgerufen werden. Also, zum Beispiel wenn Sie Perl haben, oder jede andere Programmiersprache Dolmetscher auf der Maschine, während Sie möglicherweise die Ausführung von Perl überprüfen kann, kann man nicht sagen, was der Benutzer den Perl-Interpreter gesagt hatte zu tun. Auf der anderen Seite bin ich selbst bei der Shell-Überwachung nicht sicher, ob die Perl-Ausführung gesehen werden würde, wenn sie beispielsweise ausgeführt würde. innerhalb eines Editors (wie vi) als Filter, um alles zu verarbeiten, was im Editor geschrieben wurde. So

, während Shell Revision Sie bieten eine Schicht aus Wirtschaftsprüfung, ist der Gewinn nicht so toll, es sei denn Ihre Umgebung wirklich gegen andere Wege der Ausführung angezogen wird als die Schale.

sollten Sie prüfen, ob die Benutzer tatsächlich benötigen Zugriff Shell geprüft werden - und wenn nicht, sie mit etwas begrenzten, mit Prüffunktionen. Ein kleines textbasiertes Menüsystem, vielleicht?

0

Schnappen /home/victim/.bash_history oder /home/victim/.config/fish/fish_history

Diese lassen Sie alle bash und Fisch-Shell-Befehle mit args sehen, die vom Benutzer eingegeben ws.

+0

Der Frage Schöpfer wollte explizit NICHT die Geschichte zu verwenden. –

0

Der einfachste Weg, dies zu lösen, ist, wenn Sie root und in der Lage sind, die Systemdateien zu ändern, indem Sie leiten Sie die Konsole selbst auf diese Weise:

Wenn Sie zum Beispiel /bin/sh als Standardkonsole, um es zu /bin/hs bewegen und eine Datei wie diese unter /bin/sh erstellen:

#!/bin/hs 

ORIGSHELL=/bin/hs 
LOGFILE=/var/log/whatyoulike 

OPTIONS="[email protected]" 

USER=`whoami` 
WEBUSER=web 
WILD=NO 
WARN=NO 



if [ "$USER" = "$WEBUSER" ] 
then 

    #Ok then - are we doing something wild? 
    for ARG in [email protected] 
    do 
    case "$ARG" in 
    *\/lynx) 
     WILD=YES 
     ;; 
    *\/wget) 
     WILD=YES 
     WARN=YES 
     ;; 
    *\/curl) 
     WILD=YES 
     WARN=YES 
     ;; 
    *\/links) 
     WILD=YES 
     WARN=YES 
     ;; 
    *\/fetch) 
     WILD=YES 
     WARN=YES 
     ;; 
    esac 
    done 

    #Are we wild? 
    if [ "$WILD" = "YES" ] 
    then 
    HOST=`hostname` 
    IPADDR=`resolveip -s $HOST` 
    NETSTAT=`/usr/bin/nighthawk -ape --numeric-hosts --numeric-ports --tcp | grep 'ESTABLISHED web'` 

    # Log it. 
    echo "`date` [$USER] $IPADDR "[email protected]"" >> $LOGFILE 
    echo "$NETSTAT" >> $LOGFILE 
    fi 
    #Are we REALLY wild? 
    if [ "$WARN" = "YES" ] 
    then 
    # Mail it! 
    mail -s 'HACKATTACK' [email protected] < $LOGFILE & 
    fi 
fi 

# Now, do it. 
exec $OPERATION "[email protected]" 

#we never come here... 
exit 0 

Dies ist nur ein Beispiel, wie es verwendet werden kann transparent, alles zu verfolgen. Sie können tun, was Sie die Eingabe überprüfen möchten. Das Skript oben wird verwendet, auch den Urheber der aktuell Shell zu finden, so dass Sie auf sie reagieren können. Natürlich sind die obigen Fallüberprüfungen nicht diejenigen, die wir wirklich verwenden;) - aber eine gute Probe.

Hoffnung, es hilft, Jimmy

+0

Das sieht sehr gefährlich aus, da es die Systemshell ersetzt. –

1

greifen die bash-Quelle. Fügen Sie einen Logger um den Exec-Aufruf hinzu. Kompiliere es. Führen Sie dies nach dem Anmelden als ersten Befehl aus.

Alles andere will wirklich root macht.

0

Es wird ermöglicht, Audit, tty Aufnahme, Hacks und kostenlose Tools, zu tun, was Sie wollen, aber je nach Umfang der Umgebung, die Sie versuchen zu kontrollieren, können Sie besser dran indem Sie sowohl Audit als auch Produkte verwenden, die sich auf die Bewältigung der Herausforderung konzentrieren, die Sie angehen möchten. Einige sehr populären verwendet, auf ein paar Finanzdienstleistungskunden sind [Observe-IT, Centrify und PowerBroker

Hope this

2

hilft Sie Snoopy Logger können

Was es ist: Eine einfache Bibliothek, fügt selbst zwischen Prozess und execv/e() syscalls mittels LD-Preloading. Es protokolliert alle ausgeführten Befehle in syslog.

Was es nicht ist: Sicherheit/Auditing-Lösung - es kann leicht umgangen werden. Es protokolliert nicht integrierte Shell-Befehle (wie sie intern sind und wenn sie aufgerufen wird, erzeugt die Shell keinen neuen Prozess - Echo vs/bin/echo zum Beispiel).

Offenlegung: aktuelle snoopy Maintainer hier.

1

Für sporadische Aufzeichnung verwende ich normalerweise

ssh localhost | tee -a aufgenommen-session.log

Das funktioniert ganz gut.

Verwandte Themen