¿Cómo sacas a un usuario benigno de tu sistema?

66

Estaba buscando en Google hace un tiempo y noté un par de formas, pero supongo que Google no lo sabe todo. Entonces, ¿cómo te expulsar a los usuarios fuera de su máquina Linux? ¿también cómo haces para ver que están conectados en primer lugar? y relacionado ... ¿funciona su método si el usuario ha iniciado sesión en un X11 DE (no es un requisito, solo tengo curiosidad)?

xenoterracida
fuente
3
Se modificó la pregunta para reflejar los supuestos dada la respuesta aceptada. En el contexto de una violación de seguridad, la única forma de expulsar a un usuario malintencionado de su sistema es ser mucho más inteligente que ese usuario. Un usuario inteligente no se va a dejar aparecer en absoluto ni ser encontrado por algo tan trivial como who(1)o w(1). La única forma infalible de deshacerse de los posibles rootkits que puedan instalarse es limpiar y reinstalar completamente el sistema.
jw013

Respuestas:

140

Probablemente haya una manera más fácil, pero hago esto:

  1. Vea quién ha iniciado sesión en su máquina: use whoo w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Busque el ID de proceso del shell al que está conectado su TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Ríete de su inminente desconexión (este paso es opcional, pero se recomienda)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Mata el proceso correspondiente:

    > kill -9 30737
    

Acabo de descubrir que puedes combinar los pasos 1 y 2 dando whola -ubandera; el PID es el número a la derecha:

> 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
fuente
61
+1 para "Ríete de su inminente desconexión (este paso es opcional, pero se recomienda)"
Josh
9
kill -9¿eh? Realmente estás en modo BOFH en este caso.
Jander
12
@Jander Estás sacando a un usuario del sistema; que lindo necesitas ser?
Michael Mrozek
66
Normalmente, diría que no aliente a las personas a abusarkill -9 , y comience con señales más suaves , pero supongo que en este contexto no importa tanto. Solo estoy dejando un comentario en caso de que la gente se pierda el chiste.
jw013
55
También hay una matanza que básicamente automatiza todo el proceso (incluso burlándose de su víctima si habilita el modo butthead)
Ulrich Dangel
32

Como Micheal ya señaló, puede usar whopara averiguar quién ha iniciado sesión. Sin embargo, si tienen múltiples procesos, hay una forma más conveniente que matar cada proceso individualmente: puede usar killall -u usernamepara matar todos los procesos de ese usuario.

sepp2k
fuente
+1. El uso killalltambién será un poco más apropiado en entornos gráficos, ya que hay algo más que un caparazón para matar.
John WH Smith
3
ADVERTENCIA: Si usa esto para el usuario root, eliminará todos los procesos raíz y deberá reiniciar físicamente el servidor.
Kunok
1
@Kunok, ¿en qué situación te gustaría echar al usuario root de la máquina? ¿Como si esa cuenta fuera secuestrada o algo así?
Alexej Magura
23

¡Nigromancia!

Aprecio el humor de la respuesta aceptada, pero profesionalmente no puedo defenderla.

El método más elegante que conozco es enviar un -HUP al shell para simular el bloqueo de un usuario. Puede enviar esto al sshd inactivo del usuario para simular que se pierde su conexión, lo que desencadena una limpieza de todo el entorno del shell (incluidos los shells secundarios), o enviarlo a shells anidados específicos (por ejemplo, los que se configuran dentro de un multiplexor de terminal desconectado que te impiden desmontar un sistema de archivos) si quieres ser realmente preciso.

Sin writeembargo, usar para enviar mensajes a terminales inactivos antes de arrancarlos es un pasatiempo divertido.

Andrew B
fuente
1
Si bien el sentimiento pseudo-omnipotente que acompaña a un kill -9 es divertido, esta sugerencia es probablemente mejor. Un voto positivo de mi parte.
Andrew Falanga
44
Para que esta respuesta fuera explícita, lo que hice fue: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(la suspensión le da al usuario la oportunidad de guardar y cerrar sesión, pero probablemente solo esté usando esto en un usuario que olvidó cerrar sesión de todos modos)
wkschwartz
13

Cierre la sesión del usuario 'nombre de usuario':

skill -KILL -u username

Ver man skill

bsd
fuente
3
Creo que eso matará todos los procesos de ese usuario, no solo su caparazón, pero si eso es lo que quieres, entonces esto es definitivamente más simple
Michael Mrozek
Realmente no veo que esto funcione en RHEL7
antivirtel
11

Otro comando útil está pkillaquí pkill -u username && pkill -9 -u username. killallTiene la desventaja de que en Solaris IIRC significa algo completamente diferente: también pkilltiene opciones ligeramente más avanzadas.

Maciej Piechotka
fuente
8
En Solaris, los scripts de apagado utilizan 'killall' para matar (casi) todos los procesos en el servidor. "Hace lo que dice en la lata."
dr-ene
Amigos, ¿por qué les gusta tanto SIGKILL? La ejecución de programas y aplicaciones ni siquiera tendrá la oportunidad de guardar datos y limpiar un poco. SIGTERM (como se usa en el apagado) o SIGHUP también funcionará y es mucho más elegante. (Todavía puede enviar SIGKILL después de la expiración de un período de gracia.)
contramode
3

En primer lugar, esto indica un problema mayor. Si tiene usuarios en los que no confía en su sistema, probablemente debería nivelarlo y volver a crear una imagen.

Con eso en mente, puede hacer algo o todo lo siguiente:

