2FA en SSH

Soy muy fan del 2FA (la segunda verificación de acceso), y siempre me he preguntado si había alguna forma de conseguirlo con los servidores Linux que muchas veces me toca gestionar. Ya sé que existen sistemas de cifrado y de certificados y cosas así, pero al final, eso en muchos casos depende de una máquina… pero ¿qué pasa si en un ataque de fuerza bruta alguien consigue entrar?

Según explican en SSH Two Factor Authentication este sistema se puede conseguir, pero hay que tener en cuenta que al ser basado en tiempo hemos de aplicar ciertas técnicas (y recuerda que si cambias de huso horario, debes acordarte de revisar la hora del dispositivo, que sino no va).

Voy a explicar esto con Ubuntu 18, pero debería funcionar en cualquier otro. Para comenzar, pondremos en hora el servidor, intentando que tenga la misma hora que nuestro dispositivo…

timedatectl set-timezone UTC
timedatectl set-timezone Europe/Madrid
timedatectl set-ntp on
date

Una vez en hora, actualizaremos todo el Ubuntu (que no está de más)

lsb_release -a
apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove

Y aprovecharemos en instalar el software base y la librería para generar los códigos QR y el 2FA:

apt -y install software-properties-common vim libpam-google-authenticator

Ahora que ya tenemos instalado el software, configuraremos el sistema para que el SSH tenga acceso al 2FA:

echo "auth required pam_google_authenticator.so" | cat - /etc/pam.d/sshd > /tmp/out
cat /tmp/out | tee /etc/pam.d/sshd
SEARCH="ChallengeResponseAuthentication no"
REPLACE="ChallengeResponseAuthentication yes"
FILEPATH="/etc/ssh/sshd_config"
sed -i "s;$SEARCH;$REPLACE;" $FILEPATH

Ahora que ya está configurado, ejecutamos el software para añadir el código por primera vez.

google-authenticator

Contestaremos a la pregunta con y:

Do you want authentication tokens to be time-based (y/n) [y]

Esto nos genera el código, con la URL para ejecutarlo en el navegador si no se ve bien por terminal.

Warning: pasting the following URL into your browser exposes the OTP secret to Google:
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/root@ssh2fa%3Fsecret%3DVLIVBQTSZUE5J46BLLHOHUWRWY%26issuer%3Dssh2fa

Esto generaría, además, una serie de códigos que hay que guardarse, por si acaso pasa algo…

Your new secret key is: VLIVBQTSZUE5J46BLLHOHUWRWY
Your verification code is 151205
Your emergency scratch codes are:
  21021172
  43334421
  62625012
  40241026
  13497324

Y siguen las preguntas… a la de guardar la información, contestaremos que sí con y:

Do you want me to update your "/root/.google_authenticator" file? (y/n) [y]

Aumentaremos la seguridad limitando los códigos para que no se repitan también con un sí 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]

Los códigos se generan cada 30 segundos, dejando un pequeño margen de tiempo entre uno y otro para que no tengas que ir extremadamente rápido… pero se puede dar aún más margen, algo que en principio no queremos, por lo que contestaremos que no con n:

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]

Y para acabar, haremos un poco de limitación de fuerza bruta… a lo que contestaremos que sí con y:

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) [y]

Ahora que el sistema ya está acabado de configurar, pasaremos a reiniciar el servicio SSH:

service ssh restart

Y ya está. La próxima vez que reinicies te preguntarán algunas cosas extra:

login as: ******
Using keyboard-interactive authentication.
Verification code: ******
Using keyboard-interactive authentication.
Password: ******

Y con esto tendrás 2FA en tu acceso por consola a los servidores.

Categorías Internet

Deja un comentario