openssh ldap authentication

openSSH LADP authentication

In dieser kleinen Anleitung zeige ich die Konfiguration auf die man benötigt damit eine openSSH LDAP Authentisieren funktioniert.
Danach kann man sich mit einem LDAP User an einem Server per SSH anmelden.
Ich gehe von einen Funktionierenden LDAP Server aus. Wer noch keinen hat kann die Installation und Grundkonfiguration aus diesem HowTo entnehmen.

Als erstes sollte auf dem Server die Zeit stimmen. Deswegen installieren wir NTP nach falls es noch nicht drauf sein sollte.
[stextbox id=“bash“]apt-get install ntp[/stextbox]

Als nächstes werden die benötigten LDAP Pakete installiert.
[stextbox id=“bash“]apt-get install libpam-ldapd libnss-ldapd[/stextbox]

Bei der Installation wird schon nach dem LDAP Server gefragt. Hier geben wir auch diesen gleich an.

ldap-client01

Im nächsten Fenster werden wir nach der LDAP Domain gefragt. Bei mir ist es secretisland.de also dc=secretisland,dc=de

ldap-client02

Als nächstes wählen wir group, hosts, passwd und shadow aus.

ldap-client03

Man kann die beiden abfragen auch nochmals mittels dpkg-reconfigure nslcd und dpkg-reconfigure libnss-ldapd erneut konfigurieren. Oder die entsprechenden Dateien Editieren.

Als nächstes sollte man einen Funktions-User im LDAP anlegen der die benötigten Lese rechte hat. Leider wird das Passwort im Klartext in der /etc/nslcd.conf hinterlegt

Beim anlegen der proxyuser´s im LDAP ist darauf zu achten das er nicht die Klasse / Schema des posixAccount hat.

Dazu editieren wir die /etc/nslcd.conf
[stextbox id=“bash“]nano /etc/nslcd.conf[/stextbox]

und fügen den User proxyuser mit seinem geheimes_klartext_passwort.

# /etc/nslcd.conf
# nslcd configuration file. See nslcd.conf(5)
# for details.

# The user and group nslcd should run as.
uid nslcd
gid nslcd

# The location at which the LDAP server(s) should be reachable.
uri ldap://ldap.dmz-home.secretisland.de

# The search base that will be used for all queries.
base dc=secretisland,dc=de

# The LDAP protocol version to use.
#ldap_version 3

# The DN to bind with for normal lookups.
binddn cn=proxyuser,dc=secretisland,dc=de
bindpw geheimes_klartext_passwort

# The DN used for password modifications by root.
#rootpwmoddn cn=admin,dc=example,dc=com

# SSL options
#ssl off
#tls_reqcert never

# The search scope.
#scope sub

Da wir in dieser Datei ein Klartext Passwort hinterlegt haben. Kontrollieren wir die Dateiberechtigung

[stextbox id=“bash“]ll /etc/nslcd.conf[/stextbox]

-rw-r----- 1 root nslcd 671 May  1 20:40 /etc/nslcd.conf

Jetzt sollte die Verbindung zum LDAP Server klappen dazu machen wir zwei Tests.

Einmal einen LDAP search

[stextbox id=“bash“]ldapsearch -x -D „cn=proxyuser,dc=secretisland,dc=de“ -w geheimes_klartext_passwort -H ldap://ldap.dmz-home.secretisland.de -b „dc=secretisland,dc=de“[/stextbox]

und das den nslcd im Debug Modus

[stextbox id=“bash“]/etc/init.d/nscd stop
/etc/init.d/nslcd stop
nslcd -d[/stextbox]

in einer anderen shell kann man dann das ausführen
[stextbox id=“bash“]getent passwd[/stextbox]

Hier sollten jetzt alle User ausgegeben werden die in der /etc/passwd und alle LDAP User mit posixAccount Klasse

Debug Ausgabe des nslcd

