Wie füge ich Netzwerk- oder Benutzerquellenverbindungsdaten zu Verlaufseinträgen hinzu?

8

Ich möchte die Verlaufseinstellungen für alle Benutzer auf den von mir verwalteten Systemen ändern. Ich möchte, dass es die Informationen vom Verbindungsterminal wie von enthältwho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

Derzeit ändere ich meinen Verlauf folgendermaßen. Ich weiß, dass viele dieser Einstellungen hier mehrmals behandelt wurden. Ich habe diesen Code jedoch vor langer Zeit aus " Linux System Administration Recipes by: Juliet Kemp " abgerufen.

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend Behebt das Problem, wenn mehrere Terminals geöffnet sind. Informationen können verloren gehen.

PROMPT_COMMAND='history -n;history -a' wird erweitert, um das Anhängen des Verlaufs in Echtzeit über mehrere Terminals hinweg zu ermöglichen.

HISTSIZE=100000 HISTFILESIZE=100000 verlängert die historyRetentionsmenge

HISTTIMEFORMAT="%m/%d/%y %T "stellt jeder Zeile der Geschichte einen Zeitstempel voran

Was Sie normalerweise bekommen history

835  ls
836  cd ..

Meine geänderten aktuellen historyErgebnisse

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

Die Rückkehr von historywürde ich gerne sehen

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

Ich bin nicht "verheiratet", den DNSNamen zu sehen . Ich würde es nur dort haben wollen, wenn es von whoeinem anderen Ort abgerufen wird, ohne dass eine Suche oder Abfrage jeglicher Art durchgeführt werden muss. Ich würde mich über die IP-Adresse freuen.

002  03/26/12 05:11:30  192.168.0.2    ll

Warum? Ich verwalte mehrere Systeme, auf denen eine Benutzer-ID, die mehrere Benutzer derselben Gruppe gemeinsam nutzen, ihre täglichen Aufgaben erledigt. Dies würde es mir ermöglichen, ihren tatsächlichen Standort und den tatsächlichen Benutzer innerhalb der Organisation mit dem zu korrelieren, was sie in der Geschichte getan haben.

Ich bin mir bewusst, dass dies nicht optimal ist und möchte es ändern, aber wenn Sie auf einem Schiff von der Größe eines Kreuzfahrtschiffes sind, versuchen Sie nicht, Haarnadelkurven zu drehen. (Hinweis: Wenn Sie dies tun, versuchen die Passagiere, Sie über Bord zu werfen.)

Bis ich sie auf eine bessere Lösung migrieren kann, möchte ich diese Tracking-Funktion haben.

Wenn Sie Empfehlungen dazu haben, was ich derzeit für meine historyÄnderungen verwende, würde ich es gerne hören.

Vielen Dank,

Bearbeiten: 1

Ich möchte keine anderen Programme ausführen oder zusätzliche "im Rahmen der Vernunft" konfigurieren müssen.

Ich möchte 0Overhead hinzufügen , wenn ich hinzufügen muss, muss es klein sein.

Ich vertraue meinen Benutzern, ich möchte nur (sollte etwas passieren) sehen, welcher der 10 Benutzer, die sich mit demselben Benutzer am System angemeldet haben: Passwort hat es getan. Oder es könnte kein Benutzer gewesen sein, es könnte ein Vergessen cronauf einem System gewesen sein, das als Benutzer eine Verbindung herstellt, um etwas zu tun. Oder eine Anwendung Bsp.: Die BMC Control-Meine Verbindung herstellt sshund Aufgaben ausführt. Es geht weniger darum, "schlechte Benutzer" zu finden, als vielmehr darum, sie mit minimalem Aufwand aufzuspüren.

Bearbeiten 2:

Auf den Systemen werden SLES und RHEL ausgeführt

