GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Eine Einführung in die Überwachung von Linux-Benutzerkonten

Vor langer Zeit in der UNIX-Geschichte waren Benutzer auf einem Server echte UNIX-Benutzer mit Einträgen in /etc/shadow und eine interaktive Login-Shell und ein Home-Verzeichnis. Es gab Tools für Administratoren, um mit Benutzern zu kommunizieren und ihre Aktivitäten zu überwachen, um dumme oder böswillige Fehler zu vermeiden, die dazu führen würden, dass Serverressourcen unfair zugewiesen werden.

Heutzutage hat Ihre Benutzerbasis wahrscheinlich weniger Einträge in /etc/shadow , sondern von einer Abstraktionsebene verwaltet werden, sei es LDAP, Drupal oder OpenShift. Andererseits gibt es jetzt viel mehr Server, was bedeutet, dass sich viel mehr Systemadministratoren an- und abmelden, um Wartungsarbeiten durchzuführen. Wo Aktivität ist, gibt es Möglichkeiten für Fehler und Verwirrung, also ist es an der Zeit, diese alten Überwachungstools abzustauben und sie sinnvoll zu nutzen.

Hier sind einige der Überwachungsbefehle, die Sie vielleicht vergessen haben (oder von denen Sie nichts wussten), mit denen Sie verfolgen können, was auf Ihrem Server passiert.

wer

Zuerst die Grundlagen.

Der who Der Befehl wird vom GNU-Coreutils-Paket bereitgestellt und seine Hauptaufgabe besteht darin, /var/log/utmp zu parsen einreichen und die Ergebnisse melden.

Der utmp Datei protokolliert die aktuellen Benutzer auf dem System. Es zeigt nicht unbedingt jeden Prozess, da nicht alle Programme utmp starten Protokollierung. Tatsächlich hat Ihr System möglicherweise nicht einmal einen utmp Datei standardmäßig. In diesem Fall who greift auf /var/log/wtmp zurück , das alle An- und Abmeldungen aufzeichnet.

Der wtmp Dateiformat ist genau dasselbe wie utmp , außer dass ein Null-Benutzername eine Abmeldung anzeigt und der ~ Zeichen zeigt das Herunterfahren oder Neustarten des Systems an. Der wtmp Datei wird von login(1) verwaltet , init(1) , und einige Versionen von getty(8) , jedoch erstellt keine dieser Anwendungen die Datei, also wenn Sie wtmp entfernen , dann ist die Protokollierung deaktiviert. Allein das ist gut zu wissen:Wenn wtmp fehlt, sollten Sie herausfinden, warum!

Die Ausgabe von who --heading sieht in etwa so aus:

NAME     LINE     TIME               COMMENT 
seth     tty2     2020-01-26 18:19   (tty2)
larry    pts/2    2020-01-28 13:02   (10.1.1.8)
curly    pts/3    2020-01-28 14:42   (10.1.1.5)

Dies zeigt Ihnen den Benutzernamen jeder angemeldeten Person, den Zeitpunkt, zu dem ihr Login aufgezeichnet wurde, und ihre IP-Adresse.

Der who Der Befehl bietet auch demütigerweise die offizielle POSIX-Methode, um herauszufinden, welcher Benutzer Sie ist eingeloggt sind als, aber nur wenn utmp existiert:

$ who -m
curly   pts/3   2020-01-28 14:44 (10.1.1.8)

Es bietet auch einen Mechanismus zum Anzeigen des aktuellen Runlevels:

$ who -r 
     run-level 5   2020-01-26 23:58

w

Für etwas mehr Kontext über Benutzer, das einfache w Der Befehl bietet eine Liste, wer angemeldet ist und was er tut. Diese Informationen werden in einem ähnlichen Format wie die Ausgabe von who angezeigt , sondern die Zeit, die der Benutzer im Leerlauf war, die CPU-Zeit, die von allen Prozessen verwendet wird, die mit dem Anmelde-TTY verbunden sind, und die CPU-Zeit, die nur vom aktuellen Prozess verwendet wird. Der aktuelle Prozess des Benutzers wird im letzten Feld aufgelistet.

Beispielausgabe:

$ w
 13:45:48 up 29 days, 19:24,  2 users,  load average: 0.53, 0.52, 0.54
USER     TTY     LOGIN@  IDLE    JCPU   PCPU WHAT
seth     tty2    Sun18   43:22m  0.01s  0.01s /usr/libexec/gnome-session-binary
curly    pts/2   13:02   35:12   0.03s  0.03s -bash

Alternativ können Sie mit dem -i die IP-Adresse des Nutzers einsehen oder --ip-addr Option.

Sie können die Ausgabe auf einen einzelnen Benutzernamen einschränken, indem Sie angeben, über welchen Benutzer Sie Informationen wünschen:

$ w seth
 13:45:48 up 29 days, 19:27,  2 users,  load average: 0.53, 0.52, 0.54
