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.
Im nächsten Fenster werden wir nach der LDAP Domain gefragt. Bei mir ist es secretisland.de also dc=secretisland,dc=de
Als nächstes wählen wir group, hosts, passwd und shadow aus.
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.
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 :-)
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.