Wie können Sie einen gutartigen Benutzer von Ihrem System entfernen?

66

Ich habe das vor einiger Zeit gegoogelt und ein paar Dinge bemerkt, aber ich vermute, dass Google nicht alle kennt. Wie können Sie Benutzer von Ihrer Linux-Box abbringen? auch, wie gehen Sie vor, um zu sehen, dass sie an erster Stelle angemeldet sind? und verwandte ... funktioniert Ihre Methode, wenn der Benutzer in einem X11 DE angemeldet ist (keine Anforderung, auf die ich nur neugierig bin)?

Xenoterracid
quelle
3
Die Frage wurde geändert, um die Annahmen bei der akzeptierten Antwort widerzuspiegeln. Im Zusammenhang mit einer Sicherheitsverletzung besteht die einzige Möglichkeit, einen böswilligen Benutzer von Ihrem System zu vertreiben, darin, viel schlauer als dieser Benutzer zu sein. Ein cleverer Benutzer wird sich nicht in utmp anzeigen lassen oder von etwas so Trivialem wie who(1)oder gefunden werden w(1). Die einzige idiotensichere Möglichkeit, potenzielle Rootkits zu entfernen, besteht darin, das System vollständig zu bereinigen und neu zu installieren.
JW013

Antworten:

140

Es gibt wahrscheinlich einen einfacheren Weg, aber ich mache das:

  1. Sehen Sie, wer an Ihrem Computer angemeldet ist - verwenden Sie whooder w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Suchen Sie die Prozess-ID der Shell, mit der das TTY verbunden ist:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Über die bevorstehende Trennung lachen (dieser Schritt ist optional, wird aber empfohlen)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Beenden Sie den entsprechenden Vorgang:

    > kill -9 30737
    

Ich habe gerade herausgefunden, dass Sie die Schritte 1 und 2 kombinieren können, indem Sie whodie -uFlagge geben. Die PID ist die Zahl rechts davon:

> who -u
mmrozek  tty1         Aug 17 10:03 09:01        9250
mmrozek  pts/18       Aug 17 10:09 01:46       19467 (:pts/2:S.0)
Michael Mrozek
quelle
61
+1 für "Über die bevorstehende Trennung lachen (dieser Schritt ist optional, wird aber empfohlen)"
Josh
9
kill -9huh? Sie befinden sich in diesem Fall wirklich im BOFH-Modus.
Jander
12
@Jander Sie haben einen Benutzer aus dem System geworfen. wie schön musst du sein
Michael Mrozek
6
Normalerweise würde ich sagen , ermutige die Leute nicht zum Missbrauchkill -9 und beginne stattdessen mit sanfteren Signalen , aber in diesem Zusammenhang ist es wahrscheinlich nicht so wichtig. Ich hinterlasse nur einen Kommentar, falls die Leute den Witz verpassen.
JW013
5
Es gibt auch Slays, die im Grunde den gesamten Prozess automatisieren (sogar über Ihr Opfer lustig machen, wenn Sie den Butthead-Modus aktivieren)
Ulrich Dangel
32

Wie Micheal bereits betont hat, können Sie mithilfe whovon ermitteln, wer angemeldet ist. Wenn jedoch mehrere Prozesse vorhanden sind, gibt es eine bequemere Möglichkeit, als jeden Prozess einzeln killall -u usernamezu beenden : Mit dieser Option können Sie alle Prozesse dieses Benutzers beenden.

sepp2k
quelle
+1. Die Verwendung killallist auch in grafischen Umgebungen etwas geeigneter, da mehr als nur eine Shell zu töten ist.
John WH Smith
3
WARNUNG: Wenn Sie dies für den Root-Benutzer verwenden, werden alle Root-Prozesse beendet und Sie müssen den Server physisch neu starten.
Kunok
1
@ Kunok Unter welcher Situation möchten Sie den Root-Benutzer von der Maschine werfen? Als ob dieser Account gekapert wurde oder so?
Alexej Magura
23

Nekromantie!

Ich schätze den Humor der akzeptierten Antwort, aber beruflich kann ich es nicht befürworten.

Die anmutigste Methode, die mir bekannt ist, besteht darin, ein -HUP an die Shell zu senden, um ein Auflegen eines Benutzers zu simulieren. Sie können dies an den inaktiven sshd des Benutzers senden, um den Verbindungsverlust zu simulieren, wodurch eine Bereinigung der gesamten Shell-Umgebung (einschließlich der untergeordneten Shells) ausgelöst wird, oder dies an bestimmte verschachtelte Shells senden (z. B. diejenigen, die sich in einem getrennten Terminal-Multiplexer befinden) verhindern, dass Sie ein Dateisystem aushängen, wenn Sie wirklich präzise sein möchten.

