77 votes

Authentification des clés SSH à l'aide de LDAP

En bref :

Je voudrais un moyen d'authentifier les clés SSH via LDAP.

Problème :

Nous utilisons LDAP (slapd) pour les services d'annuaire et nous sommes récemment passés à l'utilisation de notre propre AMI pour construire des instances. La raison pour laquelle l'AMI est importante est la suivante , idéalement Nous aimerions pouvoir nous connecter avec SSH via une authentification par clé dès que l'instance est en cours d'exécution et ne pas avoir à attendre que notre outil de gestion de la configuration, quelque peu lent, lance un script pour ajouter les bonnes clés à l'instance.

Le scénario idéal serait que, lorsqu'on ajoute un utilisateur à LDAP, on ajoute également sa clé et qu'il puisse immédiatement se connecter.

L'authentification des clés est une muss car la connexion par mot de passe est à la fois moins sûre et gênante.

J'ai lu cette question ce qui suggère qu'il existe un correctif pour OpenSSH appelé OpenSSH-lpk pour faire cela mais il n'est plus nécessaire avec OpenSSH server >= 6.2

Ajout d'une option sshd_config(5) AuthorizedKeysCommand pour permettre pour supporter la récupération des authorized_keys à partir d'une commande en plus (ou (ou à la place) du système de fichiers. La commande est exécutée sous un compte spécifié par une option sshd_config(5) AuthorizedKeysCommandUser.

Comment puis-je configurer OpenSSH et LDAP pour mettre en œuvre cette solution ?

96voto

MobX Points 913

Mise à jour de LDAP pour inclure le schéma OpenSSH-LPK

Nous devons d'abord mettre à jour LDAP avec un schéma pour ajouter l'élément sshPublicKey pour les utilisateurs :

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 )
    )

Créez un script qui interroge LDAP pour la clé publique d'un utilisateur :

Le script devrait sortir les clés publiques pour cet utilisateur, exemple :

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

Mise à jour sshd_config pour pointer vers le script de l'étape précédente

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bonus : Mise à jour sshd_config pour permettre l'authentification par mot de passe à partir de réseaux internes RFC1918 comme vu dans cette question :

Autorisez uniquement l'authentification par mot de passe au serveur SSH depuis le réseau interne.

Liens utiles :

EDIT : Ajout d'un utilisateur nobody comme le suggère le TRS-80

9voto

mbrgm Points 81

Il ne s'agit pas d'une réponse complète, mais d'un complément à la réponse de la Commission européenne. La réponse de c4urself . Je l'aurais bien ajouté en commentaire, mais je n'ai pas la réputation suffisante pour commenter, alors s'il vous plaît, ne me décotez pas !

C'est le script que j'utilise pour la AuthorizedKeysCommand (basé sur la version de c4urself). Cela fonctionne indépendamment du fait que la valeur soit retournée en encodage base64 ou non. Cela peut être particulièrement utile si vous voulez stocker plusieurs clés autorisées dans LDAP -- il suffit de séparer les clés avec des caractères de nouvelle ligne, comme dans le fichier authorized_keys.

#!/bin/bash
set -eou pipefail
IFS=$'\n\t'

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

if [[ "$attrLine" == sshPublicKey::* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
elif [[ "$attrLine" == sshPublicKey:* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey: //'
else
  exit 1
fi

5voto

Rajind Ruparathna Points 151

Pour tous ceux qui obtiennent l'erreur lors de l'exécution de la recherche ldap :

sed: 1: "/^ /{H;d};": extra characters at the end of d command

comme je l'étais (sur FreeBSD), la solution est de changer la première commande sed en :

/^ /{H;d;};

(en ajoutant un point-virgule après le "d").

4voto

Je voulais juste partager ma "méthode", mon côté client est spécifique à Debian/Ubuntu, mais mon côté serveur est fondamentalement le même que ci-dessus, mais avec un peu plus de "HowTo :".

Serveur :

Activer l'attribut de clé publique :

Crédit :

https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

cat << EOL >~/openssh-lpk.ldif
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 )
  )
EOL

Maintenant, utilisez ceci pour ajouter ldif :

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif

Ajout d'un utilisateur avec une clé publique SSH dans phpLDAPadmin

Tout d'abord, créez un utilisateur avec le nom "Generic : Compte d'utilisateur". Ensuite, allez dans la section de l'attribut "objectClass", cliquez sur "add value", et choisissez l'attribut "ldapPublicKey". Après avoir validé, retournez à la page d'édition de l'utilisateur, cliquez sur "Add new attribute" dans la partie supérieure, et choisissez "sshPublicKey", collez la clé publique dans la zone de texte, et enfin cliquez sur "Update Object"."

L'attribut sshPublicKey n'apparaît pas - OpenLDAP PHPLDAP SSH Key Auth

Client Ubuntu :

apt-get -y install python-pip python-ldap
pip install ssh-ldap-pubkey
sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart

Créer des clés de test :

ssh-keygen -t rsa

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X