Hardening y configuración de SSH

Cuando tenemos que configurar un servidor SSH en un equipo para acceder remotamente desde otro equipo, podemos hacerlo de dos maneras:

  • A través de usuario/password.
  • A través de claves SSH (Clave Pública y Clave Privada).

El problema de configurarlo a través de usuario/password es que al tener varios servidores y cada uno con su propias credenciales, es un poco complicado acordarse de todas ellas.

Para solucionar este problema utilizaremos claves SSH (Clave pública – Clave privada). La Clave Pública es la que pondremos en cada uno de estos servidores SSH a los que sólo podremos entrar con nuestra Clave Privada. Ambas claves se generan como un par de forma que sólo con esa clave privada podremos acceder al servidor que tiene la clave pública correspondiente. Muchas veces, para entenderlo de una manera fácil, esto se explica como:

  • Clave Pública >> Cerradura
  • Clave privada >> Llave

Podemos tener numerosas cerraduras pero sólo una llave.

Requisitos

Se han utilizado para este artículo dos equipos con Kali Linux y otro equipo con Windows 10.

Pasos a seguir

Describiremos en este apartado los pasos a seguir para configurar desde cero un servidor SSH, generar las claves pública y privada y conectarnos en remoto.

Instalar el servicio SSH

Como primer paso, instalaremos el servidor SSH :

ssh_instalacion

Una vez instalado, arrancaremos el servicio y comprobaremos su estado:

ssh_arrancar_estado

Comprobación de claves SSH existentes

Si por algún casual ya teníamos instalado y configurado un servidor SSH, comprobaremos si existen claves SSH anteriores. Para ello nos moveremos al directorio oculto ~/.ssh del usuario y listaremos los ficheros:

ssh_claves_antiguas
Como se puede observar, tenemos dos ficheros de un usuario antiguo, la clave pública y la clave privada. Como no las necesitamos podemos borrarlas o guardarlas en un directorio temporal. Nuestra opción será guardarlas en un directorio nuevo ssh_backup:

ssh_backup_old_keys

De esta forma no perdemos las claves de ese usuario por si las necesitásemos.

Generando las nuevas claves SSH

Vamos a empezar a crear las claves SSH para el usuario. Generaremos las claves utilizando el comando ssh-keygen al que pasaremos los parámetros siguientes:

  • Parámetro -t <tipo>: indicaremos el tipo de cifrado que queremos utilizar. En este caso RSA.
  • Parámetro -b <longitud>: indicaremos la longitud de clave.
  • Parámetro -C <etiqueta>: indicaremos una etiqueta identificativa para generar las claves. Puede ser un correo, nombre de usuario, etc…

Por defecto el comando ssh-keygen crea claves SSH con cifrado RSA de 2048 bits. A continuación se muestra un ejemplo en el que hemos utilizado RSA como cifrado para las claves, 4096 como la longitud de clave y un correo electrónico como etiqueta identificativa:

ssh_generacion_claves

Durante el proceso de creación de claves se han solicitado los siguientes datos:

  • Nombre del fichero en el que guardar las claves SSH: si vamos a tener varios usuarios, se pueden crear con un formato propio. Por ejemplo: ssh_usuario1, ssh_usuario2, etc… Por defecto se asiganará el nombre id_rsa.
  • Contraseña para el fichero de claves: debe ser una clave robusta de mínimo 8 caracteres formada por números, letras (Mayúscula y minúsculas) y símbolos. Si no especifficamos una, nos conectaríamos automáticamente gracias al intercambio de claves.

Finalmente ya tendremos nuestras claves creadas: thf_darko para la clave privada e thf_darko.pub para la clave pública:

ssh_claves_generadas

Como hemos comentado anteriormente, las claves generadas se guardarán en el directorio oculto ~/.ssh del usuario.

Añadiendo las claves al fichero authorized_keys

Para poder conectarnos a través de SSH necesitamos poner el contenido de la clave pública thf_darko.pub en el fichero authorized_keys dentro del directorio ~/.ssh del usuario en concreto. Si no existe este fichero lo crearemos nuevo. El contenido del fichero de clave pública sería el siguiente:

SSH_contenido_id_rsa.pub.png

Copiaremos ese contenido en el fichero authorized_keys del directorio ~/.ssh:

ssh_copy_to_authorized_keys

Accediendo al servicio SSH

El fichero authorized_keys contiene la clave pública que hemos generado y es lo que nos va a permitir conectarnos con la clave privada. El fichero de clave privada thf_darko lo copiaremos a un lugar seguro ya que es nuestra llave para acceder a este servidor.

En el equipo desde el que nos queremos conectar ubicaremos el fichero de clave privada en el directorio ~/.ssh del mismo usuario para el que se han generado las claves:

ssh_copiar_clave_privada

Sólo nos quedaría conectarnos al servidor SSH que configuramos ateriormente:

ssh_conectado_remoto

Accediendo al servicio SSH con Putty

