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.


