Comment expulser un utilisateur bénin de votre système?


66

J'étais googler cela il y a un peu et j'ai remarqué plusieurs façons, mais je suppose que Google ne sait pas tout. Alors, comment coupez- vous les utilisateurs de votre machine Linux? aussi comment allez-vous voir s'ils sont connectés en premier lieu? et connexes ... votre méthode fonctionne-t-elle si l'utilisateur est connecté à un DE X11 (ce n'est pas une exigence, je suis simplement curieux)?


3
Question modifiée pour refléter les hypothèses étant donné la réponse acceptée. Dans le contexte d'une faille de sécurité, le seul moyen de chasser un utilisateur malveillant de votre système est d'être beaucoup plus intelligent que cet utilisateur. Un utilisateur intelligent ne se laissera pas apparaître dans utmp ni se faire trouver par quelque chose d'aussi trivial que who(1)ou w(1). Le seul moyen infaillible de se débarrasser des éventuels rootkits pouvant être installés consiste à nettoyer et à réinstaller complètement le système.
jw013

Réponses:


140

Il y a probablement un moyen plus facile, mais je fais ceci:

  1. Voir qui est connecté à votre machine - utilisez whoou w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Recherchez l'ID de processus du shell auquel leur TTY est connecté:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Riez de leur déconnexion imminente (cette étape est facultative, mais encouragée)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Tuez le processus correspondant:

    > kill -9 30737
    

Je viens de découvrir que vous pouvez combiner les étapes 1 et 2 en donnant whole -udrapeau; le PID est le numéro à droite:

> 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)

61
+1 pour "Rire de leur déconnexion imminente (cette étape est facultative, mais encouragée)"
Josh

9
kill -9hein? Vous êtes vraiment en mode BOFH sur celui-ci.
Jander

12
@ Jander Vous excluez un utilisateur du système; tu as besoin d'être gentil?
Michael Mrozek

6
Normalement, je dirais de ne pas encourager les gens à abuserkill -9 et de commencer avec des signaux plus doux , mais je suppose que dans ce contexte, cela n'a pas tellement d'importance. Je laisse juste un commentaire au cas où les gens rateraient la blague.
jw013

5
Il y a aussi Slay qui automatise fondamentalement tout le processus (même se moquer de votre victime si vous activez le mode Butthead)
Ulrich Dangel le

32

Comme Micheal l’a déjà fait remarquer, vous pouvez utiliser celui whoqui est connecté. Toutefois, s’ils ont plusieurs processus, il existe un moyen plus pratique que killall -u usernamede supprimer chaque processus individuellement: vous pouvez supprimer tous les processus de cet utilisateur.


+1 L'utilisation killallsera également légèrement plus appropriée dans les environnements graphiques, car il ne suffit pas d'un shell à tuer.
John WH Smith

3
AVERTISSEMENT: si vous l'utilisez pour l'utilisateur root, vous supprimerez tous les processus root et devrez redémarrer le serveur physiquement.
Kunok

1
@Kunok sous quelle situation voudriez-vous que le superutilisateur quitte la machine? Comme si ce compte avait été détourné ou quelque chose du genre?
Alexej Magura

23

Nécromancie!

J'apprécie l'humour de la réponse acceptée, mais professionnellement, je ne peux pas le défendre.

La méthode la plus gracieuse que je connaisse consiste à envoyer un -HUP au shell pour simuler le raccrochage de l'utilisateur. Vous pouvez l'envoyer à l'utilisateur sshd inactif pour simuler la perte de leur connexion, ce qui déclenche le nettoyage de tout l'environnement du shell (y compris les enfants), ou l'envoyer à des shells imbriqués spécifiques (par exemple, ceux configurés à l'intérieur d'un multiplexeur de terminaux déconnecté). vous empêchent de démonter un système de fichiers) si vous voulez être vraiment précis.

Utiliser writepour envoyer des messages aux ptys inactifs avant de les démarrer est un passe-temps amusant.


