4 puntos por GN⁺ 2024-06-24 | 1 comentarios | Compartir por WhatsApp

Objetivo

  • Permitir que solo los usuarios autorizados ejecuten comandos con privilegios de root
  • No usar elevación de privilegios

Implementación

  • Crear una clave SSH dedicada para usarla en la autenticación de root

    mkdir /root/.ssh/
    echo ssh-ed25519 AAAAC3Nza... > /root/.ssh/local_keys
    
  • Ejecutar una instancia del servidor sshd enlazada a un socket de dominio 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 la cuenta root y configurar que no se pueda iniciar sesión con contraseña

    # Cambiar la contraseña de root en el archivo /etc/passwd
    
  • Usar la opción ProxyCommand para conectarse a la instancia local de sshd

    ssh -o ProxyCommand='socat STDIO UNIX-CONNECT:/run/sshd/sshd.sock' \
        -i .ssh/root-key.pub \
        -t \
        root@root \
        "cd $(pwd); '$SHELL' --login"
    
  • Escribir un script que pase el descriptor de archivo del socket usando la opción ProxyUseFdpass

    #!/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)
    
  • Finalmente, ejecutar el 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"
    

Conclusión

  • Esta técnica usa OpenSSH para encargarse de los detalles de seguridad
  • Admite varios métodos de autenticación, incluidas claves SSH basadas en hardware
  • El proceso de configuración en un host nuevo no es complicado
  • El script passfd.py es una solución temporal para experimentar; para usarlo a diario, conviene implementarlo como un pequeño ejecutable

Opinión de GN⁺

  • Este método puede mejorar la seguridad como alternativa a sudo o doas
  • El enfoque de reforzar la autenticación usando SSH admite varios métodos de autenticación, incluida la autenticación basada en hardware
  • La configuración del sistema es relativamente sencilla, así que incluso un ingeniero principiante puede seguirla fácilmente
  • Si el script passfd.py se convierte en un pequeño ejecutable y se coloca en /usr/local/bin, puede usarse de forma más cómoda
  • Este método funciona solo de manera local, sin exposición de red, por lo que ofrece un alto nivel de seguridad

1 comentarios

 
GN⁺ 2024-06-24
Opiniones de Hacker News
  • Problema de complejidad adicional: en lugar de un único binario suid existente, se requieren dos binarios que se ejecuten como root y usen un socket UNIX. Esto aumenta la complejidad, incluyendo operaciones de criptografía asimétrica.

  • Seguridad del sistema: si se restringe el binario de sudo a un grupo específico (wheel) y se ajustan los permisos, se puede mantener un nivel de seguridad similar al enfoque de sshd. Si el administrador de paquetes del sistema rompe los permisos de sudo, también se puede corregir periódicamente con cron o instalar sudo directamente desde el código fuente.

  • run0 de systemd: la herramienta "run0" de systemd funciona de forma similar a sudo, pero no usa SUID. En cambio, solicita al administrador de servicios que ejecute el comando. Esto se parece más al comportamiento de ssh.

  • Comparación entre ssh y sudo: se cuestiona si iniciar sesión como root mediante ssh es realmente más seguro que sudo. Hace falta debatir cómo impedir el acceso de usuarios remotos a sshd. En comparación con las restricciones de sudo, el enfoque con ssh podría ser más vulnerable.

  • Problema de los servicios de red: si ssh no se inicia durante el arranque, también se vuelve imposible iniciar sesión desde la consola. Esto puede causar más problemas que sudo o su.

  • Enfoque similar a systemd run0: existe un enfoque parecido a la herramienta run0 de systemd.

  • Control detallado de sudo: sudo permite controlar en detalle los comandos, los argumentos, la creación de sub-shells y más. Un enfoque nuevo perdería ese control fino, y la gestión confiable de claves se vuelve más difícil.

  • Configuración de consola SSH: una forma de gestionar el acceso root es usar una consola SSH dedicada. La seguridad se refuerza con Yubikey y configuraciones de firewall.

  • Limitaciones del protocolo SSH: SSH no incluye la creación de procesos como parte del protocolo, y no puede pasar recursos locales a procesos hijo. Para usarlo como reemplazo de sudo, haría falta una extensión similar a POSIX spawn.

  • Gestión de usuarios: es importante no tratar a los usuarios como si fueran niños pequeños, sino establecer valores predeterminados razonables para evitar problemas potenciales. Si se necesita acceso root, lo ideal es iniciar sesión mediante la consola.

  • Problema del modo de usuario único: si no se puede iniciar sesión como root en modo de usuario único, la recuperación del sistema se vuelve difícil. Eso es necesario para resolver problemas que pueden surgir durante una actualización del sistema.