Come si espelle un utente benigno dal sistema?


66

Stavo cercando su Google un po 'di tempo fa e ho notato un paio di modi, ma suppongo che Google non sappia tutto. Così come si calci utenti fuori la propria macchina Linux? anche come fai a vedere che sono connessi in primo luogo? e correlati ... il tuo metodo funziona se l'utente ha effettuato l'accesso a un X11 DE (non è un requisito, sono solo curioso)?


3
Domanda modificata per riflettere i presupposti data la risposta accettata. Nel contesto di una violazione della sicurezza, l'unico modo per eliminare un utente malintenzionato dal sistema è quello di essere molto più intelligente di quell'utente. Un utente intelligente non si farà vedere in utmp o verrà trovato da qualcosa di così banale come who(1)o w(1). L'unico modo infallibile per sbarazzarsi di eventuali rootkit che possono essere installati è quello di cancellare completamente e reinstallare il sistema.
jw013,

Risposte:


140

Probabilmente c'è un modo più semplice, ma lo faccio:

  1. Guarda chi ha effettuato l'accesso al tuo computer - usa whoo w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Cerca l'ID di processo della shell a cui è collegato il TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Ridi della loro imminente disconnessione (questo passaggio è facoltativo, ma incoraggiato)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Uccidi il processo corrispondente:

    > kill -9 30737
    

Ho appena scoperto che puoi combinare i passaggi 1 e 2 dando whola -ubandiera; il PID è il numero sulla destra:

> 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 per "Ridi della loro imminente disconnessione (questo passaggio è facoltativo, ma incoraggiato)"
Josh

9
kill -9eh? Sei davvero in modalità BOFH su questo.
Jander,

12
@Jander Stai buttando fuori un utente dal sistema; che bello devi essere?
Michael Mrozek

6
Normalmente, direi di non incoraggiare le persone ad abusarekill -9 e di iniziare con segnali più delicati , ma suppongo che in questo contesto non abbia molta importanza. Sto solo lasciando un commento nel caso in cui la gente salti la battuta.
jw013,

5
C'è anche un omicidio che praticamente automatizza l'intero processo (anche prendendo in giro la tua vittima se abiliti la modalità Butthead)
Ulrich Dangel

32

Come già sottolineato da Micheal, puoi usare whoper scoprire chi ha effettuato l'accesso. Tuttavia, se hanno più processi, c'è un modo più conveniente di uccidere ogni processo singolarmente: puoi usarlo killall -u usernameper uccidere tutti i processi di quell'utente.


+1. L'uso killallsarà anche leggermente più appropriato negli ambienti grafici, dato che c'è molto più di una semplice shell da uccidere.
John WH Smith,

3
ATTENZIONE: se lo si utilizza per l'utente root, tutti i processi root verranno interrotti e sarà necessario riavviare fisicamente il server.
Kunok,

1
@Kunok sotto quale situtazione vorresti dare il calcio d'utente root dalla macchina? Come se quell'account venisse dirottato o qualcosa del genere?
Alexej Magura,

23

Negromanzia!

Apprezzo l'umorismo della risposta accettata, ma professionalmente non posso sostenerla.

Il metodo più grazioso di cui sono a conoscenza è inviare un -HUP alla shell per simulare un blocco dell'utente. È possibile inviare questo al sshd inattivo dell'utente per simulare la perdita della connessione, che innesca una ripulitura dell'intero ambiente della shell (comprese le shell secondarie) o inviarlo a shell nidificate specifiche (ad esempio, quelle che si trovano all'interno di un multiplexer terminale disconnesso che ti impediscono di smontare un filesystem) se vuoi essere davvero preciso.

L'uso writedi inviare messaggi a pty inattivi prima di avviarli è comunque un hobby divertente.


1
Mentre la sensazione pseudo-onnipotente che accompagna un'uccisione -9 è divertente, questo suggerimento è probabilmente migliore. Un voto positivo da parte mia.
Andrew Falanga,

