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.
Il est nécessaire d'installer le plugin ssh:
yum install fusiondirectory-plugin-ssh
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 [...]
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):
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 [...]
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).