Mit writeNachrichten unheilbar Leerlauf ptys zu senden , bevor Sie sie starten ist zwar ein Spaß Hobby.

Andrew B
quelle
1
Während das pseudo-omnipotente Gefühl, das mit einem Kill -9 einhergeht, Spaß macht, ist dieser Vorschlag wahrscheinlich besser. Eine Gegenstimme von mir.
Andrew Falanga
4
Um diese Antwort explizit zu machen, habe ich echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP
Folgendes
13

Melden Sie den Benutzer 'Benutzername' ab:

skill -KILL -u username

Sehen man skill

bsd
quelle
3
Ich denke, das wird alle Prozesse dieses Benutzers beenden, nicht nur deren Shell, aber wenn es das ist, was Sie wollen, dann ist dies definitiv einfacher
Michael Mrozek
Ich sehe das nicht wirklich auf RHEL7
antivirtel
11

Ein weiterer nützlicher Befehl ist pkillhier pkill -u username && pkill -9 -u username. killallhaben den Nachteil, dass es unter Solaris IIRC etwas völlig anderes bedeutet - pkillhaben auch etwas fortgeschrittenere Optionen.

Maciej Piechotka
quelle
8
Unter Solaris wird 'killall' von den Shutdown-Skripten verwendet, um (fast) alle Prozesse auf dem Server abzubrechen. "Es macht das, was es verspricht."
dr-jan
Leute, warum stehst du so auf SIGKILL? Laufende Programme und Anwendungen haben nicht einmal die Möglichkeit, Daten zu speichern und ein wenig aufzuräumen. SIGTERM (wie es beim Herunterfahren verwendet wird) oder SIGHUP funktionieren ebenfalls und sind viel eleganter. (Sie können SIGKILL auch nach Ablauf einer Nachfrist noch senden.)
Gegenmodus
3

Dies deutet zunächst auf ein größeres Problem hin. Wenn Sie Benutzer haben, denen Sie nicht vertrauen, sollten Sie diese wahrscheinlich anpassen und ein neues Image erstellen.

In diesem Sinne können Sie einige oder alle der folgenden Aktionen ausführen:

