Bastionado SSH con 2FA y Telegram
Hoy os voy a dar unas pequeñas pautas para hacer un bastionado o hardening de un servicio básico en Linux como es SSH.
Cuando queréis publicar un servicio como SSH hacia Internet o simplemente, securizar de una forma extra vuestro servicio por criticidad, probablemente, SSH por si solo no sea la mejor opción, aunque te lo parezca, al ser un protocolo de los llamados “seguros”.
Es un protocolo de comunicaciones, capa 7 en el modelo OSI (Aplicación), que nos permite operar entre, por ejemplo, una red no segura mediante el encriptado de la comunicación. A simple vista, más que suficiente para la mayoría de pymes o empresas, pero vamos a darle una capa extra de seguridad, mediante autenticación de doble factor (2FA) y alertas con Telegram cuando se produzca un login en el sistema operativo Linux.
Para este ejemplo, voy a usar el nuevo Debian 11, sobre una máquina virtual Proxmox. En el proceso de instalación he instalado el complemento SSH Server:
Una vez instalado, nos conectaremos a nuestro server:
1 2 3 4 5 6 7 8 9 10 11 12 |
MacBook-Pro-de-Raul:~ negu$ ssh elblogdenegu@192.168.2.215 elblogdenegu@192.168.2.215's password: Linux debian11 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat Aug 21 11:28:55 2021 from 192.168.2.177 elblogdenegu@debian11:~$ |
He agregado el usuario mediante el comando visudo a sudo:
Hardening básico SSH
Para evitar problemas, aunque en Debian no es posible por defecto, lo primero que haremos es asegurarnos que el usuario root no puede entrar directamente por SSH. Editamos el fichero:
1 |
sudo nano /etc/ssh/sshd_config |
Y nos aseguramos que la línea siguiente esté de esta forma:
1 |
PermitRootLogin no |
Modificamos el periodo de gracia de la sesion:
1 |
LoginGraceTime 20 |
Evitar que existan contraseñas en blanco que puedan logarse en el sistema:
1 |
PermitEmptyPasswords no |
Deshabilitamos que al conectarse se diga la versión del sistema:
1 |
DebianBanner no |
Existen más opciones…pero de momento con esto nos valdría sin ponernos muy “quisquillosos”.
Configurar 2FA (Doble factor de autenticación) en SSH
Vamos al grano…usaremos el 2FA de Google, que es fácil de implementar. Instalamos paquete necesario:
1 |
elblogdenegu@debian11:~$ sudo apt install libpam-google-authenticator |
Hacemos una copia del primer fichero a modificar:
1 |
elblogdenegu@debian11:~$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.old |
Modificamos el fichero:
1 |
elblogdenegu@debian11:~$ sudo nano /etc/pam.d/sshd |
Y agregamos la línea:
1 |
auth required pam_google_authenticator.so |
Reiniciamos el servicio:
1 |
sudo systemctl restart sshd.service |
Hacemos un nuevo backup del fichero:
1 |
elblogdenegu@debian11:~$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old |
Modificamos el fichero:
1 |
elblogdenegu@debian11:~$ sudo nano /etc/ssh/sshd_config |
Cambiamos la siguiente línea a YES:
1 |
ChallengeResponseAuthentication no |
Descomentamos la siguiente línea:
1 |
#PasswordAuthentication yes |
Instalaros en vuestro dispositivo la app GOOGLE AUTHENTICATOR. La necesitaréis para configurar la herramienta.
Ahora lanzáis el comando:
1 |
elblogdenegu@debian11:~$ google-authenticator |
Y vamos respondiendo a las siguientes preguntas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Do you want authentication tokens to be time-based (y/n) y # Introducimos el código del QR que se genera Enter code from app (-1 to skip): 349712 Code confirmed Your emergency scratch codes are: 64670000 41990000 75420000 48000000 48730000 Do you want me to update your "/home/elblogdenegu/.google_authenticator" file? (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server. Do you want to do so? (y/n) n If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting? (y/n) n |
Reiniciar el servicio de SSH nuevamente:
1 |
sudo systemctl restart sshd.service |
Ahora cada vez que conectéis, os pedirá la contraseña y la verificación, que es el código que encontraréis al abrir Google Authenticator:
1 2 3 4 5 6 7 8 9 10 11 12 |
MacBook-Pro-de-Raul:~ negu$ ssh elblogdenegu@192.168.2.215 Password: Verification code: Linux debian11 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat Aug 21 11:40:29 2021 from 192.168.2.177 |
Configurar alertas Telegram en el login en SSH
Ahora tenemos un sistema seguro al que conectarnos, pero queremos adicionalmente, saber en qué momento se producen esos login, de forma que verifiquemos constantemente, que nuestro sistema operativo linux es seguro y no hemos dejado agujeros.
Para ello, como ya hemos comentado, usaremos Telegram. De forma que nos llegarán alertas al móvil, con los logins que se produzcan.
En otras entradas ya os he explicado como configurar Telegram para recibir alertas:
Tendremos que generar un nuevo BOT y guardar el TOKEN que se genera al final, para el script que vamos a utilizar. Iniciar el BOT generado y agregarlo como un usuario más a vuestro grupo donde vais a recibir las alertas. Seguir el proceso de la entrada anterior:
Ahora simplemente generamos un fichero en la ruta /etc/ssh de la siguiente forma:
1 |
elblogdenegu@debian11:~$ sudo vi /etc/ssh/login-ssh.sh |
Colocaremos el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/env bash # EL BLOG DE NEGU - SCRIPT LOGIN TELEGRAM # Contenido /etc/ssh/login-ssh.sh TELEGRAM_TOKEN="TOKEN-GENERADO-POR-BOT" CHAT_ID="ID-ASIGNADO" if [ ${PAM_TYPE} = "open_session" ]; then MESSAGE="$PAM_USER@$PAM_RHOST: Nuevo login via $PAM_SERVICE" curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" -d chat_id="$CHAT_ID" -d text="$MESSAGE" > /dev/null 2>&1 fi |
Le damos permisos de ejecución:
1 |
elblogdenegu@debian11:~$ sudo chmod +x /etc/ssh/login-ssh.sh |
Configuramos la siguiente variable:
1 |
elblogdenegu@debian11:~$ PAM_TYPE="open_session" /etc/ssh/login-ssh.sh |
Ahora modificaremos la configuración de PAM. PAM o módulos de autenticación conectables (Pluggable Authentication Modules) son la capa de gestión que se encuentran entre las aplicaciones de Linux y el sistema de autenticación nativo de Linux.
Hacemos una copia de seguridad:
1 |
elblogdenegu@debian11:~$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.old |
Y agregamos al final del fichero:
1 2 3 4 |
elblogdenegu@debian11:~$ sudo nano /etc/pam.d/sshd ----------- # Login Telegram Notificaciones session optional pam_exec.so /etc/ssh/login-ssh.sh |
Y comprobamos que funcionan las notificaciones y el doble factor de autenticación 2FA.
Simplemente, probarlo para verificar que todo funciona bien.
1 |
ssh elblogdenegu@192.168.2.215 |
Con esto, ya tenemos un sistema linux, un poco más seguro. Espero que os guste, compartir es gratis 🙂
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?