4
Per rendere esplicita questa risposta, quello che ho fatto è stato: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(il sonno dà all'utente la possibilità di salvare e disconnettersi, ma probabilmente lo stai usando solo su un utente che ha dimenticato di disconnettersi comunque)
wkschwartz

13

Disconnetti l'utente "nome utente":

skill -KILL -u username

Vedere man skill


3
Penso che ucciderà tutti i processi di quell'utente, non solo la loro shell, ma se è quello che vuoi, allora questo è decisamente più semplice
Michael Mrozek

Non vedo davvero questo lavoro su RHEL7
antivirtel,

11

Altro comando utile è pkillqui pkill -u username && pkill -9 -u username. killallsvantaggio che su Solaris IIRC significhi qualcosa di completamente diverso - pkillhanno anche opzioni leggermente più avanzate.


8
Su "killall" di Solaris viene utilizzato dagli script di arresto per terminare (quasi) tutti i processi sul server. "Fa quello che dice sulla scatola."
dr-jan,

Gente, perché ti piace tanto SIGKILL? L'esecuzione di programmi e applicazioni non avrà nemmeno la possibilità di salvare i dati e ripulire un po '. SIGTERM (come viene usato allo spegnimento) o SIGHUP farà altrettanto ed è molto più grazioso. (Puoi ancora inviare SIGKILL dopo la scadenza di un periodo di tolleranza.)
Contromodalità

3

Innanzitutto, questo indica un problema più grande. Se hai utenti di cui non ti fidi sul tuo sistema, probabilmente dovresti livellarlo e ri-immagine.

Tenendo presente ciò, è possibile eseguire alcune o tutte le seguenti operazioni:

# imposta l'ambiente
$ BADUSER = foo # dove foo è il nome utente in questione
$ 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 = $ (data +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# disabilita l'accesso futuro dell'utente
$ sudo chsh -s / bin / false "$ {BADUSER}"

# uccide tutti i processi dell'utente
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# esegue il backup / cancella la home directory dell'utente
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# trova tutti i file di proprietà dell'utente
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# rimuovi utente
$ sudo userdel $ {BADUSER}

Non so che sarei d'accordo con "level it an reimage", questo è unix, non Windows ... Non ho davvero questo problema ... Stavo solo chiedendo.
xenoterracide,

3
Inoltre, solo perché devi dare il calcio d'inizio a un utente non significa necessariamente che siano inaffidabili. Forse si sono appena dimenticati di disconnettersi.
David Z,

xenoterracide: forse sono solo protettivo nei confronti dei sistemi che mantengo, ma se avessi un utente che ritengo necessario essere rimosso con la forza da un sistema sotto il mio controllo, sarebbe dovuto accadere qualcosa di grave.
cjac,

-1 per leggere cose nella domanda che non seguono logicamente e trascinare il Q / A off-topic.
Wesley,

you have users that you don't trust on your system... O potrebbe essere che stai uccidendo uno come messaggio per gli altri. Dopotutto, il credo del sysadmin non è "È meglio temere che essere amati"? A parte gli scherzi, Machiavelli dovrebbe scrivere un libro su O'Reilly.
Parthian Shot il

0

Mi sono guardato intorno e non sono riuscito a trovare un singolo script per automatizzare questo compito.

Quindi, in base alle soluzioni qui proposte, ho mescolato tutto in uno script Bash interattivo che elenca gli utenti e le sessioni da cui who -ul'utente può scegliere cosa fare.

È quindi possibile:

  • uccidere tutte le sessioni per un utente killall -u <username> -HUP
  • uccidere una sessione specifica kill <PID>

Tutte le informazioni richieste provengono who -ue vengono quindi analizzate utilizzando mapfilee awk.

Aggiungerò la possibilità di inviare un messaggio usando in writeseguito (rinviando il processo con un ritardo).

Probabilmente aggiungerò anche l'opzione per uccidere una sessione specifica kill -9. Ma non ho avuto problemi con il giusto kille, come sottolineato da altri, kill -9dovrebbe essere evitato se possibile.

Puoi controllare il codice su github se vuoi provarlo o saperne di più su come lo sto facendo in modo automatizzato:


0

Quindi, come togliete agli utenti [benigni] dalla vostra scatola di Linux?

Alla fine si tratta di identificare e terminare quei processi che sono di proprietà, associati o generati da un ID utente. Qualunque sia il comando che usi per raggiungere l'obiettivo finale, non importa necessariamente finché ci arrivi.

Fondamentalmente due risposte ...

Opzione A: causa la disconnessione di detto utente, per la quale ha sempre e comunque molti accessi. Quindi questo significherebbe identificare quei processi che sono di proprietà di un utente, rintracciabili da uid e classificati come parte di alcuni processi di login per la data distribuzione di Linux che stai eseguendo. Renditi conto che ci sono processi padre come SSH o VNC prima del "login" e processi figlio come GDM dopo il "login" Normalmente uccidere un processo genitore ucciderà il processo figlio, ma non sempre. Quindi vorresti uccidere questi altri processi che ovviamente non sono più necessari dopo il logout. Nel fare tutto ciò, ciò manterrebbe i lavori in background in esecuzione ... perché è un utente benigno e forse vuoi solo disconnetterli. Per quanto ne so, /usr/bin/we /usr/bin/whoriferirà che è passato attraverso il processo di login.

opzione B: terminare completamente tutti i processi di proprietà di uno specifico uid, il che significherebbe semplicemente uccidere tutti i processi di proprietà di tale utente, questo li disconnetterebbe anche se fossero connessi. Ciò soddisferebbe il calcio d'inizio del sistema . Questo deve solo essere un semplice ps -ef | grep <uid>e quindi terminare tutti quei processi in qualunque modo sia accettabile.

in seguito in SLES 11 riporta

abilità dell'uomo ... Questi strumenti sono probabilmente obsoleti e non portabili. La sintassi del comando è mal definita. Prendi invece in considerazione l'utilizzo dei comandi killall, pkill e pgrep.

kill -9 FTW!


-1

A mio avviso, non è davvero utile da usare killall -u usernameperché se è lo stesso utente di te, ti darai il calcio d'inizio. Quindi killil processo sarà una soluzione migliore.


anche se ci sono processi eseguiti da quell'utente, forse SSHD non entrerai mai nel Server, causando l'arresto di SSH.
Mailo,

3
Perché mai il demone SSH (o qualsiasi demone) dovrebbe essere in esecuzione utilizzando le credenziali di un utente che deve essere forzatamente disconnesso dal sistema per qualsiasi motivo realistico? Inoltre, cosa aggiunge questa risposta che non è coperta dalla risposta di Michael Mrozek o dalla risposta di Andrew B (e forse di altri)?
un CVn

-2

Questo comando ha funzionato alla grande per la GUI che il mio "significativo" rifiuta di disconnettersi da ...

leaves@me:/# skill -HUP -u username
  • Non so cosa sia successo.
  • Deve esserci stato un aggiornamento.
  • "Google" era di nuovo inattivo.
  • Era un virus su InterWebs.

Alcune deviazioni nel caso in cui ne abbiate bisogno.


1
Questo è già menzionato nella risposta di bsd.
Stephen Kitt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.