USER     TTY     LOGIN@  IDLE    JCPU   PCPU WHAT
seth     tty2    Sun18   43:25m  0.01s  0.01s /usr/libexec/gnome-session-binary

utmpdump

Der utmpdump Das Dienstprogramm macht (fast) genau das, was sein Name vermuten lässt:Es gibt den Inhalt von /var/log/utmp aus Datei auf Ihren Bildschirm. Tatsächlich gibt es beides aus das utmp oder das wtmp Datei, je nachdem, welche Sie angeben. Die angegebene Datei muss sich natürlich nicht in /var/log befinden oder sogar utmp genannt oder wtmp , und es muss nicht einmal das richtige Format haben. Wenn Sie utmpdump füttern eine Textdatei, es gibt den Inhalt auf Ihrem Bildschirm aus (oder eine Datei mit dem --output Option) in einem Format, das vorhersehbar und einfach zu analysieren ist.

Normalerweise würden Sie natürlich einfach who verwenden oder w um Anmeldedatensätze zu analysieren, aber utmpdump ist in vielen Fällen nützlich.

  • Dateien können beschädigt werden. Während who und w sind oft in der Lage, Beschädigungen selbst zu erkennen, utmpdump ist immer toleranter, weil es kein eigenes Parsing durchführt. Es rendert die Rohdaten für Sie.
  • Sobald Sie eine beschädigte Datei repariert haben, utmpdump können Ihre Änderungen wieder einfügen.
  • Manchmal möchten Sie Daten einfach selbst parsen. Vielleicht suchen Sie etwas, das who und w sind nicht darauf programmiert, danach zu suchen, oder vielleicht versuchen Sie, ganz eigene Korrelationen herzustellen.

Was auch immer der Grund ist, utmpdump ist ein nützliches Werkzeug, um Rohdaten aus den Anmeldedatensätzen zu extrahieren.

Wenn Sie ein beschädigtes Anmeldeprotokoll repariert haben, können Sie utmpdump verwenden um Ihre Änderungen in das Hauptprotokoll zurückzuschreiben:

$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp

ps

Sobald Sie wissen, wer bei Ihrem System angemeldet ist, können Sie ps verwenden um eine Momentaufnahme der aktuellen Prozesse zu erhalten. Dies ist nicht mit der Oberseite zu verwechseln, die einen laufenden Bericht über aktuelle Prozesse anzeigt; Dies ist ein Schnappschuss, der in dem Moment aufgenommen wurde ps ausgestellt und dann auf Ihrem Bildschirm ausgedruckt. Beide haben Vor- und Nachteile, sodass Sie je nach Ihren Anforderungen auswählen können, welche Sie verwenden möchten. Aufgrund seiner statischen Natur ist ps ist besonders nützlich für die spätere Analyse oder einfach nur als schöne überschaubare Zusammenfassung.

Das ps Der Befehl ist alt und bekannt, und es scheint, dass viele Administratoren eher den alten UNIX-Befehl als die neueste Implementierung gelernt haben. Das moderne ps (aus dem procps-ng Paket) bietet viele hilfreiche Mnemonics, und es ist das, was auf RHEL, CentOS, Fedora und vielen anderen Distributionen ausgeliefert wird, also wird es in diesem Artikel verwendet.

Mit --user können Sie erreichen, dass alle Prozesse von einem einzigen Benutzer ausgeführt werden (oder -u ) zusammen mit dem Benutzernamen, über den Sie einen Bericht erstellen möchten. Um der Ausgabe den hinzugefügten Kontext zu geben, welcher Prozess der Elternprozess eines Kindprozesses ist, verwenden Sie --forest Option für eine „Baum“-Ansicht:

$ ps --forst --user larry
  PID TTY        TIME     CMD
  39707 ?        00:00:00 sshd
  39713 pts/4    00:00:00  \_ bash
  39684 ?        00:00:00 systemd
  39691 ?        00:00:00  \_ (sd-pam)

Für jeden Prozess auf dem System:

$ ps --forest -e
[...]
  29284 ?        00:00:48  \_ gnome-terminal-
  29423 pts/0    00:00:00  |   \_ bash
  42767 pts/0    00:00:00  |   |   \_ ps
  39631 pts/1    00:00:00  |   \_ bash
  39671 pts/1    00:00:00  |       \_ ssh
  32604 ?        00:00:00  \_ bwrap
  32612 ?        00:00:00  |   \_ bwrap
  32613 ?        00:09:05  |       \_ dring
  32609 ?        00:00:00  \_ bwrap
  32610 ?        00:00:15      \_ xdg-dbus-proxy
   1870 ?        00:00:05 gnome-keyring-d
   4809 ?        00:00:00  \_ ssh-agent
[...]