1
Bien que le sentiment pseudo-omnipotent qui accompagne un kill -9 soit amusant, cette suggestion est probablement meilleure. Un vote positif de ma part.
Andrew Falanga

4
Pour rendre cette réponse explicite, ce que j’ai fait est la suivante: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(la veille donne à l’utilisateur la possibilité de sauvegarder et de se déconnecter, mais vous ne l’utilisez probablement que pour un utilisateur qui a oublié de se déconnecter de toute façon)
wkschwartz

13

Déconnectez l'utilisateur 'nom d'utilisateur':

skill -KILL -u username

Voir man skill


3
Je pense que cela va tuer tous les processus de cet utilisateur, pas seulement son shell, mais si c'est ce que vous voulez, c'est tout simplement plus simple
Michael Mrozek

Je ne vois pas vraiment que cela fonctionne sur RHEL7
antivirtel,

11

Une autre commande utile est pkillici pkill -u username && pkill -9 -u username. killallLe désavantage est que, sur Solaris IIRC, cela signifie quelque chose de complètement différent. Vous pkilldisposez également d'options légèrement plus avancées.


8
Sur Solaris, "killall" est utilisé par les scripts d'arrêt pour tuer (presque) tous les processus du serveur. "Il fait ce qu'il dit sur la boîte."
dr-jan

Pourquoi avez-vous tant aimé SIGKILL? L'exécution de programmes et d'applications n'aura même pas la possibilité de sauvegarder des données et de nettoyer un peu. SIGTERM (comme utilisé à l’arrêt) ou SIGHUP fera de même et est beaucoup plus gracieux. (Vous pouvez toujours envoyer SIGKILL après l'expiration d'un délai de grâce.)
contre-mode

3

Tout d'abord, cela indique un problème plus important. Si vous avez des utilisateurs que vous ne faites pas confiance sur votre système, vous devriez probablement le niveler et le re-image.

Dans cet esprit, vous pouvez effectuer tout ou partie des tâches suivantes:

# mettre en place l'environnement
$ BADUSER = foo # où foo est le nom d'utilisateur en question
$ 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 = $ (date +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# désactive la future connexion de l'utilisateur
$ sudo chsh -s / bin / false "$ {BADUSER}"

# tuer tous les processus de l'utilisateur
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# sauvegarder / effacer le répertoire personnel de l'utilisateur
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} / .* $ {BADHOMEDIR} / *

# trouver tous les fichiers appartenant à l'utilisateur
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# supprimer l'utilisateur
$ sudo userdel $ {BADUSER}

Je ne sais pas si je serais d'accord avec "level it an reimage", c'est unix et non pas Windows ... Je n'ai pas vraiment ce problème ... je demandais juste.
xenoterracide

3
De plus, le fait de lancer un utilisateur ne signifie pas nécessairement qu’il n’est pas digne de confiance. Peut-être qu'ils ont juste oublié de se déconnecter.
David Z

xenoterracide: Peut-être que je ne fais que protéger les systèmes que je gère, mais si j'avais un utilisateur qui, à mon avis, devait être retiré de force d'un système sous mon contrôle, il aurait peut-être été arrivé quelque chose de grave.
Cjac

-1 pour avoir lu dans la question des choses qui ne suivent pas logiquement et en faisant glisser le Q / A hors sujet.
Wesley

you have users that you don't trust on your system... Ou peut-être que vous en tuez un comme un message aux autres. Après tout, le credo de l'administrateur système n'est-il pas "mieux vaut être craint que d'être aimé"? Machiavel devrait écrire un livre d’O'Reilly.
Parthian Shot

0

J'ai regardé tout autour et je n'ai pas pu trouver un seul script pour automatiser cette tâche.

Ainsi, en fonction des solutions proposées ici, j'ai tout mélangé dans un script Bash interactif qui répertorie les utilisateurs et les sessions who -upour que l'utilisateur choisisse ce qu'il doit faire.

