Autenticación SSH usando certificados de usuario firmados en el servidor

Autenticación SSH usando certificados de usuario firmados en el servidor

Introducción

La autenticación SSH usando certificados de usuario es una alternativa al uso de claves públicas. Con este enfoque, los certificados de autenticación son generados y firmados desde el servidor. Esto ofrece un control centralizado para autenticar usuarios. Esta técnica permite al servidor verificar la autenticidad del usuario y facilita la gestión de autorizaciones sin requerir contraseñas. Así se tiene una mayor seguridad y un enfoque centralizado en la administración de accesos.

En un artículo anterior vimos como configurar SSH para funcionar sin contraseña, utilizando un par de claves criptográficas del usuario. En ese esquema se generan las claves en el lado del cliente y se instalan en el servidor. Para cada servidor que se desee controlar se debe instalar la clave del usuario y configurar el servidor SSH para aceptar la conexión mediante esa clave. En esta ocasión procederemos un poco a la inversa. Es decir, se generan certificados del usuario en el servidor. Para cada usuario que deba conectarse al servidor se realiza la configuración que veremos.

Autenticación SSH usando certificados de usuario firmados en el servidor

Paso 1: Preparación en el servidor

1. Configura el servidor SSH para la autenticación con certificados:

– Asegúrate de que SSH esté configurado para aceptar certificados. Edita el archivo de configuración SSH del servidor (`/etc/ssh/sshd_config`) y agrega o ajusta las siguientes opciones:

      TrustedUserCAKeys /etc/ssh/ca_pub_key  # Ruta a la clave pública de la CA (autoridad certificadora)

– Reinicia el servicio SSH para aplicar los cambios:

     sudo systemctl restart sshd

2. Genera el par de claves para la CA en el servidor:

– En el servidor, crea una clave privada y su correspondiente clave pública para la autoridad certificadora (CA):

     ssh-keygen -f /etc/ssh/ssh_ca -N ""

– La clave pública `ssh_ca.pub` será utilizada para firmar las claves de los usuarios, mientras que la privada debe mantenerse segura y sin compartir.

Paso 2: Firma de la clave del usuario

1. Recoge la clave pública del usuario:

– Pide al usuario que te envíe su clave pública (`~/.ssh/id_rsa.pub`).

2. Firma la clave pública del usuario con la CA:

– Usa la clave privada de la CA para firmar la clave del usuario, creando un certificado SSH que servirá como su credencial:

     ssh-keygen -s /etc/ssh/ssh_ca -I "[email protected]" -n usuario -V +30d -z 1 /ruta/a/la/clave_publica_del_usuario

– En este comando:

– `-I` es una identificación (ID) del certificado.

– `-n` especifica el nombre del usuario.

– `-V` define la validez del certificado.

– `-z` es el número de serial del certificado.

3. Envía el certificado al usuario:

– El archivo generado será algo como `id_rsa-cert.pub`. Envía este certificado al usuario para que lo incluya en su directorio SSH.

Perfecto, te ayudo con ese apartado. Aquí tienes una sección sobre la generación del par de claves en el cliente:

Generación del Par de Claves SSH en el Cliente, si no lo tuvieras

Para iniciar el proceso de autenticación mediante certificados de usuario, el primer paso es crear un par de claves pública y privada en el cliente. Este par se usará para que el servidor autentique al usuario. A continuación, te explico cómo generarlas:

1. Abrir una terminal en el cliente: La generación de claves se hace desde la línea de comandos.

2. Ejecutar el comando de generación: Usa el comando `ssh-keygen` para crear el par de claves. Puedes especificar un nombre de archivo y ubicación para guardar las claves (en este caso, `~/.ssh/id_rsa-cert`), o dejar el valor predeterminado.

     ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa-cert

Aquí:

– `-t rsa` define el tipo de clave como RSA (puedes cambiarlo a otro tipo, como `ed25519`).

– `-b 4096` establece el tamaño de la clave (4096 bits es seguro para RSA).

– `-f ~/.ssh/id_rsa-cert` especifica el archivo de salida de la clave.

3. Configurar una frase de seguridad opcional: Al generar el par, se te pedirá que ingreses una frase de seguridad para la clave privada. Esto agrega una capa adicional de seguridad, ya que incluso si alguien obtuviera la clave privada, necesitaría esta frase para usarla.

