¿Cuáles son las formas de proteger SSH de usuarios curiosos? ¿Existe un método que sea el más confiable y que, una vez implementado, permita que el administrador se sienta tranquilo? Intentemos encontrar la respuesta a esta pregunta al considerar las siguientes mejores prácticas.
¿Qué es Secure Shell (SSH)?
SSH o Secure Shell o Secure Socket Shell es un protocolo de red mediante el cual los usuarios y administradores de sistemas pueden acceder a otras computadoras, incluso cuando la red en sí misma no es segura.
SSH proporciona contraseña segura y/o autenticación de clave pública mediante la cual un administrador de sistemas o administrador de red puede conectarse a cualquier computadora o aplicación de forma remota, ejecutar comandos y también mover archivos usando SFTP o el protocolo de transferencia de archivos SSH.
Secure Shell garantiza se desarrolló como respuesta a un ataque de “sniffing” en la Universidad de Tecnología de Helsinki. En el momento del ataque con “sniffers,” el protocolo Telnet era ampliamente utilizado, pero en la actualidad, el protocolo Secure Shell lo ha superado en seguridad y se utiliza de manera generalizada.
Ventajas de SSH
SSH protege los datos al cifrarlos antes de enviarlos y luego descifrarlos en el lugar designado. SSH permite al usuario emitir un comando que es comprendido y ejecutado por el servidor que escucha en la computadora remota. También se utiliza para monitoreo de servicios y enrutamiento, y se utiliza para ejecutar aplicaciones o incluso para transferir archivos. SSH le da al usuario un mayor control sobre su sitio y le brinda más libertad para administrarlo.
Ataque SSH
A pesar de que SSH es más seguro, los hackers tienen su propia manera de hacerlo inseguro. Uno de los ataques más famosos es el ataque de fuerza bruta de SSH.
Los atacantes prueban una variedad de combinaciones de nombre de usuario y contraseña hasta que encuentran la adecuada y obtienen acceso a una cuenta o a un servidor. El defecto más grave de un ataque de fuerza bruta es que muchos sistemas están configurados para bloquear a los atacantes después de un cierto número de intentos fallidos de inicio de sesión.
El proceso se invierte en un ataque de fuerza bruta de SSH. En lugar de intentar miles de combinaciones de nombre de usuario y contraseña en un solo servidor, los delincuentes intentan una combinación de nombre de usuario y contraseña en miles de servidores.
Los empleados eligen contraseñas débiles, lo que hace posible el ataque, y los hackers no tienen que preocuparse por los mecanismos de bloqueo porque cada servidor registra como máximo un intento de inicio de sesión fallido. También se conoce como un ataque “spray and pray”, lo que significa que los criminales apuestan a que si atacan a muchos servidores, alguno de ellos los dejará entrar. Puede ser efectivo, pero como puedes ver, no es muy útil si los delincuentes tienen su atención puesta en un objetivo específico.
Mejores Prácticas de Seguridad para Mitigar Ataques Basados en SSH:
Secure Shell se encuentra en todas partes. Desde su lanzamiento en 1995, SSH ha ganado una amplia difusión como un protocolo de acceso remoto potente para Linux.
Sin embargo, como se sabe, un gran poder conlleva una gran responsabilidad. Un demonio SSH mal configurado puede representar una amenaza mayor que una ayuda. A continuación, analizaremos varias técnicas para fortalecer la seguridad de SSH.
1. Deshabilitar el Inicio de Sesión como Root
Los servidores SSH, además de tener el puerto configurado por defecto en 22, permiten el inicio de sesión como root en la mayoría de los sistemas operativos Linux y Unix. Cualquiera puede conectarse al puerto 22, usar el usuario root como predeterminado y luego realizar una serie de intentos de fuerza bruta contra la dirección IP de tu servidor público.
Si tienes habilitada la autenticación por contraseña en tu servicio SSH y tu contraseña de root es débil, es muy probable que seas hackeado.
Como consecuencia, deshabilitar el inicio de sesión como root es uno de los métodos más antiguos y ampliamente utilizados para evitar que el sistema se vea comprometido en instalaciones de sistemas operativos nuevos.
Puedes evaluar esto dejando la instalación SSH tal como está, analizando el archivo /var/log/secure
y contando la cantidad de intentos de fuerza bruta que recibes en unas pocas horas.
Incluso si usas contraseñas fuertes, siempre es una buena idea deshabilitar el inicio de sesión como root y en su lugar usar un usuario SSH principal, para que si necesitas acceso como root, puedas usar el comando su
.
Entonces, utiliza el siguiente comando:
nano /etc/ssh/sshd_config
Busca la línea “PermitRootLogin”. Puede verse así:
PermitRootLogin yes
Cambia el valor “yes” a “no” para deshabilitar el inicio de sesión como root:
PermitRootLogin no
Reinicia el servicio SSH para que los cambios surtan efecto:
sudo service ssh restart
El inicio de sesión como root a través de SSH ahora estará deshabilitado en tu sistema.
2. Las Contraseñas en Blanco Deben Ser Deshabilitadas
En Linux y Unix, los administradores pueden crear usuarios con contraseñas en blanco. Y si quieres mantener a los atacantes fuera de tus servidores SSH, esto puede ser una desventaja. Como resultado, lo mejor que puedes hacer es bloquear los inicios de sesión remotos para cuentas con contraseñas en blanco modificando el archivo sshd_config
, lo cual es sencillo de realizar.
Comando:
nano -w /etc/ssh/sshd_config ;
Luego establece: PermitEmptyPasswords no
3. Establece un puerto SSH personalizado
Dado que SSH está configurado para escuchar en el puerto 22, que es ampliamente conocido entre los atacantes y las herramientas de seguridad, así como los escáneres de puertos que realizan intentos de fuerza bruta, cambiar el puerto es una medida de seguridad efectiva. Edita el archivo de configuración principal de SSH y cambia el puerto del 22 a puertos diferentes, como el 899.
Entonces, puedes hacerlo de la siguiente manera:
nano /etc/ssh/sshd_config
Busca la línea que contiene la configuración del puerto SSH. Por defecto, esta línea debería verse así:
Port 22
Cambia el número del puerto (en este ejemplo, 22) a cualquier número que desees, siempre y cuando no esté siendo utilizado por otro servicio en tu sistema. Por ejemplo, puedes establecerlo en 2222:
Port 2222
Asegúrate de que el nuevo puerto esté abierto en el firewall de tu sistema. Puedes permitir el tráfico en el puerto 2222 (o el que hayas configurado) en el firewall, así:
sudo ufw allow 2222/tcp
Nota: Si no estás utilizando UFW (Uncomplicated Firewall), deberás ajustar la configuración del firewall de acuerdo a tu sistema.
4. Configura un banner de advertencia personalizado para SSH
Establecer un banner de bienvenida personalizado para las conexiones SSH es una buena práctica para todas las máquinas Linux y Unix. Esto no es tanto un consejo de seguridad como una advertencia de seguridad para cualquier acceso no autorizado a tus sistemas. Un banner de advertencia aparecerá una vez que el usuario haya obtenido acceso.
Para esto, puedes utilizar el siguiente comando:
sudo nano /etc/ssh/sshd_config
Desplázate hacia abajo en el archivo hasta encontrar la sección que comienza con “#Banner
“. Debería verse de la siguiente manera:
#Banner /etc/issue.net
Elimina el signo de numeral “#” al principio de la línea para activar la configuración y proporciona la ubicación del archivo que contiene tu banner de advertencia personalizado. Puedes utilizar cualquier archivo de texto para el banner. Por ejemplo, si tu banner personalizado está en un archivo llamado “my_custom_banner.txt
“, la línea se vería así:
Banner /ruta/a/my_custom_banner.txt
********************************************
** Acceso no autorizado prohibido **
** Este sistema es para uso **
** autorizado solamente. **
** by: esgeeks **
**
** Todas las actividades **
** realizadas en este sistema **
** pueden ser monitoreadas y **
** registradas para fines de **
** seguridad de la red. **
********************************************
Reemplaza “/ruta/a/my_custom_banner.txt
” con la ubicación real de tu archivo de banner personalizado.
Reinicia el servicio SSH para que los cambios surtan efecto.
sudo service ssh restart
5. En laptops y computadoras de escritorio, deshabilita el servidor OpenSSH
Sin embargo, muchas distribuciones de Linux vienen con el servidor OpenSSH habilitado de forma predeterminada (lo que implica que el inicio de sesión como root está habilitado, el servicio escucha en el puerto 22, y así sucesivamente), y el acceso SSH es necesario para trabajar de forma remota en servidores dedicados, VPS y en la nube. No es necesario en computadoras personales. Para evitar ataques no deseados, asegúrate de desinstalar el servidor OpenSSH.
Para desinstalar el servidor OpenSSH en sistemas basados en Debian/Ubuntu (APT):
sudo apt-get remove openssh-server
sudo apt-get purge openssh-server
Para desinstalar el servidor OpenSSH en sistemas basados en Red Hat/CentOS (YUM/DNF):
sudo yum remove openssh-server
sudo dnf remove openssh-server
6- Inicio de Sesión en SSH sin Contraseña
En este escenario, la opción ideal es reemplazar los inicios de sesión basados en contraseñas obsoletas por inicios de sesión basados en claves, lo que mejorará tu seguridad y te permitirá realizar un inicio de sesión SSH rápido y sin solicitudes, como ocurre cuando se requiere una contraseña SSH.
Los inicios de sesión basados en contraseñas son buenos si tienes una colección fuerte de caracteres, como símbolos, mayúsculas, minúsculas y números, pero todos corren el riesgo de ser descifrados por fuerza bruta en algún momento. También puedes ejecutar procesos automatizados que requieren conexiones SSH mediante inicios de sesión basados en claves SSH.
Para habilitar la autenticación basada en claves SSH, sigue estos pasos:
El siguiente comando generará una clave SSH y te pedirá que elijas una ubicación y un nombre para la clave, generalmente se almacena en ~/.ssh/id_rsa por defecto.
ssh-keygen
Ahora, copia tu clave pública a la máquina remota a la que deseas conectarte sin contraseña.
ssh-copy-id usuario@direccion_ip
o, puedes especificar la dirección de la clave pública:
ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@direccion_ip
Luego, serás solicitado a ingresar la contraseña de tu cuenta en la máquina remota.
Una vez que hayas copiado tu clave pública, deberías poder conectarte a la máquina remota sin ingresar una contraseña:
ssh usuario@direccion_ip
La autenticación se realizará utilizando la clave SSH en lugar de una contraseña.
7. Limita el número de intentos de inicio de sesión con contraseña fallidos
Establecer un límite razonable en la cantidad de intentos que un atacante puede realizar para iniciar sesión con una contraseña incorrecta es una medida inteligente para protegerse contra los ataques de fuerza bruta. La configuración MaxAuthTries puede ser útil para evitar tales ataques.
Comando:
nano -w /etc/ssh/sshd_config
Busca MaxAuthTries
. Establécelo en 3
, como:
MaxAuthTries 3
8. Usa TCP Wrappers TCP
Wrappers funciona mediante dos archivos: /etc/hosts.allow
y /etc/hosts.deny
.
Ejemplos:
Utiliza la siguiente consulta para bloquear todas las conexiones desde un host desconocido:
nano -w /etc/hosts.deny
ALL : ALL
Con la regla anterior te bloquearás incluso a ti mismo. Si deseas permitir el acceso SSH desde ciertas direcciones IP mientras bloqueas el acceso desde otros, entonces establece:
sshd: ALL
Y puedes agregar el siguiente código al archivo de permitidos para permitir el acceso desde tu dirección IP de origen estática, por ejemplo:
nano -w /etc/hosts.allow
sshd : 1.0.0.1
También puedes utilizar tu IP pública real o tu IP de LAN privada para reemplazar la dirección IP. Esto te permitirá bloquear a todos los demás mientras permites solo las direcciones IP que especifiques.
Recuerda que TCP Wrappers funciona de arriba a abajo, por lo que si una regla en /etc/hosts.allow
permite el acceso, esa regla prevalecerá sobre una regla en /etc/hosts.deny
que deniegue el acceso.
9. Para usuarios y claves de SSH, utiliza contraseñas/frases fuertes
Si no puedes configurar una clave SSH y debes confiar en contraseñas de inicio de sesión, o si deseas utilizar una frase de contraseña para tus claves, asegúrate de utilizar una combinación de caracteres fuertes. Seguir estas pautas te ayudará a crear una contraseña/frase de contraseña fuerte y evitar ser hackeado durante un ataque de fuerza bruta.
Si es posible, incluye letras mayúsculas y minúsculas, símbolos, números y hasta 8 caracteres. Evita usar: palabras basadas en el diccionario, fechas de cumpleaños y aniversarios personales, nombres de familiares y mascotas.
10. Habilita notificaciones de inicio de sesión por correo/alerta
Configurar un pequeño script para generar una alerta cada vez que alguien inicia sesión como root a través de SSH es una de las mejores cosas que puedes hacer para controlar las conexiones entrantes de SSH.
Entonces, primero abre el archivo de configuración SSH:
sudo nano /etc/ssh/sshd_config
Luego, agrega o modifica las siguientes líneas para configurar notificaciones por correo:
# Habilita la notificación de inicio de sesión por correo
UsePAM yes
# Especifica la dirección de correo para recibir notificaciones
AddressNotificationAddress correo@dominio.com
Para enviar notificaciones por correo, necesitas un servidor de correo configurado en tu sistema. Puedes utilizar programas como Postfix
o sendmail
para esto.
Por ejemplo, si estás utilizando Postfix en un sistema basado en Debian/Ubuntu, puedes instalarlo con:
sudo apt-get install postfix
Luego, debes configurar Postfix para enviar correos. La configuración puede variar según tus necesidades y preferencias. Una vez configurado, puedes utilizar el servidor de correo para enviar notificaciones de inicio de sesión.
No olvides guardar los cambios realizados en /etc/ssh/sshd_config
y reiniciar el servicio SSH para que los cambios surtan efecto:
sudo service ssh restart
11. Filtra el puerto SSH en el firewall
Una de las primeras cosas que todos los servidores deben hacer después de instalar el sistema operativo es configurar un firewall de software en el servidor. ConfigServer Security & Firewall (CSF) de ConfigServer es uno de los firewalls más populares y efectivos que hemos encontrado. CSF es fácil de instalar en distribuciones basadas en planes (sin panel de control), y filtrar los puertos es aún más sencillo.
Para filtrar el puerto SSH en el firewall utilizando ConfigServer Security & Firewall (CSF), puedes seguir estos pasos:
sudo nano /etc/csf/csf.conf
Encuentra la configuración del puerto SSH:
TCP_IN = "22"
Para filtrar el puerto SSH, simplemente elimina el número del puerto de la línea o comenta la línea agregando un signo de numeral (#) al principio:
# TCP_IN = "22"
O, si deseas permitir el acceso SSH solo desde ciertas direcciones IP, puedes modificar la línea de la siguiente manera (reemplaza 1.2.3.4 con la dirección IP deseada):
TCP_IN = "22,1.2.3.4"
Una vez que hayas guardado los cambios en el archivo de configuración, reinicia CSF para que los cambios surtan efecto:
sudo csf -r
12. Identifica y bloquea automáticamente los ataques de fuerza bruta de SSH
Es sencillo detectar y bloquear ataques de fuerza bruta de SSH. El método manual implica analizar los registros del sistema para determinar quién está intentando conectarse al servidor y luego bloquearlos con el firewall del sistema. Sin embargo, existen varias soluciones que pueden automatizar y reducir esas tareas tediosas por ti. SSHGuard, Fail2ban y DenyHosts son solo algunas de las tecnologías disponibles para protegerse contra ataques de fuerza bruta.
https://github.com/denyhosts/denyhosts
13. Mantén actualizado SSH
La guía más importante que debes recordar es mantener actualizados los paquetes de tu servidor, lo que incluye OpenSSH. Esto debería ser suficiente para mantener tu servidor OpenSSH protegido contra vulnerabilidades emergentes.
Utiliza el siguiente comando para actualizar SSH y otros paquetes del sistema:
sudo apt upgrade openssh-server # Para sistemas basados en Debian/Ubuntu
sudo yum update openssh-server # Para sistemas basados en CentOS/Red Hat
14. Establece el Intervalo de Inactividad
Establecer el intervalo de inactividad te permite finalizar las sesiones de SSH que no se están utilizando. Por ejemplo, si configuramos un valor de 240, que equivale a 4 minutos, la sesión de SSH se cerrará automáticamente una vez que se alcance el tiempo de inactividad.
Entonces, abre el archivo de configuración:
sudo nano /etc/ssh/sshd_config
Busca la configuración de inactividad en las siguientes líneas:
ClientAliveInterval 300
ClientAliveCountMax 0
El valor 300
representa 5 minutos, que es el tiempo predeterminado. Puedes modificar la línea ClientAliveInterval
para establecer el intervalo de inactividad deseado en segundos.
También puedes modificar ClientAliveCountMax
si deseas permitir un número específico de veces que se permite inactividad antes de la desconexión.
Finalmente, siempre que hayas realizado cambios en el archivo de configuración, reinicia el servicio SSH para que los cambios surtan efecto:
sudo service ssh restart # Para sistemas basados en Debian/Ubuntu
sudo systemctl restart sshd # Para sistemas basados en CentOS/Red Hat
Conclusión
Como se mencionó anteriormente, SSH ofrece numerosas ventajas, pero debe mantenerse con medidas de seguridad adecuadas. En tu sistema operativo Unix/Linux, las pautas de seguridad de SSH anteriores te ayudarán a prevenir la mayoría de los ataques comunes de SSH.