SSH como tecnologia substituta do Sudo
(whynothugo.nl)Objetivo
- Permitir que apenas usuários autorizados executem comandos com privilégios de root
- Não usar elevação de privilégios
Implementação
-
Gerar uma chave SSH dedicada para usar na autenticação do root
mkdir /root/.ssh/ echo ssh-ed25519 AAAAC3Nza... > /root/.ssh/local_keys -
Executar uma instância do servidor
sshdvinculada a um socket de domínio Unixmkdir /run/sshd/ chown root:wheel /run/sshd/ chmod 750 /run/sshd/ s6-ipcserver /run/sshd/sshd.sock sshd -ie -o AuthorizedKeysFile=/root/.ssh/local_keys -o PermitRootLogin=yes -
Bloquear a conta root e configurar para que login por senha não seja possível
# alterar a senha do root no arquivo /etc/passwd -
Usar a opção
ProxyCommandpara se conectar à instância local dosshdssh -o ProxyCommand='socat STDIO UNIX-CONNECT:/run/sshd/sshd.sock' \ -i .ssh/root-key.pub \ -t \ root@root \ "cd $(pwd); '$SHELL' --login" -
Escrever um script usando a opção
ProxyUseFdpasspara passar o descritor de arquivo do socket#!/usr/bin/env python3 import sys import socket import array s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.connect("/run/sshd/sshd.sock") fds = array.array("i", [s.fileno()]) ancdata = [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)] socket.socket(fileno=1).sendmsg([b'\0'], ancdata) -
Por fim, executar o comando
sshssh -o ProxyCommand='/home/hugo/tmp/passfd.py' \ -i .ssh/root-key.pub \ -o ProxyUseFdpass=yes \ -t \ root@root \ "cd $(pwd); '$SHELL' --login"
Conclusão
- Essa técnica usa o OpenSSH para lidar com os detalhes de segurança
- Suporta vários métodos de autenticação, incluindo chaves SSH baseadas em hardware
- O processo de configuração em um novo host não é complicado
- O script
passfd.pyé uma solução temporária para experimentação; para uso diário, é melhor transformá-lo em um pequeno executável
Opinião do GN⁺
- Esse método pode aumentar a segurança como alternativa a
sudooudoas - A abordagem de reforçar a autenticação com SSH suporta vários métodos de autenticação, incluindo autenticação baseada em hardware
- A configuração do sistema é relativamente simples, então até engenheiros iniciantes podem seguir com facilidade
- Se o script
passfd.pyfor transformado em um pequeno executável e colocado em/usr/local/bin, ele poderá ser usado com mais conveniência - Como esse método funciona apenas localmente, sem exposição à rede, ele oferece alta segurança
1 comentários
Comentários do Hacker News
Problema de complexidade adicional: em vez do binário SUID único existente, passam a ser necessários dois binários usando um binário executado como root e um socket UNIX. Isso aumenta a complexidade, inclusive com operações de criptografia assimétrica.
Segurança do sistema: se o binário do sudo for restrito a um grupo específico (
wheel) e as permissões forem ajustadas, é possível manter um nível de segurança semelhante ao da abordagem comsshd. Se o gerenciador de pacotes do sistema estragar as permissões do sudo, também há como corrigi-las periodicamente comcronou instalar o sudo diretamente do código-fonte.run0do systemd: a ferramentarun0do systemd funciona de forma parecida com o sudo, mas não é SUID. Em vez disso, ela solicita que o gerenciador de serviços execute o comando. Nesse sentido, seu comportamento é mais parecido com o do ssh.Comparação entre ssh e sudo: há dúvidas sobre se fazer login como root via ssh é realmente mais seguro do que usar sudo. É preciso discutir como bloquear o acesso de usuários remotos ao
sshd. Em comparação com as limitações do sudo, a abordagem com ssh pode ser mais vulnerável.Problema de serviço de rede: se o ssh não iniciar durante o boot, o login pelo console também se torna impossível. Isso pode causar mais problemas do que o sudo ou o
su.Abordagem semelhante ao
run0do systemd: existe uma abordagem semelhante à ferramentarun0do systemd.Controle detalhado do sudo: o sudo permite controlar em detalhe comandos e argumentos, criação de sub-shells etc. A nova abordagem perde esse nível de controle detalhado, e o gerenciamento de chaves confiáveis fica mais difícil.
Configuração de console SSH: uma forma de gerenciar o acesso root é usar um console SSH dedicado. A segurança é reforçada com Yubikey e configurações de firewall.
Limitações do protocolo SSH: no SSH, a criação de processos não faz parte do protocolo, e não é possível passar recursos locais para processos-filho. Para usá-lo como substituto do sudo, seria necessária uma extensão semelhante ao
posix_spawndo POSIX.Gerenciamento de usuários: é importante não tratar os usuários como crianças e definir padrões razoáveis para evitar problemas em potencial. Se for necessário acesso root, o ideal é fazer login pelo console.
Problema do modo single-user: se não for possível fazer login como root no modo single-user, a recuperação do sistema fica difícil. Isso é necessário para resolver problemas que podem surgir durante atualizações do sistema.