Indice
- 1. Introducción
- 2. Instalación
- 3. Creando y entendiendo el fichero .google-authenticator
- 4. Configuración de SSH y PAM
- 5. Configuración del GDM y otros DM
Introducción
Aclaración importante: ésto es algo más bien orientado a usarse para el inicio de sesión en SSH. Se aclara porque si no, no entenderéis las opciones de "no dejar que se inicie sesión más de 1 vez con el mismo token (oséa que sólo puedes iniciar sesión 1 vez cada 30 segundos)". También se puede usar en casa y se explicará, pero tened en cuenta que quizá os conviene una configuración distinta a la de los ejemplos.
En éste artículo veremos cómo instalar y configurar el módulo de PAM Google Authenticator (léase PAM en ) para usar contraseñas de un sólo uso, más conocidas cómo OTP (por sus siglas en inglés One Time Password). Google Authenticator se basa en los estandares de The Initiative for Open Authentication (OATH) (no guarda relación con OAuth).
¿Qué cuál es la ventaja de éste sistema de verificación en 2 pasos? No te envian un SMS al móvil, tu móvil te generará un código, independientemente de que tengas internet o no (es interesante éste sistema, ¿eh?).
¿Y cómo hace nuestro móvil para generar ése código sin internet? Usa una clave secreta (una cadena de 16 carácteres de longitud codificada en base32) y la fecha y hora actual.
Existen 2 algoritmos para OTP:
TOTP: Basado en el número de periodos de 30 segundos transcurridos desde Unix epoch.
HOTP: El contador que es incrementado con cada nuevo código.
Pseudo código para Time OTP
function GoogleAuthenticatorCode(string secret) key := base32decode(secret) message := current Unix time ÷ 30 hash := HMAC-SHA1(key, message) offset := last nibble of hash truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset Set the first bit of truncatedHash to zero //remove the most significant bit code := truncatedHash mod 1000000 pad code with 0 until length of code is 6 return code
Pseudo código para Event/Counter OTP
function GoogleAuthenticatorCode(string secret) key := base32decode(secret) message := counter encoded on 8 bytes hash := HMAC-SHA1(key, message) offset := last nibble of hash truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset Set the first bit of truncatedHash to zero //remove the most significant bit code := truncatedHash mod 1000000 pad code with 0 until length of code is 6 return code
Ahora que ya hemos visto qué es y cómo funciona pasemos a otra cosa.
Instalación
La instalación en muy sencilla, simplemente debemos instalar el paquete libpam-google-authenticator.
apt install libpam-google-authenticator
Creando y entendiendo el fichero .google-authenticator
Lo primero que debemos hacer es crear el fichero .google-authenticator en nuestro directorio personal, pero no hace falta crearlo a mano, para ello usamos el programa google-authenticator:
~ » google-authenticator Do you want authentication tokens to be time-based (y/n) y https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/ejemplo@leviathan%3Fsecret%3DUNT4SZUSRCIESAILKYOIC25ZG4%26issuer%3Dleviathan [Aquí saldrá un código QR] Your new secret key is: UNT4SZUSRCIESAILKYOIC25ZG4 Your verification code is 387164 Your emergency scratch codes are: 19852971 50307693 91932465 19456118 24853619 Do you want me to update your "/home/ejemplo/.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. 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 +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). 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) y
Veamos el contenido de .google.authenticator
~ » cat .google_authenticator UNT4SZUSRCIESAILKYOIC25ZG4 " RATE_LIMIT 3 30 " DISALLOW_REUSE " TOTP_AUTH 19852971 50307693 91932465 19456118 24853619
Empecemos explicando las preguntas que nos hace y la información que nos muestra.
Do you want authentication tokens to be time-based (y/n) y
Está preguntando si queremos usar tokens basados en tiempo, ésto es a elección de cada uno.
|0&cht=qr&chl=otpauth://totp/%3Fsecret%3DUNT4SZUSRCIESAILKYOIC25ZG4%26issuer%3Dleviathan
Simplemente es una URL hacia un código qr (el mismo que se nos muestra en la shell).
Your new secret key is: UNT4SZUSRCIESAILKYOIC25ZG4
Your verification code is 387164
Your emergency scratch codes are:
19852971
50307693
91932465
19456118
24853619
Ahí nos está indicando nuestra clave secreta (es importantísimo que permanecta secreta, ya que si dejamos que alguien la vea podría generar los codigos de verificación, igual que nosotros, y nuestro sistema OTP sería inútil :D ). A continuación nos indica el código de verificación actual, que va cambiando cada 30 segundos (si elegiste tokens basados en tiempo, si no, no lo sé xD) y el cuál ahora mismo no necesitamos (y dentro de 30 segundos lo necesitaremos menos, éste expirará y se generará otro). Y al final, nos indica en un perfecto inglés nuestros códigos de emergencia, los cuales se pueden usar sólo una vez cada uno, ésto es útil por si no tenemos a mano el movil/nuestro dispositivo generador de OTP.
Do you want me to update your "/home/ejemplo/.google_authenticator" file (y/n) y
Nos dice si le dejemos actualizar nuestro .google.authenticator, le diremos que sí.
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
Si contestamos que sí, cada token sólo se podrá usar 1 vez, por lo que sólo podremos iniciar sesión 1 vez cada 30 segundos, pero la ventaja está en que si alguien está mirando (o atacando mediante MITM) nuestro generador de OTP (e.j. móvil) y ve el código de verificación actual mientras iniciamos sesión, él no podrá iniciar sesión con ése código.
By default, tokens are good for 30 seconds. 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 +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). Do you want to do so? (y/n) n
Sirve para dejar un margen de tiempo para introducir el código, ésto es útil si la hora del PC y el móvil no está sincronizada, yo recomiendo elegir que no (es más seguro así) y en caso de experimentar problemas nos aseguramos de que tánto nuestro PC cómo móvil obtienen la hora mediante NTP y tienen la misma zona horaria (en Android se obtiene la hora por NTP si está marcada la opción de "obtener la hora mediante la red" o una opción similar).
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
Creo que ésta es mi opción favorita. Ésto limita los intentos de inicio de sesión a un máximo de 3 intentos en un periodo de 30 segundos.
~ » cat .google_authenticator
UNT4SZUSRCIESAILKYOIC25ZG4
" RATE_LIMIT 3 30
" DISALLOW_REUSE
" TOTP_AUTH
19852971
50307693
91932465
19456118
24853619
La primera línea es nuestra clave secreta, la segunda establete el límite de intentos, el primer número indica el número de intentos y el segundo el periodo, en éste caso si fallamos 3 veces en 30 segundos deberemos esperar al próximo código. La tercera línea deniega la reutilización de un mismo código, si queremos iniciar sesión verias veces por SSH, deberemos iniciar sesión y luego esperar al próximo código (recomiendo usar tux para tener varias terminales desde SSH sin tener que conectarse varias veces por SSH). La cuarta línea indica el algoritmo. Y el resto de lineas son codigos de emergencia, borralos si no los necesitas, si los necesitas (o podría darse el caso de que los necesites) apuntalos en un lugar seguro. Cada código de emergencia es 1 un sólo uso, tras usarlo se borrará del fichero.
Configuración de SSH y PAM
Buscamos la opción ChallengeResponseAuthentication en /etc/ssh/sshd_config, la descomentamos y la ponemos en yes, si no existe la escribimos.
Editamos /etc/pam.d/sshd, ésto depende mucho de cada uno, explico un poco:
@include common-auth éste línea ya estará, gestiona el inicio de sesión de la manera tradicional, introducimos la contraseña y la comprueba.
auth required pam_google_authenticator.so ésta línea la deberemos añadir dónde queramos para que nos pida el código, si introducimos ésta línea antes que la anterior nos pedirá primero el código y luego la contraseña, si la introducimos después de la línea anterior, primero nos pedira la contraseña. Considero más seguro que ésta línea vaya antes que la línea common-auth.
Si comentamos la línea de common-auth no nos pedirá la contraseña sólo el código de verificación. También podemos escribir varias veces la línea de google_authenticator para que nos pida varias veces el código. Ejemplo:
auth required pam_google_authenticator.so
@include common-auth
auth required pam_google_authenticator.so
De éste modo nos pedirá el código, la contraseña y ótra vez el código, ésto es útil sólo si se marcó la opción de que no se permita usar 2 veces el mismo código.
Configuración del GDM y otros DM
También se puede emplear éste módulo para los gestores de inicio de sesión, bueno, en realidad para cualquier servicio de autenticación de PAM.
En /etc/pam.d/ están los ficheros de configuración de los servicios de autenticación, podemos editar también por ejemplo el servicio de sudo.
Para LightDM se editaría el fichero /etc/pam.d/lightdm
Sólo hay que editar el fichero que queramos dependiendo del gestor de inicio de sesión que usemos.
Aquí dejo una lista con los servicios de PAM de mi PC, tu tendrás los mismo excepto el de lightdm si no lo usas, y sshd si tampoco lo usas, a demás podrías tener más servicios, así que revisa los tuyos y ¡A editar! ;)
~ # ls /etc/pam.d/ chfn common-account common-session lightdm login passwd runuser su chpasswd common-auth common-session-noninteractive lightdm-autologin newusers polkit-1 runuser-l sudo chsh common-password cron lightdm-greeter other ppp sshd systemd-user
Fuentes
(Espa%C3%B1ol)