Voudrait un moyen de faire l'authentification par clé SSH via LDAP.
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?
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 )
)
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'
sshd_config
Pour pointer vers le script de l'étape précédenteAuthorizedKeysCommand /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:
EDIT: Ajout de l'utilisateur nobody
comme suggéré TRS-80
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
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").
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