Authentification LDAP sur CentOS 7

11

Après la mise à niveau vers CentOS 7, il n'est plus possible de se connecter via LDAP. Avec CentOS 6, j'ai utilisé le package pam_ldap qui fonctionnait bien, mais maintenant pam_ldap n'est plus disponible pour la nouvelle version de CentOS.

La connexion via ldapsearch fonctionne toujours bien, mais essayer de s'authentifier via ssh ne fonctionne pas.

J'ai réinstallé le package nss-pam-ldapd et reconfiguré l'authentification via authconfig-tui , mais cela ne fonctionne toujours pas.

Ci-dessous, je remplace mon nom d'utilisateur par user.name et la base par dc = sub, dc = example, dc = org .

Mon OS hôte est un CentOS 7. Toutes les mises à jour actuellement disponibles sont installées.

$ uname -a
Linux isfet 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Packages installés

$ rpm -qa | grep -i ldap
openldap-2.4.39-3.el7.x86_64
nss-pam-ldapd-0.8.13-8.el7.x86_64
openldap-clients-2.4.39-3.el7.x86_64

Contenu de /etc/openldap/ldap.conf

URI ldap://172.16.64.25
BASE dc=sub,dc=example,dc=org

Contenu de /etc/nslcd.conf

ldap_version 3
uri ldap://172.16.64.25
base dc=sub,dc=example,dc=org
ssl no

Sortie de / var / log / secure

Oct  6 12:12:16 isfet sshd[3937]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=172.16.64.1  user=user.name
Oct  6 12:12:17 isfet sshd[3937]: Failed password for user.name from 172.16.64.1 port 18877 ssh2

Sortie de /var/log/audit/audit.log

type=USER_AUTH msg=audit(1412590243.286:364): pid=3912 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:authentication acct="user.name" exe="/usr/sbin/sshd" hostname=172.16.64.1 addr=172.16.64.1 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1412590243.287:365): pid=3912 uid=0 auid=4294967295 ses=4294967295 msg='op=password acct="user.name" exe="/usr/sbin/sshd" hostname=? addr=172.16.64.1 terminal=ssh res=failed'

Sortie de la commande ldapserach

$ ldapsearch -H ldap://172.16.64.25/ -D cn=Manager,dc=sub,dc=example,dc=org -W -x -b dc=sub,dc=example,dc=org -d1

