Establecemos el procedimiento de acceso de emergencia a los hosts SSH con llaves de hardware

Establecemos el procedimiento de acceso de emergencia a los hosts SSH con llaves de hardware

En este post, desarrollaremos un procedimiento para el acceso de emergencia a los hosts SSH utilizando llaves de seguridad de hardware fuera de línea. Este es solo uno de los enfoques que puedes adaptar a tus necesidades. Vamos a almacenar la autoridad de certificación SSH para nuestros hosts en una llave de seguridad de hardware. Este esquema funcionará prácticamente en cualquier OpenSSH, incluyendo SSH con inicio de sesión único.

¿Por qué todo esto? Bueno, es una opción para un caso extremo. Es una puerta trasera que te permitirá acceder a tu servidor en caso de que, por alguna razón, nada más funcione.

¿Por qué usar certificados en lugar de llaves públicas / privadas para el acceso de emergencia?

  • A diferencia de las llaves públicas, los certificados pueden tener una duración muy corta. Puedes generar un certificado válido durante 1 minuto o incluso 5 segundos. Una vez transcurrido ese tiempo, el certificado quedará inutilizable para nuevas conexiones. Esto es ideal para el acceso de emergencia.
  • Puedes crear un certificado para cualquier cuenta en tus hosts y, si es necesario, enviar estos «certificados desechables» a tus colegas.

Lo que necesitarás

  • Llaves de seguridad que soportan llaves residenciales.
    Las llaves residenciales son llaves criptográficas que se almacenan completamente dentro de la llave de seguridad. A veces están protegidas por un código PIN alfanumérico. La parte pública de la llave residencial puede ser exportada de la llave de seguridad, si es necesario, junto con el descriptor de la llave privada. Los dispositivos USB de la serie Yubikey 5, por ejemplo, soportan llaves residenciales. Es preferible que estén destinadas únicamente para el acceso de emergencia al host. Para este post utilizaré solo una llave, pero deberías tener una adicional como respaldo.
  • Un lugar seguro para guardar estas llaves.
  • OpenSSH versión 8.2 o superior en tu computadora local y en los servidores a los que deseas acceder de forma emergente. Ubuntu 20.04 viene con OpenSSH 8.2.
  • (opcional, pero recomendable) Herramienta CLI para verificar certificados.

Preparación

Primero, necesitarás crear un centro de certificación que se encontrara en la llave de seguridad de hardware. Inserta la llave y ejecútalo:

$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]

Como comentario (-C), he indicado yubikey-9-512-742@smallstep.com, para no olvidar a qué llave de seguridad se refiere este centro de certificación.

Además de agregar la llave a Yubikey, se generarán localmente dos archivos:

  1. sk-user-ca, un descriptor de la llave que hace referencia a la llave privada almacenada en la llave de seguridad,
  2. sk-user-ca.pub, que será la llave pública para tu centro de certificación.

Pero no te preocupes, en Yubikey hay otra llave privada que no se puede extraer. Así que aquí todo está seguro.

En los hosts, como usuario root, añade (si aún no lo has hecho) a la configuración de tu SSHD (/etc/ssh/sshd_config) lo siguiente:

TrustedUserCAKeys /etc/ssh/ca.pub

Luego, en el host, añade la llave pública (sk-user-ca.pub) a /etc/ssh/ca.pub

Reinicia el daemon:

# /etc/init.d/ssh restart

Ahora podemos intentar acceder al host. Pero primero necesitaremos un certificado. Crea una pareja de llaves que estará asociada con el certificado:

$ ssh-keygen -t ecdsa -f emergency

Certificados y pares SSH
A veces es tentador usar un certificado como reemplazo de un par de llaves públicas/privadas. Pero para la autenticación del usuario, no es suficiente tener solo un certificado. Cada certificado también tiene una llave privada asociada. Por eso necesitamos generar esta pareja de llaves "de emergencia" antes de emitir un certificado para nosotros. Lo importante es que el certificado firmado lo mostramos al servidor, indicando la pareja de llaves para las cuales tenemos la llave privada.

Así que el intercambio de llaves públicas sigue vivo. Esto también se aplica a los certificados. Los certificados simplemente eliminan la necesidad del servidor de almacenar llaves públicas.

A continuación, crea el certificado mismo. Necesito autorización del usuario ubuntu dentro de un intervalo de 10 minutos. Puedes hacerlo a tu manera.

$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency

Se te pedirá que firmes el certificado con huellas digitales. Puedes añadir nombres de usuario adicionales, separados por comas, por ejemplo, -n ubuntu,carl,ec2-user

¡Eso es, ahora tienes un certificado! A continuación, debes establecer los permisos correctos:

$ chmod 600 emergency-cert.pub

Después de esto, puedes revisar el contenido de tu certificado:

$ step ssh inspect emergency-cert.pub

Así es como se ve el mío:

emergency-cert.pub
        Tipo: ecdsa-sha2-nistp256-cert-v01@openssh.com certificado de usuario
        Clave pública: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
        CA firmante: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
        ID de clave: "test-key"
        Serial: 0
        Válido: desde 2020-06-24T16:53:03 hasta 2020-06-24T17:03:03
        Principales:
                ubuntu
        Opciones críticas: (ninguna)
        Extensiones:
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

Aquí, la clave pública es la clave de emergencia creada por nosotros, y está asociada con la CA sk-user-ca.

Finalmente, estamos listos para ejecutar el comando SSH:


$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$

  1. Ahora puede crear certificados para cualquier usuario en el host que confíe en su CA.
  2. Puede eliminar emergency. Puede conservar sk-user-ca, pero no lo necesita, ya que también está en la clave de seguridad. También puede querer eliminar la clave pública PEM original de sus hosts (por ejemplo, en ~/.ssh/authorized_keys para el usuario ubuntu), si la ha usado para acceso de emergencia.

Acceso de emergencia: plan de acción

Inserte la clave de seguridad y ejecute el comando:

$ ssh-add -K

De esta manera, añadirá la clave pública de la CA y el descriptor de la clave al agente SSH.

Ahora exporte la clave pública para crear el certificado:

$ ssh-add -L | tail -1 > sk-user-ca.pub

Cree un certificado con una validez, por ejemplo, no mayor a una hora:

$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub

Y ahora nuevamente SSH:

$ ssh -i emergency username@host

Si su archivo .ssh/config causa algún problema al conectarse, puede ejecutar ssh con el parámetro -F none para prescindir de él. Si necesita enviar el certificado a un colega, la forma más simple y segura es Magic Wormhole. Solo necesitará dos archivos: en nuestro caso, son emergency y emergency-cert.pub.

Lo que me gusta de este enfoque es el soporte de hardware. Puede guardar las claves de seguridad en una caja fuerte y no desaparecerán.

Publicidad

Servidores épicos — es VPS baratos con potentes procesadores de AMD, con una frecuencia de núcleo de CPU de hasta 3.4 GHz. La configuración máxima permite resolver prácticamente cualquier tarea: 128 núcleos de CPU, 512 GB de RAM, 4000 GB de NVMe. ¡Únete!

Establecemos el procedimiento de acceso de emergencia a los hosts SSH con llaves de hardware

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster