Frage SSH-Schlüssel-Authentifizierung mit LDAP


Zusamenfassend:

Wäre eine Möglichkeit, SSH-Schlüssel Authentifizierung über LDAP zu tun.

Problem:

Wir verwenden LDAP (slapd) für Verzeichnisdienste und wir sind kürzlich dazu übergegangen, unser eigenes AMI zum Erstellen von Instanzen zu verwenden. Der Grund, warum das AMI-Bit wichtig ist, ist, im Idealfallmöchten wir uns mit SSH über die Schlüsselauthentifizierung anmelden können, sobald die Instanz ausgeführt wird, und müssen nicht darauf warten, dass unser etwas langsames Konfigurationsverwaltungstool ein Skript startet, um der Instanz die richtigen Schlüssel hinzuzufügen.

Das ideale Szenario ist, dass wir beim Hinzufügen eines Benutzers zu LDAP auch ihren Schlüssel hinzufügen und sich sofort anmelden können.

Schlüsselauthentifizierung ist a Muss weil die passwortbasierte Anmeldung sowohl weniger sicher als auch lästig ist.

Ich habe gelesen diese Frage was darauf hindeutet, dass es einen Patch für OpenSSH namens OpenSSH-lpk gibt, aber dies wird nicht mehr benötigt mit OpenSSH Server> = 6.2

Hinzugefügt eine sshd_config (5) -Option AuthorizedKeysCommand to      unterstützt das Abrufen von authorized_keys von einem Befehl zusätzlich zu (oder      anstelle von) aus dem Dateisystem. Der Befehl wird unter einem Konto ausgeführt      spezifiziert durch eine AuthorizedKeysCommandUser sshd_config (5) Option

Wie kann ich OpenSSH und LDAP konfigurieren, um dies zu implementieren?


50
2017-12-19 20:13


Ursprung




Antworten:


Aktualisieren Sie LDAP, um das OpenSSH-LPK-Schema einzuschließen

Wir müssen zuerst LDAP mit einem Schema aktualisieren, um das hinzuzufügen sshPublicKey Attribut für Benutzer:

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

Erstellen Sie ein Skript, das LDAP nach dem öffentlichen Schlüssel eines Benutzers abfragt:

Das Skript sollte die öffentlichen Schlüssel für diesen Benutzer ausgeben, zum Beispiel:

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

Aktualisieren sshd_config um auf das Skript aus dem vorherigen Schritt zu zeigen

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bonus: Aktualisieren sshd_config Passwörter Authentifizierung von internen RFC1918 Netzwerken wie in dieser Frage gesehen:

Erlauben Sie nur die Passwort-Authentifizierung für den SSH-Server vom internen Netzwerk

Nützliche Links:

EDIT: Benutzer hinzugefügt nobody wie vorgeschlagen TRS-80


57
2017-12-19 20:13



Das ist fantastisch, obwohl ich es vorschlagen würde AuthorizedKeysCommandUser nobody anstelle von root. - TRS-80
Es muss etwas anderes entweder an meinem ldapsearch oder an sed sein, weil die Ausgabe an den sed black magic Befehl, den du dort hast, keine Ausgabe liefert, obwohl mein einfacher ldapsearch Befehl Daten zurückgibt. Ich werde ein Skript schreiben müssen, um die Ausgabe zu säubern, anstatt sed zu verwenden. - Chris L
Ignoriere meinen vorherigen Kommentar. Mein Problem wurde verursacht, indem ich eine schleppende Newline in der Eigenschaft sshPublicKey habe, was wiederum bewirkt, dass ldapsearch die gesamte Sache mit Base64 codiert. Ich vereinfachte den sed-Befehl tho: ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p' - Chris L
@Chris zwar weniger schwarze Magie, aber sed ist immer noch eine einmal schreibende, 1-fach Hashfunktion;) - Froyke
Auf meiner Version von OpenSSH (5.3p1-122.el6) gibt es AuthorizedKeysCommandRunAs und nicht AuthorizedKeysCommandUser - mveroone


Für jeden, der den Fehler erhält, wenn er die ldapsearch ausführt:

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

Wie ich (unter FreeBSD) war, besteht die Lösung darin, den ersten sed-Befehl zu ändern:

/^ /{H;d;};

(Hinzufügen eines Semikolons nach dem 'd').


5
2018-03-08 13:18





Ich wollte nur meine "Methode" teilen, meine Client-Seite ist Debian / Ubuntu-spezifisch, aber meine Server-Seite ist im Grunde die gleiche wie oben, aber mit ein wenig mehr "HowTo:"

Server:

Aktivieren Sie das öffentliche Schlüsselattribut:

Kredit:

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

Jetzt benutze das um ldif hinzuzufügen:

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

Hinzufügen eines Benutzers mit dem öffentlichen SSH-Schlüssel in phpLDAPadmin

Erstellen Sie zunächst einen Benutzer mit der Vorlage "Allgemein: Benutzerkonto". Gehen Sie dann zum Attributbereich "objectClass", klicken Sie auf "Wert hinzufügen" und wählen Sie das Attribut "ldapPublicKey". Nach dem Senden gehen Sie zurück zur Benutzer-Edit-Seite, klicken auf "Neues Attribut hinzufügen" im oberen Teil und wählen "sshPublicKey", fügen den öffentlichen Schlüssel in den Textbereich ein und klicken schließlich auf "Objekt aktualisieren". "

sshPublicKey-Attribut wird nicht angezeigt - OpenLDAP PHPLDAP SSH Key Auth

Ubuntu-Client:

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

Erstellen Sie Testschlüssel:

ssh-keygen -t rsa

4
2017-09-18 19:44





Dies ist keine vollständige Antwort, nur eine Ergänzung zu c4urssons Antwort. Ich hätte das als Kommentar hinzugefügt, aber ich habe keinen ausreichenden Ruf, um zu kommentieren, also bitte nicht runter!

Dies ist das Skript, das ich für die Verwendung von AuthorizedKeysCommand (basierend auf der Version von c4urself). Es funktioniert unabhängig davon, ob der Wert in der base64-Codierung zurückgegeben wird oder nicht. Dies kann besonders nützlich sein, wenn Sie mehrere autorisierte Schlüssel in LDAP speichern möchten - trennen Sie die Schlüssel einfach mit Zeilenvorschubzeichen, ähnlich der Datei 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

2
2017-11-15 10:39