# Umgebung einrichten
$ BADUSER = foo # wobei foo der fragliche Benutzername ist
$ USERLINE = $ (grep '^ $ {BADUSER}:' / etc / passwd)
$ BADUID = $ (echo $ {USERLINE} | awk -F: '{print $ 3}')
$ BADGID = $ (echo $ {USERLINE} | awk -F: '{print $ 4}')
$ BADHOMEDIR = $ (echo $ {USERLINE} | awk -F: '{print $ 6}')
$ BDIR = "~ / backup / home-backup /"
$ TSTAMP = $ (Datum +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -Dateien - $ {TSTAMP} .txt"

# Deaktivieren Sie die zukünftige Anmeldung des Benutzers
$ sudo chsh -s / bin / false "$ {BADUSER}"

# Alle Prozesse des Benutzers beenden
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# Das Home-Verzeichnis des Benutzers sichern / löschen
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# finde alle Dateien, die dem Benutzer gehören
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# Benutzer entfernen
$ sudo userdel $ {BADUSER}
cjac
quelle
Ich weiß nicht, ob ich "level it an reimage" zustimmen würde. Dies ist Unix, nicht Windows. Ich habe dieses Problem nicht wirklich. Ich habe nur gefragt.
Xenoterracide
3
Nur weil Sie einen Benutzer aus dem Verkehr ziehen müssen, heißt das nicht, dass er nicht vertrauenswürdig ist. Vielleicht haben sie einfach vergessen, sich abzumelden.
David Z
xenoterracide: Vielleicht schütze ich nur die Systeme, die ich betreibe, aber wenn ich einen Benutzer hätte, der meiner Meinung nach von einem System unter meiner Kontrolle entfernt werden muss, hätte etwas Ernstes passieren müssen.
CJAC
-1 für das Einlesen von Dingen in die Frage, die nicht logisch folgen, und das Ziehen des Q / A-Off-Topic.
Wesley
you have users that you don't trust on your system... Oder es könnte einfach sein, dass Sie eine als Botschaft an die anderen töten. Ist das Bekenntnis des Systemadministrators schließlich nicht "Es ist besser, gefürchtet zu werden, als geliebt zu werden"? Abgesehen von allen Witzen sollte Machiavelli ein O'Reilly-Buch schreiben.
Parthian Shot
0

Ich habe mich umgesehen und konnte kein einziges Skript finden, um diese Aufgabe zu automatisieren.

Basierend auf den hier vorgeschlagenen Lösungen habe ich alles in einem interaktiven Bash-Skript gemischt , das die Benutzer und Sitzungen auflistet, aus denen who -uder Benutzer auswählen kann, was zu tun ist.

Sie können dann entweder:

  • Beenden Sie alle Sitzungen für einen Benutzer killall -u <username> -HUP
  • eine bestimmte Sitzung beenden kill <PID>

Alle erforderlichen Informationen stammen von who -uund werden dann mit mapfileund analysiert awk.

Ich werde die Möglichkeit hinzufügen, writespäter eine Nachricht zu senden (Verzögern des Vorgangs).

Ich werde wahrscheinlich die Option hinzufügen, mit der auch eine bestimmte Sitzung beendet werden kann kill -9. Aber ich hatte keine Probleme damit killund sollte, wie von anderen angedeutet, kill -9nach Möglichkeit vermieden werden.

Sie können den Code auf Github überprüfen, wenn Sie es versuchen möchten, oder mehr darüber erfahren, wie ich es auf automatisierte Weise mache:

Gus Neves
quelle
0

Wie wirft man [gütige] Benutzer von der Linux-Box?

Am Ende geht es darum, die Prozesse zu identifizieren und zu beenden, die einer Benutzer-ID gehören, zugeordnet sind oder aus dieser hervorgehen. Welche Befehle Sie verwenden, um dieses Ziel zu erreichen, ist nicht unbedingt wichtig, solange Sie dort ankommen.

Grundsätzlich zwei Antworten ...

Option A: Veranlassen einer Abmeldung von diesem Benutzer, für welche und wie viele Anmeldungen er auch immer hat. Dies würde also bedeuten, die Prozesse zu identifizieren, die einem Benutzer gehören, von der UID nachverfolgt werden können und als Teil eines Anmeldeprozesses für die von Ihnen ausgeführte Linux-Distribution klassifiziert sind. Beachten Sie, dass es vor dem "Login" übergeordnete Prozesse wie SSH oder VNC und nach dem "Login" untergeordnete Prozesse wie GDM gibt. Wenn Sie einen übergeordneten Prozess beenden, wird der untergeordnete Prozess normalerweise beendet, aber nicht immer. Sie möchten also diese anderen Prozesse beenden, die nach dem Abmelden offensichtlich nicht mehr benötigt werden. Auf diese Weise werden Hintergrundjobs weiter ausgeführt, da dies ein harmloser Benutzer ist und Sie ihn möglicherweise nur abmelden möchten. Soweit ich weiß /usr/bin/wund /usr/bin/whoberichten werde, wer den Anmeldevorgang durchlaufen hat.

Option B: Beenden Sie alle Prozesse, die einer bestimmten Benutzer-ID gehören, vollständig. Dies würde lediglich bedeuten, dass alle Prozesse, die diesem Benutzer gehören, beendet werden. Dies würde sie auch abmelden , wenn sie angemeldet sind . Das muss nur einfach sein ps -ef | grep <uid>und dann all diese Prozesse auf jede akzeptable Weise beenden.

fwiw in SLES 11 berichtet es

Mann Geschicklichkeit ... Diese Tools sind wahrscheinlich veraltet und nicht mehr tragbar. Die Befehlssyntax ist schlecht definiert. Verwenden Sie stattdessen die Befehle killall, pkill und pgrep.

kill -9 FTW!

Ron
quelle
-1

Meiner Meinung nach ist es nicht wirklich nützlich, es zu verwenden, killall -u usernameda Sie sich selbst auf den Kopf stellen werden, wenn es derselbe Benutzer ist wie Sie. So killwird der Prozess eine bessere Lösung.

Mailo
quelle
Auch wenn von diesem Benutzer Prozesse ausgeführt werden, kommt SSHD möglicherweise nie auf den Server und führt zum Herunterfahren von SSH.
Mailo
3
Warum in aller Welt würde der SSH-Dämon (oder ein beliebiger Dämon) mit den Anmeldeinformationen eines Benutzers ausgeführt, der aus irgendeinem realistischen Grund zwangsweise vom System abgemeldet werden muss? Was fügt diese Antwort hinzu, die nicht von Michael Mrozeks Antwort oder Andrew Bs Antwort (und möglicherweise auch von anderen) abgedeckt wird ?
ein Lebenslauf vom
-2

Dieser Befehl funktionierte hervorragend für die Benutzeroberfläche.

leaves@me:/# skill -HUP -u username
  • Ich weiß nicht was passiert ist.
  • Es muss ein Update gegeben haben.
  • Das "Google" war wieder ausgefallen.
  • Es war ein Virus im Internet.

Einige Umleitungen, falls Sie sie brauchen.

JaInI
quelle
1
Dies wird bereits in der Antwort von bsd erwähnt.
Stephen Kitt