Añadiendo autenticación de dos pasos a mi servidor SSH.

Cansado de estar preocupado de cambiar las contraseña regularmente, de comprobar que no existen keyloggers en los ordenadores que uso para conectarme, he decido añadir un poco más de seguridad a mi servidor. Para ello vamos a emplear la autenticación en dos pasos o two-factor, que nos proveen  las herramientas que Google ha puesto a nuestro alcance (Google Authenticator). La aplicación del móvil nos servirá un número que cambia aleatoriamente, conocido como token. Esta clave concuerda con otra que coincide con otra creada mi servidor gracias a la libreria libpam-google-authenticator. Así pues para darme acceso tendré que facilitar 2 claves: mi clave personal, y la clave que provee la aplicación del móvil.

Debian no ha añadido a sus repositorios estables (Wheezy) el paquete que contiene lo necesario para poner en marcha esto, pero si que esta en sus repositorios de su version en desarrollo (Jessie).

$ wget http://ftp.de.debian.org/debian/pool/main/g/google-authenticator/libpam-google-authenticator_20130529-2_amd64.deb

La aplicación nos dará un QR para que podamos fácilmente añadir el token a nuestro móvil, pero para esto necesitamos que Debian tenga la biblioteca adecuada:

$ sudo apt-get install libqrencode3

Después instalamos el paquete que bajamos antes con wget:

$ sudo dpkg -i libpam-google-authenticator_20130529-1_amd64.deb

Tras esto el programa quedará instalado. Continuamos creando nuestra llave. ¡¡CUIDADO!! hacedlo desde vuestro usuario:

$ google-authenticator

Nos hará una pregunta:

Do you want authentication tokens to be time-based (y/n) y << Contestando "yes"

Ahora nos aparecerá un QR, y los datos para configurar la aplicación:

Your new secret key is: XXXXXXXXXXXXXXXXX
Your verification code is xxxxxxxxxx
Your emergency scratch codes are:
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx

Posteriormente nos preguntará unas opciones:

Do you want me to update your "/home/dha/.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, tokens are good for 30 seconds and 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. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n)
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

Tras estos pasos, procedemos a cambiar al configuración de PAM, añadiendo al final de /etc/pam.d/sshd esto:

> auth required pam_google_authenticator.so

Y ahora modificaremos la configuración de SSH, cambiando de no a yes un valor en el archivo /etc/ssh/sshd_config

> ChallengeResponseAuthentication yes

Tras esto reiniciamos nuestro servidor ssh.

$ sudo service ssh restart

Seguidos estos pasos, la próxima vez que nos logeemos en nuestro SSH nos pedirá nuestra contraseña, y ademas un código de verificación que podemos obtener de nuestra aplicación google-authenticatos (Android e iOS)

Podéis encontrar más información en este link y en este otro.

Actualización (10 de febrero 2014): después de un tiempo usándolo,  llega a ser un poco pesado estar buscando el código de acceso, sobre todo cuando estas en local y no hace falta tanta rigurisidad en la seguridad. Indagando he encontrado la manera de deje de pedir la verificación cuando se esta dentro de un rango de IPs confiables.

Para ello, en el mismo archivo que antes hemos editado (/ect/pam.d/sshd) vamos a añadir la siguiente linea:

auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf

de tal manera que nos quedará asi:

auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf
auth required pam_google_authenticator.so

Lo que hace es dar como bueno solamente con la contraseña de usuario, a aquellos que cumplan la condicion de el archivo /etc/security/access-local.conf. Vamos a crear este archivo con el siguiente contenido:

# only allow from local IP range
+ : ALL : 192.168.1.0/24
+ : ALL : LOCAL
- : ALL : ALL

Con esto nos aseguramos que las ips dentro del rango 192.168.1.0 a 192.168.1.255 puedan entrar sin el token.

Actualización (10 de febrero 2014): Por lo que he visto, esto mismo se puede extender a otros servicios, como puede ser al inicio de la sesion en local, modificando el archivo /etc/pam.d/lightdm de igual manera a la descrita. Incluso también lo podemos usar para la autenticación tras el salto del salvapantallas, modificando /etc/pam.d/mate-screensaver.

Deja un comentario