Vous pouvez alors soit:

  • tuer toutes les sessions pour un utilisateur killall -u <username> -HUP
  • tuer une session spécifique kill <PID>

Toutes les informations requises proviennent de who -uet sont ensuite analysées à l'aide de mapfileet awk.

Je vais ajouter la possibilité d'envoyer un message en utilisant writeplus tard (forking le processus avec un retard).

Je vais probablement ajouter l'option de tuer une session spécifique avec kill -9aussi. Mais je n'ai eu aucun problème avec juste killet comme indiqué par d'autres, kill -9devrait être évité si possible.

Vous pouvez vérifier le code sur github si vous voulez l'essayer ou en apprendre plus sur la façon dont je le fais de manière automatisée:


0

Alors, comment pouvez-vous exclure les utilisateurs [bénins] de votre machine Linux?

En fin de compte, il s’agit d’identifier et de mettre fin aux processus possédés, associés ou créés par un identifiant utilisateur. Peu importe les commandes que vous utilisez pour atteindre cet objectif, tant que vous y arrivez.

Fondamentalement deux réponses ...

Option A: provoquer une déconnexion dudit utilisateur, quelle que soit la durée et le nombre de connexions qu'il possède. Cela impliquerait donc d'identifier les processus appartenant à un utilisateur, traçables par uid, et classés comme faisant partie d'un processus de connexion pour la distribution Linux donnée que vous exécutez. Réalisez qu'il existe des processus parents tels que SSH ou VNC avant la "connexion" et des processus enfants tels que GDM après la "connexion". Tuer un processus parent supprime généralement le processus enfant, mais pas toujours. Donc, vous voudriez tuer ces autres processus qui ne sont évidemment plus nécessaires après la déconnexion. En faisant tout cela, les tâches d'arrière-plan continueraient à s'exécuter ... car il s'agit d'un utilisateur bénin et vous souhaitez peut-être simplement les déconnecter. Autant que je sache, /usr/bin/wet /usr/bin/whosignalera qui est passé par le processus de connexion.

option B: mettre fin à tous les processus appartenant à un utilisateur spécifique, ce qui signifierait simplement de tuer tous les processus appartenant à cet utilisateur; cela les déconnecterait également s'ils étaient connectés. Cela satisferait le système . Cela doit être simple ps -ef | grep <uid>et mettre fin à tous ces processus de manière acceptable.

Fwiw dans SLES 11, il rapporte

compétences homme ... Ces outils sont probablement obsolètes et inutilisables. La syntaxe de la commande est mal définie. Pensez plutôt à utiliser les commandes killall, pkill et pgrep.

kill -9 FTW!


-1

À mon avis, il n’est pas vraiment utile de l’utiliser, killall -u usernamecar si c’est le même utilisateur que vous, vous allez vous lancer. Ainsi , killle processus sera une meilleure solution.


de même, si certains processus sont exécutés par cet utilisateur, peut-être que SSHD, vous ne viendrez jamais sur le serveur, peut provoquer l'arrêt de SSH.
Mail le

3
Pourquoi diable le démon SSH (ou n'importe quel démon) fonctionnerait-il en utilisant les informations d'identification d'un utilisateur qui doit être déconnecté de force du système pour une raison réaliste quelconque? En outre, qu'est-ce que cette réponse ajoute qui n'est pas couvert par la réponse de Michael Mrozek ou par Andrew B (et éventuellement par d'autres)?
un CVn

-2

Cette commande a très bien fonctionné pour l'interface graphique, mon "significatif" refusant de se déconnecter de ...

leaves@me:/# skill -HUP -u username
  • Je ne sais pas ce qui s'est passé
  • Il doit y avoir eu une mise à jour.
  • Le "Google" était à nouveau en panne.
  • C'était un virus sur l'InterWebs.

Quelques détournements au cas où vous en auriez besoin.


1
Ceci est déjà mentionné dans la réponse de bsd.
Stephen Kitt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.