Gestion des clés SSH

Fusion Directory permet de gérer simplement les clés publiques SSH pour chaque utilisateur. Vos différents serveurs UNIX peuvent ensuite être configuré pour récupérer de façon dynamique ces clés, au lieu de regarder dans le fichier ~/.ssh/authorized_keys.

L'avantage avec LDAP, c'est que le déploiement et la révocation sur un grand nombre de machine sont instantanés.

Plugins nécessaires

Il est nécessaire d'installer le plugin ssh:

yum install fusiondirectory-plugin-ssh

Configuration OpenLDAP

Le schéma openssh-lpk doit être chargé. Si vous utilisez le format slapd.conf:

[...] include /etc/openldap/schema/fusiondirectory/openssh-lpk.schema [...] # Access to SSH public keys access to attrs=sshPublicKey by dn=cn=ssh,ou=DSA,dc=firewall-services,dc=com peername.ip="127.0.0.1" read by dn=cn=ssh,ou=DSA,dc=firewall-services,dc=com peername.ip="[::1]" read by dn=cn=ssh,ou=DSA,dc=firewall-services,dc=com ssf=256 read by group.exact="cn=admins,ou=Groups,dc=firewall-services,dc=com" peername.ip="127.0.0.1" write by group.exact="cn=admins,ou=Groups,dc=firewall-services,dc=com" peername.ip="[::1]" write by group.exact="cn=admins,ou=Groups,dc=firewall-services,dc=com" ssf=256 write by self peername.ip="127.0.0.1" write by self peername.ip="[::1]" write by self ssf=256 write by * none [...]

Ajout d'une clé SSH

Depuis l'interface de gestion des utilisateurs dans Fusion Directory, un nouvel onglet est disponible, permettant d'importer vos clés publiques (en général, le fichier id_rsa.pub):

Gestion des clés SSH

Configuration des clients

Il ne reste plus qu'à configurer vos différentes machines pour venir chercher les clés SSH dans l'annuaire au lieu des fichier ~/.ssh/authorized_keys. Pour cela, il faut installer openssh-ldap

yum install openssh-ldap

Puis il faut configurer le module openssh-ldap en lui indiquant comment récupérer les clés dans l'annuaire. Cette configuration est dans /etc/ssh/ldap.conf

uri ldap://ldap.firewall-services.com binddn cn=ssh,ou=DSA,dc=firewall-services,dc=com bindpw dsa_p@ssw0rd base ou=People,dc=firewall-services.com,dc=com scope one ssl start_tls

On va également créer un compte local qui sera dédié à cette fonction:

useradd -M -r -s /bin/false ldapsshkey chown root:ldapsshkey /etc/ssh/ldap.conf chmod 640 /etc/ssh/ldap.conf

Il ne reste plus qu'à modifier la configuration principale du service sshd en ajoutant ces deux directives:

[...] AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper AuthorizedKeysCommandRunAs ldapsshkey [...]

Cache hors ligne

Récupérer les clés SSH depuis l'annuaire LDAP, c'est très pratique, sauf le jour ou le serveur LDAP n'est plus joignable. On peut bien sûr répliquer l'annuaire, mais on peut aussi utiliser un cache local des clés, bien plus simple à mettre en oeuvre.

mkdir /var/cache/ssh-ldap chow ldapsshkey:ldapsshkey /var/cachez/ssh-ldap chmod 700 /var/cache/ssh-ldap cat <<'_EOF' > /usr/local/bin/ssh-getkeys #!/bin/bash # Cache expirey CACHE=300 FILE=$(mktemp) # Check if cache is fresh if [ -s "/var/cache/ssh-ldap/$1" ]; then DIFF=$(($(date +%s)-$(date -r "/var/cache/ssh-ldap/$1" +%s))) if [ $DIFF -lt $CACHE ]; then cat "/var/cache/ssh-ldap/$1" exit 0 fi fi # Retrieve SSH Keys from LDAP and store them in a temp file /usr/libexec/openssh/ssh-ldap-helper -s "$1" > $FILE # Did the connection to LDAP succeed ? If no, and we have previous keys in the cache, use it if [ $? == 255 -a -s "/var/cache/ssh-ldap/$1" ]; then cat "/var/cache/ssh-ldap/$1" # If the connection succeed, print the key on stdout and update the cache else cat $FILE | tee "/var/cache/ssh-ldap/$1" # Just in case it was run as root chown ldapsshkey:ldapsshkey "/var/cache/ssh-ldap/$1" chmod 600 "/var/cache/ssh-ldap/$1" fi # Now, delete the temp file rm -f $FILE _EOF chmod +x /usr/local/bin/ssh-getkeys

Et voilà, on peut maintenant éditer /etc/ssh/sshd_config pour remplacer /usr/libexec/openssh/ssh-ldap-wrapper par /usr/local/bin/ssh-getkeys. Ce petit script tout simple permet de conserver en cache les dernières clés récupérées de l'annuaire LDAP (les clés sont stockées dans /var/cache/ssh-ldap/<login>). Pour limiter le nombres de requêtes sur l'annuaires, si les clés ont été lues depuis le cache il y a moins de 5 minutes, on récupère seulement le cache (durée ajustable en modifiant la valeur de la variable CACHE).

SSSD permet aussi de lire les clées SSH depuis l'annuaire LDAP, avec la commande sss_ssh_authorized_keys et il fournti nativement un cache local. Le problème avec SSSD, c'est que tous les utilisateurs peuvent requêter les clés publiques des autres utilisateurs. Si le contenu de la clé elle même ne pose pas vraiment de problème (après tout, il s'agit de clés publiques), les clés conteinnent également d'autres informations (d'éventuelles options au début, et un commentaire qui peut révéler le login local et le nom de la machine cliente à la fin) qui ne doivent pas forcément devenir publiques