nslcd: DEBUG: add_uri(ldap://ldap.dmz-home.secretisland.de)
nslcd: version 0.8.10 starting
nslcd: DEBUG: unlink() of /var/run/nslcd/socket failed (ignored): No such file or directory
nslcd: DEBUG: setgroups(0,NULL) done
nslcd: DEBUG: setgid(105) done
nslcd: DEBUG: setuid(103) done
nslcd: accepting connections
nslcd: DEBUG: accept() failed (ignored): Resource temporarily unavailable
nslcd: [8b4567] DEBUG: connection from pid=7332 uid=0 gid=0
nslcd: [8b4567] <passwd(all)> DEBUG: myldap_search(base="dc=secretisland,dc=de", filter="(objectClass=posixAccount)")
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_initialize(ldap://ldap.dmz-home.secretisland.de)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_rebind_proc()
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_PROTOCOL_VERSION,3)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_DEREF,0)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_TIMELIMIT,0)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_TIMEOUT,0)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_NETWORK_TIMEOUT,0)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_REFERRALS,LDAP_OPT_ON)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_set_option(LDAP_OPT_RESTART,LDAP_OPT_ON)
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_simple_bind_s("cn=proxyuser,dc=secretisland,dc=de","***") (uri="ldap://ldap.dmz-home.secretisland.de")
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_result(): cn=atestuser,dc=secretisland,dc=de
nslcd: [8b4567] <passwd(all)> DEBUG: ldap_result(): end of results (1 total)

 

Ausgabe des getent passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
ntp:x:102:104::/home/ntp:/bin/false
nslcd:x:103:105:nslcd name service LDAP connection daemon,,,:/var/run/nslcd/:/bin/false
atestuser:*:1000:1000:Alexander testuser:/home/atestuser:/bin/bash

Hier sehen wir am ende den atestuser den ich im meinem Test LDAP angelegt habe.

 

Wenn alles funktioniert können wir den Debug Modus des nslcd beenden und die Dienste starten.

Ich hab persönlich mit dem nsca Dienst immer ein paar Probleme gehabt und deaktiviere daher vorher noch das Hostname Caching. Alternative kann man ihn auch deinstallieren.

[stextbox id=“bash“]nano /etc/nscd.conf[/stextbox]

Und setze den wert enable-cache hosts auf no

[stextbox id=“bash“]/etc/init.d/nscd restart
/etc/init.d/nslcd restart[/stextbox]

 

PAM Konfiguration

Da Linux-PAM ein sehr tief gehendes Thema ist werde ich hier darauf nicht eingehen. Es wird aber empfohlen sich damit zu beschädigen.

Ich werde hier nur die benötigten Änderungen aufzeigen damit man sich per LDAP Authentifizierung einloggen kann.

[stextbox id=“bash“]nano /etc/pam.d/common-auth[/stextbox]

# here are the per-package modules (the "Primary" block)
auth    [success=2 default=ignore]      pam_unix.so nullok_secure
auth    [success=1 default=ignore]      pam_ldap.so minimum_uid=1000 use_first_pass
# here's the fallback if no module succeeds
auth    requisite                       pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth    required                        pam_permit.so

[stextbox id=“bash“]nano /etc/pam.d/common-account[/stextbox]

# here are the per-package modules (the "Primary" block)
account [success=1 new_authtok_reqd=done default=ignore]        pam_unix.so
# here's the fallback if no module succeeds
account requisite                       pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
account required                        pam_permit.so
# and here are more per-package modules (the "Additional" block)
account [success=ok new_authtok_reqd=done ignore=ignore user_unknown=ignore authinfo_unavail=ignore default=bad]        pam_ldap.so minimum_uid=1000

[stextbox id=“bash“]nano /etc/pam.d/common-passwor[/stextbox]

password        [success=2 default=ignore]      pam_unix.so obscure sha512
password        [success=1 default=ignore]      pam_ldap.so minimum_uid=1000 try_first_pass
# here's the fallback if no module succeeds
password        requisite                       pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
password        required                        pam_permit.so

[stextbox id=“bash“]nano /etc/pam.d/common-session[/stextbox]

# here are the per-package modules (the "Primary" block)
session [default=1]                     pam_permit.so
# here's the fallback if no module succeeds
session requisite                       pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required                        pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required        pam_unix.so
session [success=ok default=ignore]     pam_ldap.so minimum_uid=1000
session required        pam_mkhomedir.so

 

Wenn alles funktioniert sollte man sich als LDAP User anmelden können.

2 Kommentare zu „openssh ldap authentication

  1. Hi,

    schöner Beitrag. Mit dem OpenSSH 6.6 aus Wheezy-Backports kann sich der sshd übrigens die SSH-Keys direkt aus dem LDAP holen – damit kann man schön komfortabel auch die Keys zentral übers LDAP verwalten.

    Vielleicht ganz interessant :-)

  2. Danke Valentin,

    ich lass das derzeit unter Jessie also Testing laufen da funktioniert es auch sehr gut.
    openssh-server:amd64/jessie 1:6.6p1-5
    Für die Doku hab ich hier nur Wheezy hergenommen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*