Autenticación con segundo factor de autenticación en SSH

Escrito por el .
gnu-linux seguridad software-libre
Enlace permanente Comentarios

El servicio SSH permite el acceso a equipos remotos a un usuario desde cualquier ubicación en la que se encuentre el usuario siempre que tenga conectividad desde el punto de acceso a internet y el equipo remoto. La autenticación se realiza mediante un usuario y contraseña o mediante clave privada y pública, adicionalmente SSH también se puede configurar para requerir un segundo factor de autenticación o 2FA que consituye una segunda clave.

GNU

Linux

Una forma de acceso a sistemas remotos para realizar tareas de administración es mediante SSH. La red permite acceder a sistemas remotos con SSH siempre que haya conectividad entre el la red del usuario y la red del servidor, con el auge de los servidores ofrecidos por los proveedores de hospedaje o los servicios de computación en la nube en la que lo servidores ya no son físicos sino lógicos SSH es la forma de acceder a los sistemas desde cualquier lugar.

SSH es un protocolo seguro y cifrado que utiliza como método de autenticación un usuario y contraseña o para mayor seguridad una clave SSH, también se puede configurar para añadir adicionalmente un segundo factor de autenticación o 2FA para mayor seguridad.

En el artículo específico comento como configurar SSH con autenticación mediante clave pública y privada, en otro artículo comento como tener acceso simple y seguro a sistemas remotos con Boundary.

Es recomendable usar segundo factor de autenticación en servicios como Google, Amazon y Paypal y otros relevantes que lo ofrezcan. También es recomendable utilizar un gestor de contraseñas como KeePassXC para guardar las contraseñas únicas y como aplicación para generar los tokens de 2FA.

Instalar el módulo SSH de Google 2FA

Usar 2FA con SSH requiere instalar un módulo de autenticación que valide el proceso de autenticación. El módulo permite usar los tokens de un solo uso en el proceso de autenticación adicionalmente a la contraseña o clave SSH.

En los sistemas basados en Debian como Ubuntu hay que instalar el siguiente paquete que añade un nuevo módulo de PAM para 2FA.

1
2
$ sudo apt install libpam-google-authenticator

apt-install-libpam-google-authenticator.sh

Posteriormente hay que configurar SSH para que haga uso del módulo PAM de Google Authenticator añadiendo la siguiente línea en el archivo /etc/pam.d/sshd.

1
2
$ sudo vim /etc/pam.d/sshd

sshd.sh
1
2
auth required pam_google_authenticator.so

sshd-1

También hay que modificar el archivo de configuración de SSH /etc/ssh/sshd_config.

1
2
$ sudo vim /etc/ssh/sshd_config

sshd_config.sh
1
2
UsePAM yes
ChallengeResponseAuthentication yes
sshd_config-1

Configurar el módulo SSH de Google 2FA

La autenticación con 2FA es una segunda contraseña o código a introducir al iniciar sesión en el sistema remoto. Para utilizar 2FA hay que configurar previamente una aplicación que proporcione los códigos temporales.

El siguiente comando ejecutado con el usuario permite generar un código QR y la información para generar los tokens o configurar una aplicación como KeePassXC para generarlos. El comando realiza varias preguntas a las que se puede contestar con los siguientes valores.

  • Make tokens “time-base”: yes
  • Update the .google_authenticator file: yes
  • Disallow multiple uses: yes
  • Increase the original generation time limit: no
  • Enable rate-limiting: yes
 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
33
34
35
36
37
38
39
40
41
pi@raspberrypi:~ $ google-authenticator

Do you want authentication tokens to be time-based (y/n) y
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/pi@raspberrypi%3Fsecret%3DZDLUAXH4UI3AJIX6EPHVQSVD5E%26issuer%3Draspberrypi
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
Your new secret key is: ZDLUAXH4UI3AJIX6EPHVQSVD5E
Your verification code is 998007
Your emergency scratch codes are:
  46891237
  64319086
  49832138
  91155656
  34340292

Do you want me to update your "/home/pi/.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) y
pi@raspberrypi:~ $ 
google-authenticator.sh

El resultado del comando es un código QR que se puede escanear con la aplicación de Google Authenticator para teléfono inteligente o con la clave secreta utilizar KeePassXC para generar los tokens.

Configuración de Google Authenticator Configuración OTP en KeePassXC Obtención de OTP en KeePassXC

Configuracón para Google Authenticator, KeePassXC y obtención OTP desde KeePassXC

Una vez modificada la configuración hay que reiniciar el servicio de SSH.

1
2
$ sudo systemctl restart sshd.service

sshd-restart.sh

Usar autenticación 2FA con claves SSH

Al utilizar la autenticación mediante claves públicas y privadas con la configuración por defecto es suficiente para otorgar acceso al sistema remoto, con lo que no se solicitará el segundo factor de autenticación.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[picodotdev@archlinux ~]$ ssh-copy-id -i "/home/picodotdev/pico.dev@gmail.com" pi@192.168.1.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/picodotdev/pico.dev@gmail.com.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
(pi@192.168.1.101) Password: 
(pi@192.168.1.101) Verification code: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'pi@192.168.1.101'"
and check to make sure that only the key(s) you wanted were added.

[picodotdev@archlinux ~]$ 
ssh-copy-id.sh

Para que se pida el segundo factor de autenticación aún utilizando la autenticación mediante clave pública y privada hay que modificar la configuración de SSH de nuevo con los siguientes cambios de adicionales.

La siguiente línea del archivo /etc/pam.d/sshd ha de estar comentada de esta forma y añadir al final de archivo los métodos de autenticación.

1
2
#@include common-auth

sshd-2

Nuevamente hay que modificar el archivo /etc/ssh/sshd_config y añadir esta línea al final.

1
2
AuthenticationMethods publickey,keyboard-interactive

sshd_config-2

Y después reiniciar el servicio de SSH.

1
2
$ sudo systemctl restart sshd.service

sshd-restart.sh

Probar la autenticación SSH

Una vez realizada la configuración es recomendable probar que la autenticación se realiza de forma correcta tanto con usuario y contraseña como en el caso de claves. Una vez proporcionado el usuario y la contraseña se solicita el token del segundo factor de autenticación que es generado por la aplicación Google Authenticator, KeePassXC u otra aplicación configurada para generarlos.

En este caso realizando la autenticación con usuario y contraseña se solicita el token 2FA.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[picodotdev@archlinux ~]$ ssh pi@192.168.1.101
(pi@192.168.1.101) Password: 
(pi@192.168.1.101) Verification code: 
Linux raspberrypi 5.10.17+ #1403 Mon Feb 22 11:26:13 GMT 2021 armv6l

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: Fri Mar 26 16:49:20 2021 from 192.168.1.4

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $ 
ssh-pi-password.sh

En este otro caso con clave privada y pública también se solicita el token 2FA.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[picodotdev@archlinux ~]$ ssh pi@192.168.1.101
(pi@192.168.1.101) Verification code: 
Linux raspberrypi 5.10.17+ #1403 Mon Feb 22 11:26:13 GMT 2021 armv6l

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: Fri Mar 26 16:47:26 2021 from 192.168.1.4

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $ 
ssh-pi-pubkey.sh


Comparte el artículo: