SSH es uno de los protocolos de comunicación más populares de Internet, ya que nos proporciona la capacidad de acceder de forma segura a sistemas locales y remotos utilizando un canal de comunicación encriptado. Además de ser Open-Source, es ampliamente usado por personal de TI (por ejemplo, Desarrolladores, Webmasters, Administradores de Sistemas, Pentesters, etc).
Si bien SSH server cumple con su función, no es del todo seguro, ya que aún puede ser atacado y descifrada la comunicación si no se siguen las mejores prácticas para fortalecer la seguridad correctamente.
Para este artículo utilizaremos un servidor SSH previamente configurado de la publicación anterior. El cual cuenta con las siguientes características:
- OS -> Ubuntu Server 21.04
- Openssh-server -> 1:8.4p1-5ubuntu1.1s
Configuración predeterminada del servidor SSH.
- Puerto TCP 22
- Configuración del servidor -> /etc/ssh/sshd_config
- Configuración del cliente -> /etc/ssh/ssh_config
- Claves privadas/públicas del usuario y configuración del cliente - > /home/user/.ssh/
Valores predeterminados de sshd_config.
- Include /etc/ssh/sshd_config.d/*.conf
- ChallengeResponseAuthentication no
- UsePAM yes
- X11Forwarding yes
- PrintMotd no
- AcceptEnv LANG LC_*
- Subsystem sftp /usr/lib/openssh/sftp-server
- PasswordAuthentication yes
Generación de claves SSH.
El servidor OpenSSH admite varias formas de autenticación, pero se recomienda utilizar la autenticación basada en claves. Para ello usaremos el comando ssh-keygen
como se muestra a continuación:
┌──(naek㉿nkf)-[/tmp/tmp.3WPZzTrk2W]
└─$ ssh-keygen -t rsa -b 4096 -f ~/Documents/.ssh/id_rsa_$(date +%Y-%m-%d)
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/naek/Documents/.ssh/id_rsa_2021-09-09
Your public key has been saved in /home/naek/Documents/.ssh/id_rsa_2021-09-09.pub
The key fingerprint is:
SHA256:3yZ+Imerm9RBwHSKXFukVkJ7qw5OjY5evqoT0Bhwrvs naek@nkf
The key's randomart image is:
+---[RSA 4096]----+
|o . +*.= |
|.o . o.@ |
| +. o * o |
|o.. . o . |
|.. S o |
| .. o + o |
|. . = + + o |
| .. B +.o+o. |
| E++.=.=*o+ |
+----[SHA256]-----+
Donde: -t rsa -> Especifica el tipo de clave a crear.
-b 4098 -> Número de bits.
-f id_rsa_$(date +%Y-%m-%d) -> Nombre del archivo.
Posteriormente usaremos el comando
ssh-copy-id
para habilitar el inicio de sesión con nuestras claves en el servidor remoto, de forma predeterminada el script agrega nuestra clave pública en el fichero ~/.ssh/authorized_keys.
┌──(naek㉿nkf)-[/tmp/tmp.3WPZzTrk2W]
└─$ ssh-copy-id -i ~/Documents/.ssh/id_rsa_2021-09-09.pub naek@172.16.104.8
Configurar un puerto personalizado.
De forma predeterminada Openssh-server usa el puerto 22 TCP, que es ampliamente conocido por herramientas de seguridad y ciber atacantes.
En el fichero sshd_config busque la línea 'Port 22' y cambien el valor del puerto por otro disponible. (ej. Port 49152).
Nota: ahora es necesario especificar el puerto con la flag -p, pero esto no es necesario ya que podemos crear "alias" dentro del fichero ssh_config o ~/.ssh/config.
naek@nkf ~ % grep "ubuntvm" /etc/ssh/ssh_config -A 4
Host ubuntvm
Hostname 172.16.104.8
User naek
Port 49152
IdentityFile ~/Documents/.ssh/id_rsa_2021-09-09
Flags: -Host -> "Alias" para el servidor SSH
-Hostname -> Dirección IP o Dominio.
-User -> Usuario.
-Port -> Puerto Oyente.
-IdentityFIle -> Clava RSA privada.
Deshabilitar Root.
Esta es una opción nos permite bloquear el inicio de sesión para el usuario root, por defecto está deshabilitada, pero es necesario comprobar que el valor ‘PermitRootLogin’ se encuentre inactivo (#) o con el valor ‘PermitRootLogin no’, y utilizar un usuario normal con permisos ejecución del comando sudo.
Desconectar Sesiones Inactivas.
Los parámetros ClientAliveInterval, y ClientAliveCountMax nos ayudaran a bloquear las conexiones inactivas en nuestro servidor, Descripción general de dichas configuraciones:
ClientAliveInterval: Intervalo de tiempo de espera en segundos para obtener una respuesta del cliente.
ClientAliveCountMax: Número máximo de intentos antes de desconectar el cliente.
El siguiente ejemplo, el servidor verificará al cliente después de 15 minutos de inactividad, intentara 3 veces y si no obtiene respuesta, desconectara y terminará la sesión.
ClientAliveInterval 900
ClientAliveCountMax 3
Lista Blanca de Usuarios.
Esta opción nos permite limitar el acceso para unos pocos usuarios, de forma predeterminada nos permite iniciar sesión para todos los usuarios. Para configurarlo solo buscamos ‘AllowUsers’ e ingresamos el nombre de usuario o usuarios separados por espacio para establecer un valor. (ej. AllowUsers naek) Las directivas allow/deny users, se procesan en el siguiente orden DenyUsers, AllowUsers.
Deshabilitar la autenticación de contraseña.
Una vez configurada correctamente la autenticación mediante claves, podemos deshabilitar autenticación de contraseñas. Buscaremos la línea ‘PasswordAuthentication yes’ -> ‘PasswordAuthentication no’.
Cuando está configurada esta opción e intentamos conectar al servidor nos saltará el siguiente mensaje; naek@172.16.104.8: Permission denied (publickey). Como podemos ver ahora solo admite autenticación basada en claves.
┌──(naek㉿kali)-[~]
└─$ ssh naek@172.16.104.8 -p 49152
naek@172.16.104.8: Permission denied (publickey).
┌──(naek㉿kali)-[~]
└─$ ssh admin@kolibers.com
admin@kolibers.com: Permission denied (publickey).
Deshabilitar X11Forwarding.
Cuando el reenvío X11 está habilitado, puede haber exposición de datos, suplantación de autenticación y verificación . El riesgo de seguridad de usar el reenvío X11 es que el servidor de visualización X11 del cliente puede estar expuesto a un ataque cuando el cliente SSH solicita el reenvío.
Busque la siguiente línea: ‘X11Forwarding yes’. Cambie su valor a ‘X11Forwarding no’
Fail2Ban
Fail2Ban analiza los ficheros de registro como /var/log/auth.log y prohíbe las direcciones IP que realizan demasiados intentos fallidos de inicio de sesión, Es capaz de actualizar las reglas del firewall (iptables) para rechazar nuevas conexiones de dichas direcciones IP. Viene listo para poder leer muchos archivos de registro estándar, como sshd , apache, etc, además de esto puede configurarse para leer cualquier fichero de nuestra elección.
Instalación: sudo apt update && sudo apt install fail2ban
Configuración: Una vez finalizado el proceso de instalación procederemos a configurar el fichero /etc/fail2ban/jail.conf, con los siguientes valores:
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
enabled = true
mode = normal
port = 49152
logpath = %(sshd_log)s
backend = %(sshd_backend)s
[dropbear]
port = 49152
logpath = %(dropbear_log)s
backend = %(dropbear_backend)s
[selinux-ssh]
port = 49152
logpath = %(auditd_log)s
Ahora tenemos que reiniciar el servicio con el comando: sudo service fail2ban restart
. Una vez finalizado el proceso Fail2ban supervisará nuestros registros ssh en busca de actividad sospechosa, bloqueará dichas direcciones IP temporalmente. Algunas otras herramientas interesantes: SSHGuard, DenyHosts, Security/SSHBlock, IPQ BDB Filter, CSF Firewall, etc.
Contraseñas Fuertes.
Una recomendación general que siempre debemos tener en cuenta es el uso de contraseñas fuertes y complejas, tanto en cuentas locales del servidor, como en passphrase del par de claves SSH.
Configuración recomendada.
- Letras mayúsculas y minúsculas.
- Símbolos.
- Números.
- Un mínimo de 12 caracteres.
- Contraseñas únicas para inicio de sesión.
Número máximo de intentos de autenticación.
Especifique el número máximo de intentos de autenticación permitidos en el servidor. Esto es realmente útil si utilizamos la autenticación de contraseña. El valor predeterminado es 6.
'MaxAuthTries’ -> ‘MaxAuthTries 3’
Número Máximo de Sesiones.
Especifique el número máximo de sesiones permitidas. Establecer el valor de MaxSessions en 1 deshabilitará multiplexación de sesiones, mientras que establecerlo en 0 evitará todas las sesiones de shell, inicio de sesión y subsistema, ademas que permitirá el reenvío. El valor predeterminado es 10.
'MaxSessions' -> 'MaxSessions 1'
Deshabilitar el servidor OpenSSH.
En algunas distribuciones de Linux viene instalado de forma predeterminada, en caso de no ser necesario puede eliminar el paquete del sistema. Asegúrese de eliminar el servidor openssh-server para evitar ataques.
Para distribuciones basadas en Debian, usaremos el siguiente comando:
sudo apt remove openssh-server
Conclusión
En este artículo cubrimos algunos de los puntos más importantes para la seguridad de nuestros servidores SSH, siguiendo estos sencillos pasos puede ayudar a fortalecer un poco mas su configuración.
Recuerde mantener actualizado su servidor openssh-server con el comando: sudo apt update openssh-server
.
Para más información puede consultar los manuales de OpenSSH en línea mantenidos por el proyecto OpenBSD (Link aquí )
Escrito Por:
Jesús Flores
Security Engineer