Quero dizer, não apenas usando PermitRootLogin no
. Caso contrário, como isso pode ser alcançado com o mínimo de esforço e sem afetar o acesso de outros usuários, tanto locais quanto remotos, que podem ter credenciais para fazer login como root via SSH se tiverem feito login como usuários regulares? A PermitRootLogin no
configuração já está definida.
Também não quero criar novos usuários ou grupos, nem aplicar restrições de grupo. Que outras opções estão disponíveis além dessas?
Encontrei-os on-line, mas eles podem interromper a operação normal se o usuário ou outras pessoas estiverem localmente na máquina.
configuração do sudo: "/etc/sudoers":
username ALL=(ALL:ALL) ALL, !/bin/su, !/usr/bin/sudo -u root
configuração su no pam: "/etc/pam.d/su":
auth required pam_wheel.so use_uid
configuração de login no pam: "/etc/pam.d/login":
auth required pam_wheel.so use_uid
Eu simplesmente quero impedir o login root depois que um usuário fizer login normalmente. No entanto, se eles estiverem fisicamente presentes na máquina, eles poderão fazer login como root após fazer login com sua própria conta.
Existe uma configuração sshd_config
ou uma solução muito simples para isso, sem os requisitos indicados acima?
(Originalmente, a questão era mais rigorosa: isso é possível usando
sshd_config
? , mas desde então o OP a editou para permitir outras soluções "muito simples".)Não, não é possível.
Depois que um usuário normal tiver permissão para uma sessão de shell normal, a
sshd_config
configuração não poderá impor nenhuma restrição aos comandos usados nessa sessão.Para conseguir o que deseja, você precisaria de algo que impedisse o sucesso da mudança para root se o usuário estivesse em uma sessão SSH. Simplesmente exigir que a sessão seja baseada em um dispositivo não pseudo-TTY (ou seja, uma porta serial ou um console virtual, como pode ser conseguido com
pam_securetty
) vai longe demais, pois também bloqueará o acesso root de logins da GUI local.Isso exigiria algo como um módulo PAM para bloqueio
sudo
esu
autenticação (e quaisquer outros métodos de troca de usuário baseados em PAM, se você os tiver) e algo mais para bloquearpolkit
métodos de troca de usuário baseados empkexec
. Osshd_config
não tem nada a ver com nenhum desses mecanismos, portanto a resposta à sua pergunta deve ser “não”.A
sudo
linha de configuração que você encontrou na internet:tem um erro: bloquearia
sudo sudo -u root [...]
, mas permitiria plainsudo -i
,sudo bash
ou qualquer outro meio de obter root.Em geral, qualquer tentativa de " permitir todos os comandos, exceto (um número limitado de comandos 'ruins') " provavelmente será contornada trivialmente, já que usuários regulares do shell podem normalmente fazer suas próprias cópias de binários de comandos padrão sob nomes de sua própria escolha , permitindo a execução deles
sudo
porusername ALL=(ALL:ALL) ALL
parte da configuração.A maneira mais direta de conseguir o que deseja seria bloquear o acesso root por trás de alguma forma de token de autenticação física, como um cartão inteligente ou Yubikey. Um usuário remoto não pode conseguir o efeito de conectar um token de autenticação ao sistema físico. Também forneceria um segundo fator de autenticação, o que aumentaria significativamente a segurança do seu acesso root.
É possível, mas não tenho certeza de quão fácil é. No Linux (e praticamente apenas no Linux, e não em qualquer outro tipo Unix), existe um sinalizador chamado "no new privilégios" , que efetivamente desativa os binários setuid para o thread de chamada e todos os seus descendentes, irrevogavelmente. Não consegui encontrar nada na documentação do OpenSSH que sugerisse que o SSH possa habilitá-lo para você, então provavelmente você terá que fazer isso manualmente. Isso consistiria em escrever um pequeno programa C que é executado
prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
e então faz algo comoexecl("/bin/bash", "-bash", (char*) NULL)
executar o shell do usuário (que pode ou não ser bash, então você pode usargetpwuid(getuid())->pw_shell
para procurar o shell correto - verificação de erros omitida por questões de brevidade). Você então definiria ForceCommand para seu programa, para que os usuários sejam sempre forçados a invocar esse wrapper.Isso interromperá a capacidade dos usuários de executar comandos arbitrários, passando-os como um argumento extra para o SSH, o que ocasionalmente é útil. Se você deseja oferecer suporte a esse caso de uso, use
getenv
para procurar o valor da variável de ambienteSSH_ORIGINAL_COMMAND
e executá-lo se não estiver vazio. Observe que o SSH normalmente executa comandos executando o shell de login do usuário com o-c
sinalizador (seguido pelo comando solicitado), então você também deve fazer isso.Também não é totalmente infalível. Programas como run0 funcionam solicitando a um daemon privilegiado (neste caso, systemd) que execute comandos em nome de um usuário sem privilégios, sem usar setuid, portanto, "sem novos privilégios" não tem efeito sobre tal comando. Se você estiver executando o systemd (ou qualquer coisa parecida com o systemd), você precisará tomar as medidas apropriadas para bloquear essa funcionalidade separadamente (por exemplo, colocando a sessão SSH do usuário dentro de algum tipo de contêiner ou removendo seus privilégios para iniciar e parar unidades de serviço por meio da CLI do systemd).
Finalmente, esteja ciente de que este é um martelo muito grande. Ele desativa completamente o sudo e qualquer coisa que funcione como sudo (exceto run0 conforme discutido acima). Não há seletividade alguma - esta é uma bandeira de tudo ou nada. Mas pelo lado positivo, isso também significa que (quase) não há lacunas com as quais você precise se preocupar. Por exemplo, você não precisa forçar os binários interativos a algum tipo de modo "restrito" que impeça o usuário de obter um shell (como geralmente é necessário com restrições mais seletivas do sudo).