Dans ce billet, je vais montrer comment activer une méthode d’authentification à deux facteurs pour les accès SSH qui arrivent de réseaux inconnus. L’objectif final est de fournir un niveau de sécurité renforcé pour un sous-ensemble de connexions entrantes, sans compliquer l’exploitation quotidienne depuis l’intérieur de votre réseau. La solution mise en place s’appuie sur l’infrastructure PAM.

Prérequis

L’utilisation de codes basés sur le temps demande une synchronisation des horloges, il est donc vivement conseillé de déléguer cette tâche à ntpd, si ce n’est pas déjà en place.

Le paquet qui contient le module PAM pour google authenticator est libpam-google-authenticator pour la famille des distributions debian (dispo depuis debian jessie), et google-authenticator sur CentOS 7. Si vous ne disposez pas de paquet pour votre distribution, vous pouvez télécharger les sources et les compiler.

Préparation des comptes utilisateur

Pour que l’authentification puisse fonctionner, il faut impérativement définir un jeton en lançant la commande google-authenticator sur chaque compte qui aura besoin de se connecter via SSH. L’authentification échouera systématiquement si ce n’est pas fait.

Un assistant va apparaître pour vous aider à configurer le jeton personnel. Certaines versions (comme dans le cas présent) vous afficheront un code barre QR scannable par l’application de Google.

Définir la liste de contrôle d’accès

Nous allons configurer une liste d’accès pour définir les réseaux qui seront exemptés d’une vérification à deux facteurs. La syntaxe de l’entrée dans le fichier PAM sera abordée dans la partie suivante. La logique de l’ACL est la suivante: un utilisateur « accepté » est exempté d’une procédure de double vérification.

Créer le fichier /etc/security/access-gauth.conf (si vous utilisez l’acl pour un autre module, changez gauth par le nom du module concerné).

La structure d’une entrée dans le fichier est composé de la manière suivante: <permission> : <utilisateur> : <origine>

La permission a deux valeurs possibles: « + » (autoriser) et « – » (rejeter).

Le champ utilisateur peut être composé de un ou plusieurs utilisateur(s) et/ou groupe(s) séparé(s) par des espaces. Les noms de groupes sont préfixés par un « @ ». Des exceptions peuvent être mises en place grâce au mot clé EXCEPT. La différence majeure pour la liste d’exception concerne les groupes, qui ne sont plus désigné par le « @ », mais par une paire de parenthèses.

Le champ origine peut contenir le nom du terminal d’origine de l’utilisateur, le mot-clé LOCAL qui désigne toute console présente physiquement sur la machine, une adresse IPv6/v4, un subnet IPv6/v4, un subnet réseau IPv4 avec le masque en notation décimale pointée. Encore une fois, le mot-clé EXCEPT vous permet de faire des exclusions de sous-ensembles.

Un exemple complexe de ligne est donné ci-dessous:

+ : emustermann @staff EXCEPT jdoe (rookies) : 3fff:15d4:dead:beef::/64 192.168.15.0/24 EXCEPT 192.168.15.254 3fff:15d4:dead:beef::1337

Votre fichier d’ACL devrait ressembler au minimum à ceci:

# Indiquez ici les réseaux de confiance
+ : ALL : 192.168.0.0/24
+ : ALL : 2001:xxxx:xxxx:xxxx::/64
+ : ALL : fe80::/64

# Toujours bypasser pour l'authentification locale
+ : ALL : 127.0.0.0/8
+ : ALL : ::1
+ : ALL : LOCAL

# Rejeter tous les autres
- : ALL : ALL

Configuration de PAM

Il faut maintenant éditer le fichier /etc/pam.d/sshd pour insérer les lignes données ci-dessous. Vous devrez coller ces lignes à la suite de l’inclusion du mécanisme commun d’authentification (« @include common-auth » sur debian), ou à la suite de la dernière ligne dont le premier verbe est « auth ».

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

La première ligne sert à arrêter le processus d’authentification avant l’exécution du module google authenticator si l’utilisateur est accepté par l’ACL (success=1), mais à ne pas le rejeter s’il est rejeté par la liste (default=ignore).

Le module google authenticator est défini en « required » car un échec à ce test doit entraîner un refus de connexion, mais la réussite du test n’est pas suffisante en soi pour accepter la connexion d’office (ce que permettrait un mot-clé « sufficient »).

Configuration d’OpenSSH

Par défaut, OpenSSH est configuré pour utiliser la méthode embarquée du protocole pour authentifier l’utilisateur par mot de passe. Pour changer ce comportement, il faut définir les deux lignes suivantes dans votre fichier sshd_config:

PasswordAuthentication no
ChallengeResponseAuthentication yes
UsePAM yes

Pour éviter de se couper la main, il est vivement recommandé de disposer d’une clé privée valide pour remonter sur la machine en cas de pépins, ou d’avoir mis l’IP de votre machine en liste blanche ;).

Une fois que vous êtes prêt, relancez le serveur ssh sur la machine distante.