Apprends à sécuriser un serveur openssh en ajoutant le MFA Cisco DUO.

Exposer un serveur openssh directement sur internet reste un problème, plein de robots vont commencer à te scanner et essayer de se connecter, c’est toujours flippant de le laisser ouvert. On va ici implémenter Cisco DUO en utilisant un module pam afin d’imposer l’usage d’un second facteur.

Avant tout, tu as besoin d’un compte Cisco correctement configuré.

Créer l’application SSH

Sur le panneau d’administration Cisco Duo, clique sur Protect an Application.

Et cherche UNIX Application, clique sur Protect

Tu arriveras sur la page suivante qui décrit les politiques d’application que tu peux appliquer et les paramètres de la politique globale.

Astuce

Le champ Name sera utilisé dans Duo Mobile quand tu reçois un popup pour valider le second facteur.

Une fois les réglages terminés, copie les identifiants (en haut de la page)

Configure ton serveur : pam_duo

Astuce

Documentation de référence : https://duo.com/docs/duounix

On teste sur une Rocky Linux 9 mais la configuration est globalement la même sur les autres distros.

Crée /etc/yum.repos.d/duosecurity.repo

1[duosecurity]
2name=Duo Security Repository
3baseurl=https://pkg.duosecurity.com/RedHat/$releasever/$basearch
4enabled=1
5gpgcheck=1

Importe la clé gpg :

1# rpm --import https://duo.com/DUO-GPG-PUBLIC-KEY.asc
2# dnf install -y duo_unix

Le package duo_unix embarque 2 outils, login_duo et le module pam pam_duo.

On va implémenter le module pam car login_duo est pour moi moins sécurisé (configuré dans sshd et semble être moins sûr).

Édite /etc/duo/pam_duo.conf et ajoute les identifiants que tu as copiés plus tôt sur le panneau d’administration Duo.

 1[duo]
 2; Duo integration key
 3ikey = 
 4; Duo secret key
 5skey = 
 6; Duo API host
 7host = 
 8; `failmode = safe` In the event of errors with this configuration file or connection to the Duo service
 9; this mode will allow login without 2FA.
10; `failmode = secure` This mode will deny access in the above cases. Misconfigurations with this setting
11; enabled may result in you being locked out of your system.
12failmode = safe
13; Send command for Duo Push authentication
14;pushinfo = yes

Astuce

Tu peux étendre le fichier de configuration en ajoutant des paramètres de groupe qui te permettent de filtrer quel groupe recevra le Duo Prompt

Maintenant tu vas devoir reconfigurer ton serveur openssh

Attention

Mai 2023 : à l’heure actuelle pam_duo ne supporte qu’une seule méthode d’authentification à la fois. Tu dois choisir quelle méthode d’authentification tu veux utiliser : publickey ou password.

Pour cette documentation je vais utiliser l’authentification par mot de passe car pour moi publickey et un token Fido2 ou Duo Push sont des choses que tu possèdes… donc ce n’est pas suffisant pour moi.

Important

Authentification utilisant deux facteurs ou plus pour parvenir à l’authentification. Les facteurs incluent : (i) quelque chose que tu connais (par exemple un mot de passe/code PIN) ; (ii) quelque chose que tu possèdes (par exemple un dispositif d’identification cryptographique, un token) ; ou (iii) quelque chose que tu es (par exemple une donnée biométrique).

Configure ton serveur : sshd

Pour résumer les changements que tu dois faire, voici un extrait de ce qui se trouve dans la documentation officielle

1UsePAM yes
2ChallengeResponseAuthentication yes
3UseDNS no

Et pour certains systèmes plus récents

1UsePAM yes
2KbdInteractiveAuthentication yes
3UseDNS no

Attention

Sur les OS basés sur RHEL 9, il y a un fichier d’inclusion dans /etc/ssh/sshd_config.d que tu utiliseras pour mettre ces modifications

 1# This system is following system-wide crypto policy. The changes to
 2# crypto properties (Ciphers, MACs, ...) will not have any effect in
 3# this or following included files. To override some configuration option,
 4# write it before this block or include it before this file.
 5# Please, see manual pages for update-crypto-policies(8) and sshd_config(5).
 6Include /etc/crypto-policies/back-ends/opensshserver.config
 7
 8SyslogFacility AUTHPRIV
 9
10ChallengeResponseAuthentication yes
11
12GSSAPIAuthentication yes
13GSSAPICleanupCredentials no
14
15UsePAM yes
16UseDNS no
17
18X11Forwarding yes
19
20# It is recommended to use pam_motd in /etc/pam.d/sshd instead of PrintMotd,
21# as it is more configurable and versatile than the built-in version.
22PrintMotd no

Si tu veux aller un cran plus loin, tu devrais bloquer la connexion root (si besoin tu peux te connecter en root via la console…

Dans mon cas je modifie le sshd_config avec les paramètres suivants

1PermitRootLogin no
2StrictModes yes
3PubkeyAuthentication no

Et enfin redémarre le serveur ssh

1# systemctl restart sshd

Configure ton serveur : pam ssh

Maintenant il faut définir la configuration pam pour les connexions ssh

Édite /etc/pam.d/sshd (on se concentre uniquement sur la section auth, ne copie-colle pas en remplaçant tout le fichier)

1#%PAM-1.0
2
3auth       required       pam_sepermit.so
4auth       required       pam_env.so
5auth      substack       password-auth
6auth       sufficient     pam_duo.so
7auth       required       pam_deny.so
8auth       include      postlogin

Maintenant tu peux essayer de démarrer une nouvelle session ssh, tu devrais recevoir une invite pour l’authentification Duo après avoir tapé ton mot de passe

 1 $ ssh [email protected]
 2([email protected]) Password: 
 3([email protected]) Duo two-factor login for tmenard
 4
 5Enter a passcode or select one of the following options:
 6
 7 1. Duo Push to iOS
 8
 9Passcode or option (1-1): 1
10Success. Logging you in...
11Success. Logging you in...
12
13Last login: Tue May 30 00:09:40 2023 from 192.168.1.134
14[tmenard@serveur ~]$ 

Si tu as enrôlé une clé FIDO2, tu peux directement appuyer sur le bouton de ta clé pour générer la passphrase.

Configure ton serveur : pam sudo

Si tu veux aller encore plus loin et sécuriser aussi la commande sudo, tu peux modifier ta configuration pam dans /etc/pam.d/system-auth.

1#auth        sufficient                                   pam_unix.so nullok
2auth        requisite                                    pam_unix.so try_first_pass nullok
3auth        sufficient                                   pam_duo.so
4auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
5auth        sufficient                                   pam_sss.so forward_pass
6auth        required                                     pam_deny.so

Astuce

duo_unix n’utilise malheureusement pas la dernière amélioration des distros Redhat récentes, à savoir authselect. Que tu aimes ça ou pas, le fait est que la configuration pam system-auth est un lien vers un profil authselect. La modifier comme ça n’est pas grave… c’est juste sale. Peut-être que ce sera implémenté un jour.

comments powered by Disqus