Eu preciso bloquear algumas contas de usuários, sem mexer com o HOME, se possível.
A maneira normal seria, usermod -L user
mas parece deixar o login ssh aberto com autenticação de chave pública (usada rotineiramente neste servidor).
Eu sei que poderia apenas mv /home/user/.ssh /home/user/_ssh
ou algo semelhante, mas essa é a maneira correta de fazer isso?
o que estou perdendo?
A documentação,
man usermod
, fornece a solução recomendada:E depois
Então, transformando isso em um exemplo real
Se você tiver uma data de expiração padrão configurada,
/etc/default/useradd
poderá incluir seu valor - se houver - como parte do processo de desbloqueio:Os trabalhos agendados
cron
também são desabilitados para um usuário com uma conta expirada, mas não apenas para uma conta bloqueada. As mensagens de errojournalctl -u cron
mostram o nome da conta do usuário expirado (neste casotest2
):Os trabalhos agendados com
at
permanecem não tentados. (Não está claro para mim se eles serão executados quando passarem da data de vencimento; empiricamente, parece que não.)Outros processos já em execução na conta bloqueada e expirada permanecem inalterados e continuam em execução.
Depois de emitir "usermod -L user" você pode negar o acesso ssh adicionando esta linha ao final do arquivo /etc/ssh/sshd_config :
Ou você pode criar um grupo para essa finalidade para poder negar o login ssh adicionando usuários ao grupo:
E adicione o grupo ao final do arquivo /etc/ssh/sshd_config :
Após cada alteração no arquivo /etc/ssh/sshd_config , certifique-se de recarregar o daemon sshd para aplicar as alterações:
O comando reload carregará as novas configurações e manterá todas as sessões ssh existentes abertas.
Como alternativa, você pode alterar o shell do usuário para que, mesmo que ele faça login, ele não receba um shell:
Eu poderia recomendar a criação de um script bash simples que fará todos os itens acima com apenas um comando.
deny-logon.sh:
Agora você simplesmente tem que executar o script assim:
E fará automaticamente todas as alterações acima para o "usuário".
EDIT: A solução @roaima é a mais correta, expirar uma conta desabilita todos os acessos a ela e deve ser feito se você quiser impedir que um usuário faça login.
Você deve ser capaz de desabilitar ssh-logins para usuários adicionando seus nomes de usuário ou grupos em
sob a configuração
DenyUsers
e/ouDenyGroup
.Veja
man 5 sshd_config
.Não se esqueça
HUP
do sshd.Para impedir adequadamente o acesso de um usuário em um servidor SSH, a solução correta é modificar a configuração do SSHD para que o acesso seja explicitamente negado usando as configurações
DenyUsers
e/ouDenyGroups
. Normalmente, sugiro usarDenyGroups
e criar um grupo dedicado para essa finalidade, ao qual você adiciona qualquer pessoa que não deveria ter acesso SSH.Para bloquear totalmente a conta, você também precisa bloquear a senha, configurá-la como expirada (ambos usando
usermod
) e alterar o shell de login para/sbin/nologin
que outros mecanismos de login não os deixem entrar. Você pode precisar fazer ainda mais do que isso em alguns casos também (por exemplo, se o servidor executar o Samba e o usuário tiver acesso a compartilhamentos de arquivos por meio do SMB, você provavelmente precisará bloquear sua conta do Samba também usandosmbpasswd
).Por que apenas bloquear a conta
usermod
não é suficiente?Isso se resume ao fato de que uma conta é 'bloqueada' no sentido tradicional do UNIX, fazendo com que não importa qual senha o usuário tente usar, ela nunca corresponderá ao que está no banco de dados de senhas. Isso significa, muito importante, que bloquear a conta afeta
usermod
apenas os serviços que estão autenticando no banco de dados de senhas do sistema (em um sistema Linux moderno, isso significaria os serviços configurados para usar opam_unix
módulo PAM para autenticação ).No entanto, o SSHD só autentica no banco de dados de senhas do sistema se a senha ou o mecanismo de autenticação de resposta de desafio estiver sendo usado. A autenticação de chave pública, bem como quaisquer outros mecanismos de autenticação (como GSSAPI ou s/key) envolvem apenas o banco de dados de senhas do sistema para verificar se a conta existe, portanto, geralmente funcionarão bem com uma conta bloqueada.
Por que definir o shell de login como
/sbin/nologin
não é suficiente?Isso tem a ver com o fato de que existem várias maneiras de acessar um sistema como uma conta de usuário específica que não tem nada a ver com um shell de login.
O mais relevante aqui é que SFTP, SCP e SSH com um comando explicitamente especificado não invocam um shell de login. Isso significa que mesmo com o shell de login definido como
/sbin/nologin
, você geralmente pode obter um shell de trabalho em um sistema como usuário executandossh -t user@host /bin/sh
(-t
é necessário solicitar explicitamente a alocação de pseudoterminal, que por sua vez é necessária para obter algumas coisas, comosudo
ouvim
para funcionam corretamente a partir do shell resultante), e quase sempre você ainda pode usar SFTP e SCP para mover arquivos.Outro exemplo disso seria usar
sudo -u user /bin/sh
para obter um shell de trabalho como um determinado usuário de uma sessão existente no sistema como um usuário diferente. Isso funcionará mesmo se o shell de login do usuário de destino estiver definido como/sbin/nologin
, embora se a conta também estiver bloqueada usandousermod
, você terá que executá-la como usuário root (pelo menos, em qualquersudo
configuração padrão).Bloquear a conta é a maneira correta. Você também pode querer remover o arquivo authorized_keys para derrotar o SSH.
Lembre-se de que existem outras maneiras além do SSH de logon.
Fazer qualquer coisa com rotinas "*rc" é desajeitado, mas comumente usado para contas "só sftp" se for uma conta de utilitário, digamos sftp ou SCP.
Mas !password é melhor do que mudar sua senha se a restauração for necessária.
Como sempre, mantenha backups e com segurança.
Se você não quiser confiar em suposições sobre como um software diferente tratará o estado bloqueado ou expirado no
shadow
arquivo, um grande martelo para bloquear completamente a conta de usuário é remover sua linha dopasswd
arquivo (mantendo um backup em outro lugar). Com essa alteração, não há mais mapeamento do nome de usuário para o uid ou diretório inicial, portanto, nada (sshd ou outro) pode procurar o nome de usuário, encontrar o diretório inicial e oauthorized_keys
arquivo (ou similar) e agir sobre ele.