Die Standardspalten sind nützlich, aber Sie können sie ändern, um sie besser an Ihre Recherche anzupassen. Das -o Option gibt Ihnen die volle Kontrolle darüber, welche Spalten Sie sehen. Eine vollständige Liste möglicher Spalten finden Sie unter Standardformatbezeichner Abschnitt von ps(1) Manpage.

$ ps -eo pid,user,pcpu,args --sort user
   42799 root      0.0 [kworker/u16:7-flush-253:1]
  42829 root      0.0 [kworker/0:2-events]
  42985 root      0.0 [kworker/3:0-events_freezable_power_]
   1181 rtkit     0.0 /usr/libexec/rtkit-daemon
   1849 seth      0.0 /usr/lib/systemd/systemd --user
   1857 seth      0.0 (sd-pam)
   1870 seth      0.0 /usr/bin/gnome-keyring-daemon --daemonize --login
   1879 seth      0.0 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session

Das ps Befehl ist sehr flexibel. Sie können die Ausgabe nativ ändern, sodass Sie sich nicht auf grep verlassen müssen und awk um zu finden, was Ihnen wichtig ist. Erstelle einen guten ps Befehl, benennen Sie es mit etwas Merkwürdigem und führen Sie es oft aus. Dies ist eine der besten Möglichkeiten, um darüber informiert zu bleiben, was auf Ihrem Server passiert.

pgrep

Manchmal haben Sie möglicherweise eine Vorstellung von einem problematischen Prozess und müssen ihn anstelle Ihrer Benutzer oder Ihres Systems untersuchen. Dafür gibt es den pgrep Befehl aus dem psproc-ng Paket.

Im einfachsten Fall pgrep funktioniert wie ein grep auf der Ausgabe von ps :

$ pgrep bash
29423
39631
39713

Anstatt die PIDs aufzulisten, können Sie einfach zählen, wie viele PIDs zurückgegeben würden:

$ pgrep --count bash
3

Für weitere Informationen können Sie Ihre Suche durch Prozesse nach Benutzernamen beeinflussen (-u ), Terminal (--terminal ) und Alter (--newest und --oldest ), und mehr. So finden Sie beispielsweise einen Prozess, der einem bestimmten Benutzer gehört:

$ pgrep bash -u moe --list-name
39631 bash

Sie können sogar inverse Übereinstimmungen mit --inverse erhalten Option.

pkill

Verwandt mit pgrep ist das pkill Befehl. Es ist dem kill sehr ähnlich Befehl, außer dass es die gleichen Optionen wie pgrep verwendet So können Sie mit den Informationen, die für Sie am einfachsten sind, Signale an einen problematischen Prozess senden.

Zum Beispiel, wenn Sie festgestellt haben, dass ein Prozess, der von Benutzer larry initiiert wurde monopolisiert Ressourcen, und Sie wissen von w dieser larry befindet sich am Terminal pts/2 , dann können Sie die Anmeldesitzung und alle ihre untergeordneten Elemente mit nur dem Terminalnamen beenden:

$ sudo pkill -9 --terminal pts/2

Oder Sie können nur den Benutzernamen verwenden, um alle passenden Prozesse zu beenden:

$ sudo pkill -u larry

Mit Bedacht verwendet, pkill ist eine gute „Panik“-Taste oder Lösung im Stil eines Vorschlaghammers, wenn ein Problem außer Kontrolle gerät.

Terminalüberwachung

Nur weil eine Reihe von Befehlen in einem Terminal vorhanden sind, heißt das nicht, dass sie unbedingt besser sind als andere Lösungen. Machen Sie eine Bestandsaufnahme Ihrer Anforderungen und wählen Sie das beste Werkzeug für Ihre Anforderungen aus. Manchmal ist ein grafisches Überwachungs- und Berichtssystem genau das, was Sie brauchen, und manchmal sind Terminalbefehle, die einfach per Skript erstellt und geparst werden können, die richtige Antwort. Wählen Sie weise, lernen Sie Ihre Tools kennen, und Sie werden nie im Dunkeln darüber sein, was in Ihrem Bare Metal passiert.

[Möchten Sie mehr über Überwachung und Sicherheit erfahren? Sehen Sie sich die Checkliste für IT-Sicherheit und Compliance an. ]


Linux
  1. Was ist ein Linux-Benutzer?

  2. 4 Möglichkeiten zum Deaktivieren des Root-Kontos in Linux

  3. Linux-Berechtigungen:Eine Einführung in chmod

  4. Eine Einführung in die Linux-Datei /etc/fstab

  5. UNIX / Linux :So sperren oder deaktivieren Sie ein Benutzerkonto

ID-Befehl unter Linux

Methoden zum Deaktivieren des Root-Kontos in Linux

Eine Einführung in Pluggable Authentication Modules (PAM) in Linux

Eine Einführung in Hashing und Prüfsummen in Linux

Beispiele für chown-Befehle unter Linux

Was ist die Datei /etc/passwd unter Linux?