ldap_url_parse_ext(ldap://172.16.64.25/)
ldap_create
ldap_url_parse_ext(ldap://172.16.64.25:389/??base)
Enter LDAP Password:
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP 172.16.64.25:389
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 172.16.64.25:389
ldap_pvt_connect: fd: 3 tm: -1 async: 0
attempting to connect:
connect success
ldap_open_defconn: successful
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({i) ber:
ber_flush2: 61 bytes to sd 3
ldap_result ld 0x7f9b07402110 msgid 1
wait4msg ld 0x7f9b07402110 msgid 1 (infinite timeout)
wait4msg continue ld 0x7f9b07402110 msgid 1 all 1
** ld 0x7f9b07402110 Connections:
* host: 172.16.64.25  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Mon Oct  6 12:04:38 2014


** ld 0x7f9b07402110 Outstanding Requests:
 * msgid 1,  origid 1, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x7f9b07402110 request count 1 (abandoned 0)
** ld 0x7f9b07402110 Response Queue:
   Empty
  ld 0x7f9b07402110 response count 0
ldap_chkResponseList ld 0x7f9b07402110 msgid 1 all 1
ldap_chkResponseList returns ld 0x7f9b07402110 NULL
ldap_int_select
read1msg: ld 0x7f9b07402110 msgid 1 all 1
ber_get_next
ber_get_next: tag 0x30 len 50 contents:
read1msg: ld 0x7f9b07402110 msgid 1 message type bind
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x7f9b07402110 0 new referrals
read1msg:  mark request completed, ld 0x7f9b07402110 msgid 1
request done: ld 0x7f9b07402110 msgid 1
res_errno: 0, res_error: <>, res_matched: <cn=Manager,dc=sub,dc=example,dc=org>
ldap_free_request (origid 1, msgid 1)
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (}) ber:
ldap_msgfree
ldap_err2string
ldap_bind: Success (0)
        matched DN: cn=Manager,dc=sub,dc=example,dc=org
...

Contenu de _ / etc / pam.d / password-auth

auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so

Contenu de _ / etc / pam.d / system-auth

auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so
Lukas Schulze
la source
Obtenez-vous des résultats en exécutant "getent passwd user.name" ou "su - user.name"?
Andy
L'utilisateur existe localement, mais sans mot de passe. L'authentification est contre le LDAP. / etc / passwd: user.name:x:1028:1031::/home/user.name:/bin/bash / etc / shadow: user.name: !!: 16348: 0: 99999: 7 :::
Lukas Schulze
N'utilise pas pam_ldapun fichier différent de celui /etc/openldap/ldap.conf? Je veux dire /etc/ldap.conf, désinvolte. J'essaierais de déboguer le module en ajoutant l' debugoption d'ajout de verbosiry de journalisation, ie auth sufficient pam_ldap.so use_first_pass debug. Au-delà de cela, je pense que la question a été brouillée par vous suivant les conseils de Joffrey. Veuillez revenir à votre configuration d'origine si vous voulez que d'autres personnes puissent vous aider.
Andrew B
Pouvez-vous ajouter le contenu de /etc/ldap.conf?
Andrew B
Je vous remercie! L'exécution de nslcd en mode débogage m'a aidé à trouver l'erreur. Je l'ai écrit comme réponse.
Lukas Schulze

Réponses:

4

L'exécution de nslcd en mode débogage montre le problème:

$ $(which nslcd) -d
...
nslcd: [8b4567] <authc="user.name"> DEBUG: myldap_search(base="dc=sub,dc=example,dc=org", filter="(&(objectClass=posixAccount)(uid=user.name))")
...
nslcd: [8b4567] <authc="user.name"> DEBUG: ldap_result(): end of results (0 total)
nslcd: [8b4567] <authc="user.name"> DEBUG: "user.name": user not found: No such object
...

nslcd définit un filtre par défaut. Il n'est pas possible de supprimer ce filtre ou de le mettre à blanc.

Étant donné qu'aucun de mes utilisateurs LDAP n'a de classe d'objet appelée posixAccount, les utilisateurs sont introuvables et la connexion est refusée.

Pour résoudre ce problème, j'ai dû remplacer ce filtre par un propre. Parce que je cherche l' uid, il est utile de définir le filtre sur un attribut qui est recherché de toute façon.

Nouveau contenu de mon /etc/nslcd.conf :

filter passwd (uid=*)
uri ldap://172.16.64.25
base dc=sub,dc=example,dc=org
ssl no

Après avoir changé le nslcd.conf, j'ai dû redémarrer le service nslcd:systemctl restart nslcd

Source: http://lists.arthurdejong.org/nss-pam-ldapd-users/2014/msg00025.html

.

Cela semble être un problème pour _nss-pam-ldapd-0.8.13-8.el7.x86_64_ sur CentOS 7!

$ nslcd -V
nss-pam-ldapd 0.8.13

J'ai essayé de reproduire le problème sur CentOS 6, mais sur ce nss-pam-ldapd a des dépendances à pam_ldap qui a son fichier de configuration dans /etc/pam_ldap.conf et semble ne pas utiliser /etc/nslcd.conf de la façon dont cela fonctionne sur CentOS 7.

Lukas Schulze
la source
1
Oui, les pam_ldapcollisions de dénomination sont très déroutantes. :( Il existe plusieurs implémentations qui revendiquent toutes le nom de ce module.
Andrew B