Para acceder al servicio SSH con Putty desde Windows, tendremos que importar la clave privada que tenemos que utilizar y guardarla con el formato específico para Putty (OpenSSH >> Putty). Todo esto lo haremos con la herramienta Puttygen como veremos a continuación. Primero, habiendo descargado el programa, nos iremos a la pestaña Conversions y a la opción Import key:

ssh_putty_key_gen

Habiendo seleccionado el fichero de clave privada que habíamos generado (thf_darko) se solicitará la clave que tuvimos que introducir durante la creación de las claves:

ssh_putty_key_gen_passwd

Se cargará así la clave privada. Ahora rellenaremos el último campo donde especificaremos el valor de clave 4096 y pulsaremos el botón Save private key:

ssh_putty_private_imported

El fichero guardado tendrá extensión .ppk .Por último, abriremos el cliente Putty e introduciremos la dirección ip y puerto del servidor. Faltaría importar el fichero de clave privada, guardado antes con Puttygen, en la opción SSH >> Auth del menú lateral:

ssh_putty_config

Importamos el fichero y nos conectaremos con el botón Open

ssh_putty_auth

Al establecer conexión con el servidor se solicitará la contraseña de la clave privada:

ssh_putty_conexion

Ya estamos conectados a nuestro servidor SSH.

Permisos del directorio ~/.ssh

Si la conexión SSH con el servidor no nos funciona correctamente es debido a que los permisos del directorio ~/.ssh son demasiado permisivos por lo que siempre es recomendable cambiarlos a los siguientes:

ssh_permisos_ssh_authorized_keys

Hardening SSH

Los ficheros de configuración de SSH son los siguientes:

  • ssh_config: es el fichero de configuración del cliente SSH. Puede localizarse en /etc/ssh/ssh_config (configuración genérica) o en ~/.ssh/config (configuración para cada usuario).
  • sshd_config: es el fichero de configuración del servidor SSH. Puede localizarse en /etc/ssh/sshd_config.

Cambiar el puerto de SSH

El puerto por defecto del servidor SSH es el 22. Es recomendable cambiarlo debido a que muchos ataques están dirigidos a este puerto. De esta forma será menos localizable:

ssh_hardening_port

Versiones de protocolo SSH

Existen dos versiones del protocolo SSH de las cuales la primera versión se encuentra obsoleta aunque por temas de compatibilidad aún se incluye. Esto es un error que se debe solcuionar indicando que sólo se permitan comunicaciones basadas en el protocolo 2:

ssh_hardening_protocol

Tiempo de pantalla de login

Cuando un usuario se intenta conectar al servidor SSH, se le solicita una contraseña durante un periodo de tiempo. Si en ese tiempo no se autentica, se cierra, evitando así posibles ataques de fuerza bruta. Por lo tanto, es recomendable cambiar el valor de la variable LoginGraceTime a 20 ó 30 segundos:

ssh_hardening_login_grace_time

Autenticación del usuario Root

Es la directiva más importante para hacer más seguro nuestro servidor. Muchos de los ataques al protocolo SSH se hacen utilizando al usuario root con el fin de que al instalar el sistema se le haya asignado una contraseña débil o fácilmente adivinable. Para evitar que el usuario root pueda autenticarse en el sistema, asignaremos el valor no a la variable PermitRootLogin:

ssh_hardening_root_login

Permitir sólo usuarios definidos

Cualquier usuario, sabiendo la dirección del servidor SSH, puede intentar autenticarse o realizar un ataque. Limitando los usuarios que pueden autenticarse, nos asegura que no cualquier usurario puede autenticarse en el sistema. Podemos elaborar la lista por usuarios, añadiendo la variable AllowUsers, o por grupos, añadiendo la variable AllowGroups:

ssh_hardening_allow_users

ssh_hardening_allow_groups

Deshabilitar la autenticación con usuario password

Debido a que en este artículo se utiliza el servidor SSH para conectarse con claves pública y privada, vamos a deshabilitar la autenticación con usuario/contraseña y habilitar la autenticación con clave pública. De esta forma sólo los usuarios con la clave privada podrán conectarse al servidor. Buscaremos la línea que pone #PasswordAuthentication yes, descomentaremos la línea y cambiaremos el valor de yes a no para que no se permita la conexión al servidor SSH a través de usuario y contraseña:

ssh_hardening_password_no

De forma adicional, para permitir la autenticación con clave pública modificaremos la variable PubKeyAuthentication y le asignaremos el valor yes:

ssh_hardening_pubkey_auth

Número máximo de intentos de autenticación

Muchas veces un usuario tiene numerosos intentos para autenticarse en un sistema. Esto facilita que ante un ataque de fuerza bruta la conexión no se cierre, pudiendo llevar a cabo el ataque. Modificando o añadiendo la variable MaxAuthTries con valor 2 estableceremos la cantidad de intentos que un usuario puede fallar al introducir las credenciales de forma que al tercer intento se cierra la conexión:

ssh_hardening_max_tries

Esperamos que os haya servido.

Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *