El servicio SSH es el principal punto de acceso a su Servidor Cloud y, al mismo tiempo, uno de los servicios más expuestos a ataques. Esta guía te ayudará a mejorar la seguridad del servicio gracias a diferentes trucos y técnicas.
Cambiando puerto de escucha
El puerto predeterminado para escuchar la conexión SSH es 22:cambiar esta configuración permitirá nublar el servicio y aumentar la seguridad de la conexión.
Para evitar interferencias con otros servicios existentes en la máquina, es una buena práctica verificar qué puertos están actualmente en uso, usando el comando netstat:
$ netstat -n -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:*
A través del parámetro -l pasado a netstat, obligarlo a imprimir todas las conexiones que están en estado LISTEN. En este ejemplo se utilizan los siguientes puertos:
Servicio MySQL 3306
22 SSH
80 Apache2 / HTTP
53 DNS
Para cambiar de puerto, simplemente edite el archivo de configuración en /etc/ssh/sshd_config, descomentando la directiva Port:
#Port 22
Luego establezca un nuevo valor, posiblemente alto, para evitar que sea interceptado por cualquier software de escaneo automático de puertos (por ejemplo, 2200, 5574, 1022):
Port 5574
Para aplicar el cambio, cargue el servicio a través de:
$ sudo service sshd reload
Una vez aplicado el cambio, conéctese a su servidor especificando el nuevo puerto. Por ejemplo, si está utilizando el cliente SSH desde la línea de comandos:
$ ssh [email protected]<SERVER.IP> -p 5574
Uso de claves para autenticación
Muy utilizado por su seguridad, el acceso a través de claves RSA es una alternativa al inicio de sesión basado en contraseña. En este tipo de autenticación, el cliente genera una clave privada y la clave pública relacionada que se instala en la máquina del servidor para autenticar al cliente sin ambigüedades. .
Para instalar la clave pública, el cliente primero debe generar el par de claves usando el comando ssh-keygen:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file where to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
Antes de continuar con la generación, ssh-keygen solicita una frase de contraseña opcional que se puede usar para la autenticación. En este ejemplo para facilitar el acceso se ha dejado vacío el siguiente archivo.
Una vez terminado, el software guardará dos archivos en el lugar designado:
id_rsa:la clave privada del cliente, no se debe compartir con nadie.
id_rsa.pub:la clave pública compartible.
Para preparar el entorno del servidor, cree un archivo llamado authorized_keys en la carpeta .ssh dentro de la carpeta del usuario que usará para iniciar sesión:
$ sudo mkdir ~/.ssh
$ sudo touch ~/.ssh/authorized_keys
$ sudo chmod 600 ~/.ssh/authorized_keys
Asegúrese de que el archivo tenga los permisos indicados anteriormente.
Luego proceda pegando la clave pública previamente preparada por la máquina cliente:
$ sudo nano ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoTzd9RnqT0yioQG1klsLEK/VG9myo7CQ47aRXu7hnPit6Lgw5kAjC7vzNWYLTy2oIlsrVI7R/tvWmVNISGkWDp9U3fONbSLp+vgBKDzRUVAIqP/AIJ2THanyZxj2b8XU/4s2uzGoTLSR3ViX0JU6zTc+IkaBp1o3W3OolvO15E10/VYJCKN3TkxPsSSGE3QReXnCcnIZYAnrPf9f1DPP1Lo+VUCIzZ7IzcZajAWQ53hC71mTYNHkUgIlWxpRyEhnsRfmqEfUSFbTwpNEarv7vGlK686C4xVxlVfKbqlNa3/g2Vrae4ArVBM958JPZ6aa+7KDZfH5TDgPPtlFCIGkd [email protected]
Guarde el archivo y vuelva a cargar el servicio SSH:
$ sudo service sshd reload
En este punto debería ser posible acceder al servidor sin que se requiera ninguna contraseña:
$ ssh [email protected]<SERVER.IP>
Si todo funciona correctamente, deshabilite el acceso con contraseña desde la máquina servidor modificando el archivo /etc/ssh/sshd_config, con los siguientes parámetros:
ChallengeResponseAuthentication no
PasswordAuthentication no
Recuerde que puede agregar otras claves públicas simplemente guardándolas al final del archivo ~/.ssh/authorized_keys en la máquina servidor.
Limitación de tiempos de disponibilidad del servicio
Una estrategia para reducir accesos no deseados y ataques de fuerza bruta es reducir los tiempos de disponibilidad del servicio SSH. Si está seguro de que no necesita conectarse al servidor en determinados horarios (por ejemplo, de las 23:00 a las 08:00 del día siguiente), establezca un horario automático para bloquear el puerto de conexión.
Para ello, utilice el cortafuegos predeterminado llamado iptables, pero, antes de continuar con la configuración, recuerde que iptables, por su naturaleza, no guarda la configuración introducida.
Para guardar y cargar la configuración más rápido, use el paquete iptables-persistent, que vuelve a cargar la configuración guardada al iniciar el sistema.
Luego continúe instalando el paquete:
$ sudo apt-get install iptables-persistent
Después de completar su instalación, ingrese una "cadena" para bloquear el servicio SSH:
$ sudo iptables -N chain-ssh
$ sudo iptables -A INPUT -p tcp --dport 22 -j chain-ssh
De esta manera, todas las conexiones destinadas al puerto 22 (si su servicio SSH usa otro puerto, cambie este valor) pasarán por la cadena "chain-ssh" recién creada.
Guarde la configuración actual (que será cargada por iptables-persistent) con el comando:
$ sudo iptables-save > /etc/iptables/rules.v4
Luego cree un cronograma para ingresar y eliminar la regla en la cadena modificando el crontab de la siguiente manera:
$ sudo crontab -e
# m h dom mon dow command
0 23 * * * iptables -A chain-ssh -j DROP
0 8 * * * iptables -F chain-ssh
Como puede ver, con la primera operación se agrega una regla DROP de las conexiones a las 11:00 p. m., mientras que la segunda operación vacía la cadena a las 08:00 a. m. para restaurar el servicio.
Guarde el archivo para aplicar los cambios.