4 pontos por GN⁺ 2024-06-24 | 1 comentários | Compartilhar no WhatsApp

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 sshd vinculada a um socket de domínio Unix

    mkdir /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 ProxyCommand para se conectar à instância local do sshd

    ssh -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 ProxyUseFdpass para 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 ssh

    ssh -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 sudo ou doas
  • 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.py for 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

 
GN⁺ 2024-06-24
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 com sshd. Se o gerenciador de pacotes do sistema estragar as permissões do sudo, também há como corrigi-las periodicamente com cron ou instalar o sudo diretamente do código-fonte.

  • run0 do systemd: a ferramenta run0 do 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 run0 do systemd: existe uma abordagem semelhante à ferramenta run0 do 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_spawn do 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.