Table des matières

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