2bc
quelle
1
Klingt so, als ob die Prozessabrechnung nützlich sein könnte. Der Shell-Verlauf wurde nie für die Protokollierung entwickelt. Wenn Sie ihn verwenden möchten, müssen Sie allen Benutzern vertrauen. Siehe verwandte Fragen zur Überwachungsaktivität und eine verwandte Antwort .
jw013
@ jw013 Danke für den Kommentar. Dies muss jedoch konfiguriert und verwaltet werden, und ich gebe die Informationen an, die ich gelesen habe. Am besten schließe ich Verzeichnisse wie /proc /devund Benutzerverzeichnisse aus /home. Dies erhöht den Overhead. Während historybereits aufgezeichnet wird und ihre Verbindungsinformationen dem System bekannt sind, das IP usw. verbindet. Diese Informationen können, falls sie nicht bereits "statisch" verfügbar sind, auf diese Weise festgelegt oder in einer Variablen oder Datei gespeichert und in die historyDatensätze und den Leistungstreffer eingegeben werden wäre sehr klein oder 0.
2bc
Wenn dies unter Linux geschieht, sollten Sie die Verwendung in Betracht ziehen auditd. Ich bin nicht sicher, ob die Protokolle Ihnen genügend Informationen geben. Die Schwierigkeit dessen, was Sie wollen, ist genau, warum gemeinsam genutzte Konten so verurteilt werden.
Gilles 'SO - hör auf böse zu sein'
Es ist unter Linux, ich werde meine Frage bearbeiten, um das klar zu machen. auditdEs ist sehr ähnlich inotify, wie Sie sagen müssen, was auf Änderungen überwacht werden soll. Einzelne Dateien, Verzeichnisse usw. Ich möchte nicht zu dieser Konfigurationsebene wechseln. In der Tat (ich tue), aber im Grunde ist es nicht so wichtig. Ich muss puppetmit dem Zeug umgehen. auditdkommt mit der zusätzlichen Last und Zeit zum Einrichten. Wenn ein Konto etwas ändert, möchte ich trotzdem in den Verlauf zurückblicken und sehen, wer oder was sich anmeldet und versucht.
2bc
2
hm, da PROMPT_COMMAND=nur normale Befehle vor der nächsten Eingabeaufforderung ausgeführt werden, konnten Sie keine Funktion schreiben, die sed / awk aufruft und in der letzten Zeile der Verlaufsdatei arbeitet, um die Informationen hinzuzufügen. Rufen Sie dann diese Funktion auf PROMPT_COMMAND=, um die Daten anzuhängen. Es wäre hackisch, sollte aber den Job machen.
llua

Antworten:

1

Nach dem Vorschlag von llua können wir ein bisschen mehr mit der Geschichte arbeiten. Fügen Sie der systemweiten BASH RC-Datei eine Zeile hinzu, z. B. /etc/bash.bashrc.

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Richten Sie die Protokollierung für "local6" in Ihrem Systemlogger ein. Vielleicht so etwas:

local6.*    /var/log/commands.log

Starten Sie den Systemlogger neu. Richten Sie möglicherweise die Rotation der Protokolldatei ein. Ausloggen; Anmeldung; Der Verlauf wird jetzt in einem Format wie dem folgenden in /var/log/commands.log geschrieben:

Datum Uhrzeit Hostname Logger: Benutzername [audit_pid]: Befehl [return_val]

Dies könnte weiter nach Geschmack optimiert werden.

Christopher
quelle
1

Die folgenden Absätze beschreiben die Idee im Allgemeinen und sind in einigen Aspekten veraltet. Sie können sie jedoch auf dieser Seite verwenden. Verwenden wir eine große Datei ~ / .bash_history.archive (getrennt von HISTFILE = ~ / .bash_history). Beim Beenden jeder Bash-Sitzung können neue Verlaufszeilen daran angehängt werden.

Das erste Problem bei diesem Ansatz war: Wie kann man Bash erstellen, um dieses Skript bei jedem Exit aufzurufen? Sicher, wenn Sie es beenden, indem Sie 'exit' eingeben, können Sie die Funktion 'exit' als Alias ​​verwenden, aber ich verwende dafür die Tastenkombination Strg-D, und ich konnte keinen Weg finden, wie ich es etwas neu zuweisen kann, aber keine eingebaute Exit-Funktion.

Der erste Versuch war also: Strg-D durch zu verbieten

export IGNOREEOF=10

und definieren Sie die doppelte Strg-X-Kombination, um die Exit-Funktion aufzurufen.

Der richtige Ansatz ist jedoch die Verwendung von exit tramp of bash. Dies ist eine perfekte Lösung, da es unabhängig von der Art und Weise, wie Sie bash beenden, aufgerufen wird: Strg-D, exit, xterm window schließen.

trap 'archive_history' EXIT

Der folgende Schritt besteht darin, eine Startzeile in unserer bash_history zu definieren, damit wir nur neue Zeilen speichern und sicherstellen können, dass wir an eine Verlaufsdatei anhängen.

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

Das ist alles, was wir zu Beginn der Bash brauchen - jetzt wissen wir, ab welcher Verlaufslinie die aktuelle (frische) Geschichte beginnt. Um den Verlauf zu speichern, fügen Sie das nächste Stück zu Ihrem ~ / .bashrc hinzu.

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

Die Datei ~ / .inputrc sollte die nächsten Zeilen enthalten, um die Exit-Verknüpfung zu Strg-x x neu zu definieren. Beim ersten Versuch haben Sie vielleicht das Gefühl, dass es eine schreckliche Abkürzung ist, aber dann gewöhnen Sie sich daran - glauben Sie mir.

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

Auch wenn Ihre Bash-Sitzung eine Anmeldesitzung ist und Sie mit ' logout' beenden , können Sie die nächste Zeile zu Ihrer hinzufügen~/.bash_logout

archive_history

Nachdem alle genannten Aktionen ausgeführt wurden, finden Sie Ihre ~/.bash_history.archiveDatei mit Abschnitten wie diesen

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

Diese kann im Allgemeinen wie gewohnt als Verlaufsdatei gelesen werden, wenn Sie dies wünschen.

Rahul Patil
quelle