...
Free digital security background

En este post veremos cómo securizar el acceso SSH de nuestro servidor

1 – Cambiar el puerto por defecto.

El puerto por defecto que usa SSH es el 22, conviene cambiarlo por otro para prevenir ataques de bots que estarán todo el rato intentando acceder.

Para cambiar el puerto, deberemos abrir al archivo de configuración:

sudo nano /etc/ssh/sshd_config

En las primeras líneas veremos:

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Descomenta la primera línea y sustituye el 22 por un número aleatorio, en mi caso usaré el 4242, pero tu puedes usar el que prefieras, tal que así:

Port 4242
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Control + S para guardar los cambios y Control + X para salir.

En el caso de contar un un firewall, como ufw, deberemos añadir el puerto nuevo y borrar el anterior. Omite este paso si no cuentas con ninguno.

sudo ufw deny 22
sudo ufw allow 4242

Para que los cambios surjan efecto deberemos reiniciar el daemon de ssh

sudo systemctl restart sshd

Y por último, para volver a acceder deberemos añadir la flag -p con el puerto que configuraste.

ssh <usuario>@<ip> -p <puerto>

2 – Denegar el login con el usuario root

Es bastante recomendable deshabilitar que el usuario root se pueda logear, y en el caso de necesitar los permisos de root, usar sudo

Abrimos de nuevo el archivo de configuración.

sudo nano /etc/ssh/sshd_config

Descomenta la siguiente línea y edítala para que diga no

Para encontrar la linea mas fácil pulsa Control + W y escribe lo que deseas buscar.

TIPS
PermitRootLogin no

Volveremos a repetir el proceso anterior para reiniciar el daemon.

sudo systemctl restart sshd

3 – Habilitar el login key-based

En el login key-based no usaremos contraseñas para acceder al servidor, en su lugar, usaremos nuestra clave pública (id_rsa.pub), que deberemos añadir al archivo authorized_keys en nuestro servidor.

Para empezar deberemos generar dichas claves en ambas maquinas, es decir servidor y cliente. Este comando funciona tanto en Linux como en Windows

ssh-keygen

Esto, nos genera en el directorio /home/usuario o en el caso de Windows C:\Users\usuario

una carpeta /.ssh que contiene dos archivos id_rsa (clave privada) y id_rsa.pub (clave pública)

La que nos interesa es la clave pública.

Windows: C:\Users\<usuario>/.ssh/id_rsa.pub

Linux: /home/<usuario>/.ssh/id_rsa.pub

Forma gráfica

Si estás usando Windows como máquina cliente, simplemente abre el archivo con el Bloc de notas o con Notepad++ y copia la clave

Si estás usando Linux como máquina cliente abre el archivo con el editor de texto de tu distribución o mediante la terminal usando el siguiente comando:

cat ~/.ssh/id_rsa.pub

En el servidor pega la clave que acabas de copiar en:

sudo nano /home/<usuario>/.ssh/authorized_keys

Control + S para guardar y Control + X para salir.


Mediante comandos

En Linux el comando será:

ssh-copy-id <usuario>@<ip> -p <puerto>

Puede que tarde un poco y nos pedirá la contraseña para realizar el proceso.

Y en Windows será:

scp -P puerto $env:USERPROFILE/.ssh/id_rsa.pub <usuario>@<ip>:~/.ssh/authorized_keys

Una vez ya tengamos las claves, el siguiente paso será abrir de nuevo la configuración de SSH.

sudo nano /etc/ssh/sshd_config

En la configuración busca las siguientes líneas:

#PasswordAuthentication yes
#PubkeyAuthentication yes

Y cambialo por:

PasswordAuthentication no
PubkeyAuthentication yes

Reiniciamos de nuevo el daemon y probamos su funcionalidad

sudo systemctl restart sshd

4 – Banear los intentos fallidos (Fail2Ban)

Fail2Ban es un software que se encarga de bloquear las IPs que hayan intentado loguearse de forma fallida un determinado número de veces.

Para empezar instala Fail2Ban

Debian/Ubuntu

sudo apt update
sudo apt install fail2ban

Una vez instalado abriremos la configuración:

sudo nano /etc/fail2ban/jail.conf

Bajamos hasta sección [DEFAULT], la que se encuentra descomentada.

Nos encontraremos con determinadas opciones que explicaré las más básicas a continuación

bantime = 10m

Esto definirá el tiempo de baneo o bloqueo, es decir lo que tendrás que esperar para volver a intentar loguearte desde esa IP.

maxretry = 5

Esto definirá el número máximo de intentos.

ignoreip = <ip o rango de ips>

Puedes configurarlo a tu gusto o según tus necesidades, yo usaré

bantime = 30m
maxretry = 5

Estas reglas serán para las que se usen por defecto en todos los servicios


Bajamos hasta encontrar la sección [sshd]

Podremos modificar reglas específicas para cada servicio, es decir, si queremos que el acceso SSH sea más restrictivo a otro servicio de los que incluye Fail2Ban, lo podremos definir aquí, tal que así:

[sshd]
port    = ssh
bantime = 1h
maxretry = 3

Control + S para guardar y Control + X para salir.

Ya solo queda reiniciar y habilitar el daemon y probar que funcione.

sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

Para verificar el funcionamiento:

sudo fail2ban-client status sshd

5 – Otras recomendaciones

Configurar un banner

Un banner es un mensaje que se mostrará al iniciar sesión, indicando la propiedad del servidor y de que solo deberá acceder personas autorizadas, evidentemente, esto no mejora la seguridad como tal, pero lo debemos poner por motivos legales.

Primero creamos un fichero con el banner.

sudo /etc/banner

Ponemos algo así:

Solo acceso autorizado. Este servidor es propiedad de example.com

Es recomendable que también o que solo lo pongas en inglés.

El siguiente paso es configurar el SSH para que muestre el mensaje que acabamos de crear.

sudo nano /etc/ssh/sshd_config

Añadimos la siguiente línea:

Banner /etc/banner

Control + S para guardar y Control + X para salir.

Reiniciamos el daemon y comprobamos su funcionalidad

sudo systemctl restart sshd

Opciones recomendadas

Estas opciones son recomendaciones que dependerá del usuario si decide habilitarlas o no, en algunas de ellas puede que sea redundantes.


LoginGraceTime 1m

Esto es el tiempo que el servidor dará al usuario para loguearse.


MaxAuthTries 3
MaxSessions 2

Definirá los intentos máximos que un usuario podrá realizar y el máximo de sesiones.


ClientAliveInterval 60
ClientAliveCountMax 3

La primera línea comprueba cada 60 segundos que el cliente esté vivo, es decir no este en reposo o AFK, y la segunda línea define los intentos que hará, si falla en esos tres intentos el servidor cerrará la conexión.


AllowUsers user1 user2

Aquí definimos que usuarios están habilitados para loguearse.


Protocol 2

Con esto le estaremos diciendo que use el protocolo 2, que es más nuevo y seguro.


Y aquí termina el post, gracias por leerlo y espero que te haya servido de ayuda, si tienes algo que aportar no dudes en comentarlo!

Un saludo

por andres

Deja una respuesta

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

Seraphinite AcceleratorOptimized by Seraphinite Accelerator
Turns on site high speed to be attractive for people and search engines.