Como você expulsa um usuário benigno do seu sistema?

66

Eu estava pesquisando isso no Google um pouco atrás e notei algumas maneiras, mas acho que o Google não sabe tudo. Então, como você expulsa os usuários da sua caixa Linux? Além disso, como você vê que eles estão conectados em primeiro lugar? e relacionados ... o seu método funciona se o usuário estiver conectado a um X11 DE (não é um requisito que estou curioso)?

xenoterracida
fonte
3
Pergunta alterada para refletir suposições, dada a resposta aceita. No contexto de uma violação de segurança, a única maneira de expulsar um usuário mal-intencionado do sistema é ser muito mais inteligente do que esse usuário. Um usuário inteligente não se permite aparecer em utmp ou ser encontrado por algo tão trivial quanto who(1)ou w(1). A única maneira infalível de se livrar de possíveis rootkits que possam estar instalados é limpar e reinstalar o sistema completamente.
Jw013

Respostas:

140

Provavelmente existe uma maneira mais fácil, mas eu faço o seguinte:

  1. Veja quem está conectado à sua máquina - use whoou w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Procure o ID do processo do shell ao qual o TTY está conectado:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Rir da desconexão iminente (esta etapa é opcional, mas incentivada)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Mate o processo correspondente:

    > kill -9 30737
    

Acabei de descobrir que você pode combinar as etapas 1 e 2 dando whoa -ubandeira; o PID é o número à direita:

> 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
fonte
61
+1 para "Rir de sua desconexão iminente (esta etapa é opcional, mas incentivada)"
Josh
9
kill -9, Hã? Você realmente está no modo BOFH neste.
Jander
12
@Jander Você está expulsando um usuário do sistema; Quão legal você precisa ser?
Michael Mrozek
6
Normalmente, eu diria que não incentive as pessoas a abusarkill -9 e , em vez disso, comece com sinais mais gentis , mas suponho que, nesse contexto, não importe tanto. Estou apenas deixando um comentário, caso as pessoas percam a piada.
Jw013
5
Há também é matar que basicamente automatiza todo o processo (mesmo tirando sarro de sua vítima se você ativar o modo de butthead)
Ulrich Dangel
32

Como Micheal já apontou, você pode whodescobrir quem está conectado. No entanto, se eles tiverem vários processos, há uma maneira mais conveniente do que matar cada processo individualmente: você pode usar killall -u usernamepara matar todos os processos por esse usuário.

sepp2k
fonte
+1. O uso killalltambém será um pouco mais apropriado em ambientes gráficos, pois há mais do que apenas um shell para matar.
John WH Smith
3
AVISO: Se você usar isso para o usuário root, matará todos os processos raiz e precisará reiniciar fisicamente o servidor.
Kunok
11
@Kunok sob que situação você gostaria de expulsar o usuário root da máquina? Como se essa conta fosse invadida ou algo assim?
Alexej Magura
23

Necromancia!

Aprecio o humor da resposta aceita, mas profissionalmente não posso defendê-la.

O método mais elegante que conheço é enviar um -HUP para o shell para simular um desligamento do usuário. Você pode enviar isso ao sshd inativo do usuário para simular a perda de conexão, o que aciona uma limpeza de todo o ambiente do shell (incluindo shells filhos) ou enviá-lo para shells aninhados específicos (por exemplo, aqueles configurados dentro de um multiplexador de terminal desconectado que impedem que você desmonte um sistema de arquivos) se você quiser ser realmente preciso.

Usar writepara enviar mensagens para ptys terminais antes de inicializá-los é um hobby divertido.

Andrew B
fonte
11
Embora o sentimento pseudo-onipotente que acompanha uma morte -9 seja divertido, essa sugestão é provavelmente melhor. Um voto positivo de mim.
Andrew Falanga
4
Para tornar esta resposta explícita, o que eu fiz foi: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(a sono dá ao usuário a chance de salvar e log off, mas você provavelmente só usar isso em um usuário que se esqueceu de fazer logoff de qualquer maneira)
wkschwartz
13

Efetue logout do usuário 'nome de usuário':

skill -KILL -u username

Vejo man skill

bsd
fonte
3
Eu acho que vai matar todos os processos por esse usuário, e não apenas sua casca, mas se é isso que você quer, então este é definitivamente mais simples
Michael Mrozek
Eu realmente não vejo isso trabalhando em RHEL7
antivirtel
11

Outro comando útil está pkillaqui pkill -u username && pkill -9 -u username. killallA desvantagem é que, no Solaris IIRC, isso significa algo completamente diferente - também pkillpossui opções um pouco mais avançadas.

Maciej Piechotka
fonte
8
No Solaris, o 'killall' é usado pelos scripts de desligamento para matar (quase) todos os processos no servidor. "Ele faz o que diz na lata."
dr-Jan
Gente, por que você gosta tanto de SIGKILL? A execução de programas e aplicativos nem terá a chance de salvar dados e limpar um pouco. SIGTERM (como é usado no desligamento) ou SIGHUP também funciona e é muito mais elegante. (Você ainda pode enviar SIGKILL após o termo de um período de carência.)
countermode
3

Primeiro de tudo, isso indica um problema maior. Se você possui usuários em quem não confia no seu sistema, provavelmente deve nivelá-lo e criar uma nova imagem.

Com isso em mente, você pode executar algumas ou todas as seguintes ações:

# configurar o ambiente
$ BADUSER = foo # em que foo é o nome de usuário em questão
$ USERLINE = $ (grep '^ $ {BADUSER}:' / etc / passwd)
$ BADUID = $ (eco $ {USERLINE} | awk -F: '{print $ 3}')
$ BADGID = $ (eco $ {USERLINE} | awk -F: '{print $ 4}')
$ BADHOMEDIR = $ (eco $ {USERLINE} | awk -F: '{print $ 6}')
$ BDIR = "~ / backup / backup doméstico /"
$ TSTAMP = $ (data +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -files - $ {TSTAMP} .txt"

# desativar o login futuro do usuário
$ sudo chsh -s / bin / false "$ {BADUSER}"

# mata todos os processos do usuário
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# faça backup / limpe o diretório inicial do usuário
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# encontre todos os arquivos pertencentes ao usuário
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# remover usuário
$ sudo userdel $ {BADUSER}
cjac
fonte
Eu não sei se eu concordaria com "nivelar uma imagem", isto é unix, não windows ... Eu realmente não tenho esse problema ... eu só estava perguntando.
Xenoterracide
3
Além disso, o simples fato de você ter de lançar um usuário não significa necessariamente que ele não é confiável. Talvez eles tenham esquecido de sair.
David Z
xenoterracide: Talvez eu seja apenas protetor dos sistemas que mantenho, mas se eu tivesse um usuário que eu precisava remover à força de um sistema sob meu controle, algo sério teria que ter acontecido.
cjac
-1 para ler as coisas da pergunta que não seguem logicamente e arrastar o tópico de perguntas e respostas.
Wesley #
you have users that you don't trust on your system... Ou pode ser que você esteja matando um como uma mensagem para os outros. Afinal, o credo do administrador de sistemas não é "É melhor ter medo do que ser amado"? Tirando todas as piadas, Maquiavel deveria escrever um livro de O'Reilly.
Parthian Shot
0

Eu olhei ao redor e não consegui encontrar um único script para automatizar esta tarefa.

Portanto, com base nas soluções propostas aqui, misturei tudo em um script interativo do Bash que lista os usuários e as sessões who -upara o usuário escolher o que fazer.

Você pode:

  • matar todas as sessões para um usuário killall -u <username> -HUP
  • matar uma sessão específica kill <PID>

Toda a informação necessária vem who -ue é analisada usando mapfilee awk.

Adicionarei a possibilidade de enviar uma mensagem usando writemais tarde (bifurcando o processo com um atraso).

Provavelmente vou adicionar a opção de matar uma sessão específica kill -9também. Mas não tive problemas com o justo kille, como apontado por outros, kill -9deve ser evitado, se possível.

Você pode verificar o código no github se quiser experimentá-lo ou saber mais sobre como estou fazendo isso de maneira automatizada:

Gus Neves
fonte
0

Então, como você expulsa os usuários [benignos] da sua caixa Linux?

No final, tudo se resume a identificar e finalizar os processos pertencentes, associados ou gerados a partir de um ID do usuário. Quaisquer comandos que você use para atingir esse objetivo final não importam necessariamente desde que você chegue lá.

Basicamente duas respostas ...

Opção A: causando um logout do referido usuário, para o qual sempre e no entanto muitos logons eles possuam. Portanto, isso significaria identificar os processos que pertencem a um usuário, rastreáveis ​​pelo uid e classificados como parte de algum processo de login para a distribuição Linux que você está executando. Perceba que existem processos pai como SSH ou VNC antes do "login" e processos filhos como GDM após o "login" Normalmente, matar um processo pai mata o processo filho, mas nem sempre. Portanto, você deseja eliminar esses outros processos que obviamente não são mais necessários após o logout. Ao fazer tudo isso, isso manteria os trabalhos em segundo plano em execução ... porque é um usuário benigno e talvez você queira apenas desconectá-los. Tanto quanto eu sei, /usr/bin/we /usr/bin/whoirá relatar quem passou pelo processo de logon.

opção B: finalize todos os processos pertencentes a um uid específico completamente, o que significaria simplesmente matar todo e qualquer processo pertencente ao referido usuário, isso também os desconectaria se eles estivessem logados. Isso satisfaria o pontapé inicial do sistema . Isso só precisa ser simples ps -ef | grep <uid>e, em seguida, finalizar todos esses processos da maneira que for aceitável.

fwiw no SLES 11 informa

habilidade do homem ... Essas ferramentas são provavelmente obsoletas e não portáveis. A sintaxe do comando está mal definida. Considere usar os comandos killall, pkill e pgrep.

kill -9 FTW!

Ron
fonte
-1

Na minha opinião, não é realmente útil usá- killall -u usernamelo porque, se for o mesmo usuário que você, você se dará bem. Portanto, killo processo será uma solução melhor.

Mailo
fonte
Além disso, se houver processos executados por esse usuário, talvez o SSHD, você nunca entre no servidor, cause o desligamento do SSH.
Mailo
3
Por que diabos o daemon SSH (ou qualquer daemon) estaria em execução usando as credenciais de um usuário que precisa ser desconectado à força do sistema por qualquer motivo realista? Além disso, o que essa resposta acrescenta que não é coberta pela resposta de Michael Mrozek ou de Andrew B (e possivelmente por outras)?
um CVn,
-2

Este comando funcionou muito bem para a GUI que meu "significativo" se recusa a sair de ...

leaves@me:/# skill -HUP -u username
  • Não sei o que aconteceu
  • Deve ter havido uma atualização.
  • O "Google" caiu novamente.
  • Era um vírus nas InterWebs.

Algumas diversões, caso você precise delas.

JaInI
fonte
11
Isso já é mencionado na resposta do bsd.
Stephen Kitt