web-dev-qa-db-fra.com

Authentification par clé SSH à l'aide de LDAP

En bref:

Voudrait un moyen de faire l'authentification par clé SSH via LDAP.

Problème:

Nous utilisons LDAP (slapd) pour les services d'annuaire et nous avons récemment décidé d'utiliser notre propre AMI pour créer des instances. La raison pour laquelle le bit AMI est important est que, idéalement, nous aimerions pouvoir nous connecter avec SSH via l'authentification par clé dès que l'instance est en cours d'exécution et ne pas avoir à attendre notre peu lent outil de gestion de configuration pour lancer un script afin d'ajouter les clés correctes à l'instance.

Le scénario idéal est que, lors de l'ajout d'un utilisateur à LDAP, nous ajoutons également sa clé et il pourra immédiatement se connecter.

L'authentification par clé est un must car la connexion par mot de passe est à la fois moins sécurisée et gênante.

J'ai lu cette question ce qui suggère qu'il y a un patch pour OpenSSH appelé OpenSSH-lpk pour ce faire mais ce n'est plus nécessaire avec le serveur OpenSSH> = 6.2

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

Comment puis-je configurer OpenSSH et LDAP pour implémenter cela?

64
c4urself

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

Nous devons d'abord mettre à jour LDAP avec un schéma pour ajouter l'attribut sshPublicKey aux 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 doit générer les clés publiques pour cet utilisateur, par exemple:

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

Mettez à jour sshd_config Pour pointer vers le script de l'étape précédente

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bonus : Mettez à jour sshd_config Pour permettre l'authentification par mot de passe à partir des réseaux RFC1918 internes comme indiqué dans cette question:

Autoriser uniquement l'authentification par mot de passe sur le serveur SSH à partir du réseau interne

Liens utiles:

EDIT: Ajout de l'utilisateur nobody comme suggéré TRS-80

70
c4urself

Ce n'est pas une réponse complète, juste un ajout à réponse de c4urself . J'aurais ajouté ceci en tant que commentaire, mais je n'ai pas une réputation suffisante pour commenter, alors s'il vous plaît, ne votez pas!

C'est le script que j'utilise pour le AuthorizedKeysCommand (basé sur la version de c4urself). Cela fonctionne indépendamment du fait que la valeur soit retournée dans le codage base64 ou non. Cela peut être particulièrement utile si vous souhaitez stocker plusieurs clés autorisées dans LDAP - séparez simplement les clés avec des caractères de nouvelle ligne, similaires au 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
5
mbrgm

Pour toute personne obtenant l'erreur lors de l'exécution de ldapsearch:

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

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

/^ /{H;d;};

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

5
Scott

Je voulais juste partager ma "méthode", mon côté client est spécifique à Debian/Ubuntu, mais mon côté serveur est essentiellement 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 la clé publique SSH dans phpLDAPadmin

Créez d'abord un utilisateur avec le modèle "Generic: User Account". Ensuite, accédez à la section d'attribut "objectClass", cliquez sur "ajouter une valeur" et choisissez l'attribut "ldapPublicKey". Après avoir soumis, revenez à la page de modification de l'utilisateur, cliquez sur "Ajouter un nouvel attribut" dans la partie supérieure et choisissez "sshPublicKey", collez la clé publique dans la zone de texte et enfin cliquez sur "Mettre à jour l'objet". "

Attribut sshPublicKey non affiché - Authentification de clé SSH OpenLDAP PHPLDAP

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
4
FreeSoftwareServers