# configurar el medio ambiente
$ BADUSER = foo # donde foo es el nombre de usuario en cuestión
$ 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 = $ (fecha +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# deshabilitar el inicio de sesión futuro del usuario
$ sudo chsh -s / bin / false "$ {BADUSER}"

# matar todos los procesos del usuario
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# copia de seguridad / borrar el directorio de inicio del usuario
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# buscar todos los archivos propiedad del usuario
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# eliminar usuario
$ sudo userdel $ {BADUSER}
cjac
fuente
No sé si estaría de acuerdo con "nivelarlo y volver a crear una imagen", esto es Unix, no Windows ... Realmente no tengo este problema ... Solo preguntaba.
xenoterracide
3
Además, el hecho de que deba expulsar a un usuario no significa necesariamente que no sea confiable. Tal vez se olvidaron de cerrar sesión.
David Z
xenoterracida: Tal vez solo protejo los sistemas que mantengo, pero si tuviera un usuario que sentía que necesitaba ser eliminado por la fuerza de un sistema bajo mi control, algo grave habría tenido que haber sucedido.
cjac
-1 para leer cosas en la pregunta que no siguen lógicamente y arrastrar el Q / A fuera de tema.
Wesley
you have users that you don't trust on your system... O podría ser que estás matando a uno como mensaje para los demás. Después de todo, ¿no es el credo del administrador de sistemas "Es mejor ser temido que ser amado"? Bromas aparte, Maquiavelo debería escribir un libro de O'Reilly.
Parthian Shot
0

Miré a mi alrededor y no pude encontrar un solo script para automatizar esta tarea.

Entonces, en base a las soluciones propuestas aquí, mezclé todo en un script Bash interactivo que enumera los usuarios y las sesiones who -upara que el usuario elija qué hacer.

Entonces puedes:

  • matar todas las sesiones para un usuario killall -u <username> -HUP
  • matar una sesión específica kill <PID>

Toda la información requerida proviene who -uy luego se analiza usando mapfiley awk.

Agregaré la posibilidad de enviar un mensaje usando writemás tarde (bifurcando el proceso con retraso).

Probablemente también agregaré la opción para matar una sesión específica kill -9. Pero no tuve problemas con los justos killy como lo señalaron otros, kill -9debería evitarse si es posible.

Puede verificar el código en github si desea probarlo u obtener más información sobre cómo lo estoy haciendo de manera automatizada:

Gus Neves
fuente
0

Entonces, ¿cómo sacas a los usuarios [benignos] de tu caja de Linux?

Al final, todo se reduce a identificar y finalizar los procesos que son propiedad, asociados o generados a partir de una identificación de usuario. Los comandos que use para alcanzar ese objetivo final no necesariamente importan mientras llegue allí.

Básicamente dos respuestas ...

Opción A: provocar el cierre de sesión de dicho usuario, para lo que sea y sin importar cuántos inicios de sesión tengan. Entonces, esto significaría identificar aquellos procesos que son propiedad de un usuario, rastreables por uid y clasificados como parte de algún proceso de inicio de sesión para la distribución de Linux dada que está ejecutando. Tenga en cuenta que hay procesos primarios como SSH o VNC antes del "inicio de sesión" y procesos secundarios como GDM después del "inicio de sesión". Por lo general, eliminar un proceso primario eliminará el proceso secundario, pero no siempre. Por lo tanto, desearía eliminar estos otros procesos que obviamente ya no son necesarios después del cierre de sesión. Al hacer todo esto, esto mantendría los trabajos en segundo plano en ejecución ... porque es un usuario benigno y tal vez solo desee cerrar la sesión. Por lo que yo sé, /usr/bin/wy /usr/bin/whoa informar que ha pasado a través del registro en el proceso.

opción B: finalizar por completo todos los procesos que pertenecen a un uid específico, lo que simplemente significaría eliminar todos y cada uno de los procesos que posee dicho usuario, esto también los desconectaría si están conectados. Esto satisfaría la expulsión del sistema . Eso solo tiene que ser simple ps -ef | grep <uid>y luego finalizar todos esos procesos de cualquier manera que sea aceptable.

fwiw en SLES 11 informa

habilidad del hombre ... Estas herramientas son probablemente obsoletas e inportables. La sintaxis del comando está mal definida. Considere usar los comandos killall, pkill y pgrep en su lugar.

kill -9 FTW!

ron
fuente
-1

En mi opinión, no es realmente útil de usar killall -u usernameporque si se trata del mismo usuario que tú, comenzarás. Entonces killel proceso será una mejor solución.

Mailo
fuente
Además, si hay procesos ejecutados por ese usuario, quizás SSHD nunca ingrese al servidor, lo que provocará el apagado de SSH.
Mailo
3
¿Por qué demonios se estaría ejecutando el demonio SSH (o cualquier demonio) utilizando las credenciales de un usuario que necesita desconectarse por la fuerza del sistema por cualquier motivo realista? Además, ¿qué agrega esta respuesta que no está cubierta por la respuesta de Michael Mrozek o la respuesta de Andrew B (y posiblemente otras)?
un CVn
-2

Este comando funcionó muy bien para la GUI, mi "significativo" se niega a cerrar sesión en ...

leaves@me:/# skill -HUP -u username
  • No se que paso.
  • Debe haber habido una actualización.
  • El "Google" estaba caído nuevamente.
  • Era un virus en InterWebs.

Algunas diversiones en caso de que las necesites.

JaInI
fuente
1
Esto ya se menciona en la respuesta de bsd.
Stephen Kitt