Vraag SSH-sleutelverificatie met LDAP


Kortom:

Zou graag een manier willen om SSH-sleutelauthenticatie via LDAP te doen.

Probleem:

We gebruiken LDAP (slapd) voor directoryservices en we zijn onlangs overgestapt naar het gebruik van onze eigen AMI voor het bouwen van instanties. De reden dat het AMI-bit belangrijk is, is dat ideaal, we willen graag kunnen inloggen met SSH via sleutelverificatie zodra het exemplaar wordt uitgevoerd en niet hoeven wachten op onze ietwat trage configuratiebeheertool om een ​​script af te vinken om de juiste sleutels toe te voegen aan het exemplaar.

Het ideale scenario is dat we bij het toevoegen van een gebruiker aan LDAP ook hun sleutel toevoegen en dat ze onmiddellijk kunnen inloggen.

Sleutelverificatie is een moet omdat inloggen op basis van wachtwoord zowel minder veilig als hinderlijk is.

Ik heb gelezen deze vraag wat suggereert dat er een patch voor OpenSSH is met de naam OpenSSH-lpk om dit te doen, maar dit is niet langer nodig met OpenSSH-server> = 6.2

Een sshd_config (5) optie AuthorizedKeysCommand toegevoegd aan      ondersteuning ophalen van authorized_keys van een commando naast (of      in plaats van) van het bestandssysteem. De opdracht wordt uitgevoerd onder een account      gespecificeerd door een AuthoredKeysCommandUser sshd_config (5) optie

Hoe kan ik OpenSSH en LDAP configureren om dit te implementeren?


50
2017-12-19 20:13


oorsprong




antwoorden:


Werk LDAP bij met het schema OpenSSH-LPK

We moeten eerst LDAP bijwerken met een schema om het te kunnen toevoegen sshPublicKey kenmerk voor gebruikers:

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

Maak een script dat LDAP opvraagt ​​voor de publieke sleutel van een gebruiker:

Het script moet de openbare sleutels voor die gebruiker uitvoeren, bijvoorbeeld:

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

Bijwerken sshd_config om naar het script van de vorige stap te verwijzen

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bonus: Bijwerken sshd_config om wachtwoordverificatie uit te schakelen van interne RFC1918-netwerken zoals te zien in deze vraag:

Sta wachtwoordverificatie alleen toe aan de SSH-server vanuit het interne netwerk

Handige links:

EDIT: Toegevoegde gebruiker nobody zoals gesuggereerd TRS-80


57
2017-12-19 20:13



Dit is fantastisch, hoewel ik zou suggereren AuthorizedKeysCommandUser nobody in plaats van root. - TRS-80
Er moet iets anders zijn in mijn ldapsearch of sed omdat het doorgeven van de uitvoer naar de sed black magic opdracht die je daar hebt me geen uitvoer geeft, ook al geeft mijn gewone ldapsearch-opdracht gegevens terug. Ik zal een script moeten schrijven om de output schoon te maken in plaats van sed te gebruiken. - Chris L
Negeer mijn vorige opmerking. Mijn probleem werd veroorzaakt door het hebben van een slepende newline in de eigenschap sshPublicKey, die ervoor zorgt dat ldapsearch base64 het hele ding codeert. Ik vereenvoudigde de sed opdracht tho: ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p' - Chris L
@Chris inderdaad minder zwarte magie, maar sed is nog steeds een eenmalige hash-functie voor eenmalig schrijven;) - Froyke
Op mijn versie van OpenSSH (5.3p1-122.el6) is dat zo AuthorizedKeysCommandRunAs en niet AuthorizedKeysCommandUser - mveroone


Voor iedereen die de foutmelding krijgt bij het uitvoeren van de ldapsearch:

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

zoals ik was (op FreeBSD), is de oplossing om de eerste opdracht sed te wijzigen in:

/^ /{H;d;};

(een puntkomma toevoegen na de 'd').


5
2018-03-08 13:18





Ik wilde gewoon mijn "methode" delen, mijn client-kant is Debian / Ubuntu Specific, maar mijn Server-kant is eigenlijk hetzelfde als hierboven, maar met wat meer "HowTo:"

Server:

Publieke sleutelkenmerk inschakelen:

Krediet:

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

Gebruik dit nu om ldif toe te voegen:

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

Een gebruiker met openbare SSH-sleutel toevoegen in phpLDAPadmin

Maak eerst een gebruiker met de sjabloon "Generiek: Gebruikersaccount". Ga vervolgens naar het kenmerk "objectClass", klik op "waarde toevoegen" en kies het kenmerk "ldapPublicKey". Nadat u hebt ingestuurd, gaat u terug naar de pagina voor het bewerken van gebruikers, klikt u op 'Nieuw kenmerk toevoegen' in het bovenste gedeelte en kiest u 'sshPublicKey', plakt u de openbare sleutel in het tekstgedeelte en klikt u ten slotte op 'Object bijwerken'. "

sshPublicKey Attribuut niet weergegeven - OpenLDAP PHPLDAP SSH Sleutel 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

Maak testsleutels:

ssh-keygen -t rsa

4
2017-09-18 19:44





Dit is geen volledig antwoord, slechts een toevoeging aan c4urself's antwoord. Ik zou dit als commentaar hebben toegevoegd, maar ik heb onvoldoende reputatie om commentaar te geven, dus doe alsjeblieft niet down!

Dit is het script dat ik gebruik voor de AuthorizedKeysCommand (op basis van de versie van c4urself). Het werkt ongeacht of de waarde wordt geretourneerd in base64-codering of niet. Dit kan met name handig zijn als u meerdere geautoriseerde sleutels in LDAP wilt opslaan - gewoon de toetsen scheiden met tekens voor de nieuwe regel, vergelijkbaar met het bestand 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