Votre société de services en logiciels libres

Pour que SSHD aille chercher les clés publiques dans un annuaire LDAP…

15 janvier 2016   
Pour que SSHD aille chercher les clés publiques dans un annuaire LDAP…

L’authentification par clé publique est un « must » de sshd par rapport à l’utilisation des mots de passe. Or, bien souvent, les utilisateurs sont définis dans un annuaire LDAP. Le problème devient alors : où stocker les clés publiques des utilisateurs ?

Si la réponse est : dans chaque répertoire de tous les utilisateurs, sur toutes les machines auxquelles ils ont accès, je gage que vous devrez utiliser des outils de déploiement pour éviter cette tâche fastidieuse…

Mais puisque vous avez un annuaire : pourquoi ne pas stocker les clés dans l’annuaire ?

Cette opération est réalisée en 3 étapes :

Enrichir le schéma de l’annuaire

avec OpenLDAP, il fut ajouter la configuration :

dn: cn=openssh-lpk,cn=schema,cn=config
 objectClass: olcSchemaConfig
 cn: openssh-lpk
 olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
 DESC 'MANDATORY: OpenSSH Public key'
 EQUALITY octetStringMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
 olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
 DESC 'MANDATORY: OpenSSH LPK objectclass'
 MAY ( sshPublicKey $ uid )
 )

Configurer le démon sshd pour qu’il récupère indirectement les clés publiques
Pour cela, ajoutez les deux lignes suivantes dans /etc/ssh/sshd_config :

AuthorizedKeysCommand /etc/ssh/ldap-auth-keys.sh
AuthorizedKeysCommandUser nobody

Vérifiez que l’utilisateur « nobody » existe.

Lors d’une authentification par clé publique, sshd va lancer la commande /etc/ssh/ldap-auth-keys.sh en lui passant le nom de l’utilisateur en paramètre. Cette commande doit retourner la ou les clés publiques associées à l’utilisateur dans l’annuaire, s’il y en a.

Ecrire la commande /etc/ssh/ldap-auth-keys.sh

Le script adéquat peut contenir la commande suivante :

ldapsearch -x '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' |
sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

Maintenant les tests !

Conservez une connexion ssh active sur le serveur et faite un « reload » : si le démon ne redémarre pas, faites un « start » pour avoir l’erreur sur l’écran…