4. Revisar las claves generadas: Al finalizar, tendrás dos archivos:

   - `~/.ssh/id_rsa-cert` (clave privada)
   - `~/.ssh/id_rsa-cert.pub` (clave pública)

Este par de claves está listo para usarse en la autenticación con certificados de usuario firmados en el servidor.

Paso 3: Configuración en el cliente

1. Configura el cliente SSH para usar el certificado:

– El usuario debe copiar el certificado firmado (`id_rsa-cert.pub`) en su directorio SSH local (`~/.ssh/`) y actualizar su archivo de configuración SSH (`~/.ssh/config`) con:

         Host servidor_remoto
         HostName ip_del_servidor
         User usuario
         IdentityFile ~/.ssh/id_rsa
         CertificateFile ~/.ssh/id_rsa-cert.pub

2. Prueba la conexión:

– Ahora, el usuario puede intentar conectarse al servidor usando el comando SSH normal:

     ssh usuario@servidor_remoto

Consideraciones de Seguridad

El método de autenticación SSH usando certificados de usuario proporciona ventajas para grandes despliegues, ya que permite la revocación de certificados y una expiración definida para cada usuario. Además, al centralizar la firma de certificados en la CA, se simplifica la administración de usuarios y se refuerza la seguridad en comparación con las configuraciones de clave pública tradicionales.

Revocación y Extensión de Certificados SSH

La capacidad de revocar o extender certificados emitidos permite a los administradores un control preciso sobre el acceso de usuarios y garantiza que solo usuarios autorizados accedan al sistema. A continuación, explicamos cómo manejar estas acciones.

Revocación de Certificados

1. Creación de un archivo de revocación:

– Crea un archivo en el servidor SSH que contendrá los certificados revocados:

     touch /etc/ssh/revoked_certs

– En el archivo de configuración del servidor SSH (`/etc/ssh/sshd_config`), especifica la ruta del archivo de revocación para que el servicio SSH revise su contenido:

     RevokedKeys /etc/ssh/revoked_certs

2. Revocación de un certificado específico:

– Agrega el certificado revocado al archivo. Puedes hacerlo de manera manual o usando el comando `ssh-keygen`:

     ssh-keygen -kf /etc/ssh/revoked_certs -z número_serial_certificado

– La opción `-k` permite especificar el archivo de revocación, mientras que el número serial identifica el certificado a revocar.

3. Reinicio del servicio SSH:

– Para que los cambios se apliquen, reinicia el servicio SSH en el servidor:

     sudo systemctl restart sshd

Al realizar estos pasos, el servidor SSH no permitirá conexiones que utilicen certificados con números de serie que figuren en el archivo de revocación.

Extensión de la Validez de un Certificado

La extensión de un certificado SSH implica la creación de un nuevo certificado con una validez prolongada. Para evitar el acceso no autorizado, es preferible crear un nuevo certificado y revocar el anterior.

1. Firmado de un nuevo certificado:

– Usa la clave pública original del usuario para generar un nuevo certificado con una fecha de expiración extendida:

     ssh-keygen -s /etc/ssh/ssh_ca -I "[email protected]" -n usuario -V +90d -z 2 /ruta/a/la/clave_publica_del_usuario

– Cambia `+90d` a la nueva duración deseada y usa un nuevo número de serial (`-z 2` en este ejemplo) para que el certificado sea único.

2. Revocación del certificado anterior:

– Revoca el certificado previamente emitido, siguiendo los pasos anteriores para mantener actualizado el archivo de revocación.

3. Distribución del nuevo certificado:

– Envía el nuevo certificado al usuario, quien deberá sustituir el archivo antiguo en su directorio SSH local (`~/.ssh/`) para restablecer la autenticación.

Con esta estructura de revocación y extensión, se logra mantener el control sobre los accesos sin comprometer la seguridad del sistema.

Conclusión

Configurar SSH sin contraseña es una manera eficiente de mejorar la seguridad y la eficiencia al gestionar conexiones remotas. Además de evitar la necesidad de ingresar contraseñas repetidamente, el uso de certificados de usuario añade una capa significativa de protección frente a ataques. Este enfoque de emplear SSH sin contraseña complementa al que vimos en un artículo anterior. La elección del método a emplear dependerá de las necesidades específicas de cada caso.