Comment modifier un mot de passe pour un utilisateur OpenLDAP, qui échoue lors de l'utilisation des préférences système de Lion?


1

Le problème

Les utilisateurs ne peuvent pas changer leur mot de passe en utilisant Préférences de système - & gt; Utilisateurs & amp; Groupes sur un Mac connecté à un serveur LDAP (plus précisément OpenLDAP).

Cette erreur semble résulter de l'envoi par OS X 10.7.4 du Nom d'utilisateur de l'utilisateur plutôt que leur DN complet (par exemple, il envoie bobsmith, ne pas uid=bobsmith,ou=Users,dc=companyname,dc=com ).

(Un rapport de bogue relatif à ce problème a été déposé auprès d’Apple et peut être consulté sur OpenRader @. http://openradar.appspot.com/11768796 )

Étapes à suivre pour reproduire:

Essayez de changer le mot de passe en utilisant le Préférences de système - & gt; Utilisateurs & amp; Groupes prefpane sur Lion (edit: ou Mountain Lion). Il échoue avec le message d'erreur suivant:

Le mot de passe pour le compte “ bobsmith ”N'a pas été changé.   Il se peut que votre administrateur système ne vous autorise pas à modifier votre mot de passe ou que votre mot de passe pose un autre problème. Contactez votre administrateur système pour obtenir de l'aide.

Résultats attendus:

Le mot de passe devrait être changé.

Résultats actuels:

L'erreur apparaît et sur le serveur LDAP, une erreur du type suivant est enregistrée:

Jun 28 08:42:21 ldap3 slapd[7810]: conn=10518785 op=2 RESULT oid= err=21 text=Invalid DN

Cette erreur semble résulter du fait que OS X 10.7.4 envoie maintenant le nom d'utilisateur de l'utilisateur plutôt que son DN complet (par exemple, il envoie bobsmith, ne pas uid=bobsmith,ou=Users,dc=companyname,dc=com )

Remarques: Cela a été rencontré par quelqu'un d'autre sur les forums AFP548.com qui ont fini par corriger leur serveur LDAP pour résoudre le problème. Cela ne devrait toutefois pas nécessiter l'application de correctifs à LDAP pour résoudre le problème. Lion et Mountain Lion doivent (au moins avoir la possibilité de) envoyer le DN complet d'un utilisateur demandant à changer son mot de passe, pas le nom d'utilisateur court:

Texte du lien de forum ci-dessus (au cas où il est retiré):

J'ai donc ce serveur OpenLDAP avec des répertoires de départ réseau à la maison, sur lesquels toutes mes machines Mac s'authentifient. Tout le monde peut se tourner vers le Mac disponible. Ça marche très bien.

Quoi qu'il en soit, avec Snow Leopard, j'ai été en mesure de changer les mots de passe des utilisateurs via les préférences système. Cependant, cela a été cassé lorsque je suis passé à Lion et Mountain Lion (entre autres). Snow Leopard, Lion et Mountain Lion envoient tous les deux des exop au serveur LDAP, mais pour une raison quelconque, l'identifiant est foutu dans Lion and Mountain Lion (ou du moins, c'est foutu sur les deux machines de la maison, j'ai testé cela). . Au lieu d’envoyer le DN de l’utilisateur, par exemple "Uid = utilisateur, cn = utilisateurs, ou = quelque chose, dc = quelque part, dc = com", le serveur LDAP reçoit uniquement l'ID utilisateur, par exemple. "utilisateur". Le serveur LDAP attend ici un DN, il échoue donc naturellement avec l’erreur «DN invalide».

Bummer.

Donc, pour contourner ce problème, je devais appliquer un correctif à OpenLDAP (la version 2.4.26 dans ce cas). Maintenant, lorsque mon serveur ne peut pas résoudre l'id donné lors d'une modification de mot de passe, il examine le DN de liaison et, si la chaîne d'id est contenue dans la chaîne du DN de liaison, il utilisera simplement le DN de liaison comme entrée changement. Je pensais que cela me permettrait tout de même de spécifier manuellement les modifications de mot de passe via un compte administrateur, tout en donnant aux utilisateurs la possibilité de modifier leurs propres mots de passe sans avoir à les pointer vers une page Web (boiteuse).

Je devrais souligner que tous mes comptes ont cet ID utilisateur dans le DN… Je suppose que si vous faisiez une sorte de mappages SASL délirants, cela pourrait ne pas fonctionner pour vous…

Quoi qu’il en soit, voici le patch au cas où d’autres personnes seraient intéressées… Si cela vous convient, tant mieux. Si non, eh bien.

-- passwd.c 2011-06-30 11:13:36.000000000 -0400
+++ passwd.lion_compatability.c 2012-02-13 22:48:54.213214617 -0500
@@ -18,4 +18,5 @@

 #include 
+#include 

 #include 
@@ -59,4 +60,5 @@
    int freenewpw = 0;
    struct berval dn = BER_BVNULL, ndn = BER_BVNULL;
+   ber_int_t err;

    assert( ber_bvcmp( &slap_EXOP_MODIFY_PASSWD, &op->ore_reqoid ) == 0 );
@@ -102,11 +104,8 @@

    if ( !BER_BVISEMPTY( &id ) ) {
-       rs->sr_err = dnPrettyNormal( NULL, &id, &dn, &ndn, op->o_tmpmemctx );
-       id.bv_val[id.bv_len] = idNul;
-       if ( rs->sr_err != LDAP_SUCCESS ) {
-           rs->sr_text = "Invalid DN";
-           rc = rs->sr_err;
-           goto error_return;
-       }
+       err = dnPrettyNormal( NULL, &id, &dn, &ndn, op->o_tmpmemctx );
+   }
+
+   if ( !BER_BVISEMPTY( &id ) && (err == LDAP_SUCCESS) ) {
        op->o_req_dn = dn;
        op->o_req_ndn = ndn;
@@ -116,4 +115,16 @@
        ber_dupbv_x( &dn, &op->o_dn, op->o_tmpmemctx );
        ber_dupbv_x( &ndn, &op->o_ndn, op->o_tmpmemctx );
+       if ( !BER_BVISEMPTY( &id ) ) {
+           /* See if the id matches the bind dn */
+           if ( strstr( dn.bv_val, id.bv_val ) == NULL )
+           {
+               rs->sr_err = err; /* From dnPrettyNormal */
+               rs->sr_text = "Invalid DN";
+               rc = rs->sr_err;
+               goto error_return;
+           }
+           Statslog( LDAP_DEBUG_STATS, "%s Invalid id (%s) specified; using bind DN (%s)\n",
+                   op->o_log_prefix, id.bv_val, dn.bv_val, 0, 0 );
+       }
        op->o_req_dn = dn;
        op->o_req_ndn = ndn;
@@ -123,4 +134,8 @@
    }

+   if ( !BER_BVISEMPTY( &id ) ) {
+       id.bv_val[id.bv_len] = idNul;
+   }
+
    if( op->o_bd == NULL ) {
        if ( qpw->rs_old.bv_val != NULL ) {
"

UPDATE (ne fonctionne toujours pas, cependant)

J'ai aussi essayé de changer mon mot de passe avec dscl, comme ceci:

$ dscl -u bobsmith -p /LDAPv3/ldap -passwd /Users/bobsmith           

... et ceci a généré ce qui suit après avoir entré mon mot de passe actuel et un nouveau:

Password: 
New Password: 
passwd: DS error: eNotYetImplemented
 DS Error: -14988 (eNotYetImplemented)

Sur mon serveur OpenLDAP, il a généré:

Jul  3 11:47:51 ldap slapd[7810]: conn=12282745 fd=1633 ACCEPT from IP=10.0.1.3:64485 (IP=0.0.0.0:636)
Jul  3 11:47:51 ldap slapd[7810]: conn=12282745 fd=1633 closed (TLS negotiation failure)
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 fd=1633 ACCEPT from IP=10.0.1.3:64486 (IP=0.0.0.0:636)
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 fd=1633 TLS established tls_ssf=256 ssf=256
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 op=0 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 op=0 SRCH attr=supportedSASLMechanisms defaultNamingContext namingContexts schemaNamingContext
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 op=0 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 op=1 BIND dn="uid=bobsmith,ou=Users,dc=mycompany,dc=com" method=128
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 op=1 BIND dn="uid=bobsmith,ou=Users,dc=mycompany,dc=com" mech=SIMPLE ssf=0
Jul  3 11:47:51 ldap slapd[7810]: conn=12282746 op=1 RESULT tag=97 err=0 text=
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=2 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=3 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=4 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=4 SRCH attr=objectClass apple-generateduid uid uidNumber userPassword cn
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=4 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=5 EXT oid=1.3.6.1.4.1.4203.1.11.1
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=5 PASSMOD old
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=5 RESULT oid= err=53 text=old password value is empty
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 op=6 UNBIND
Jul  3 11:47:56 ldap slapd[7810]: conn=12282746 fd=1633 closed

Si je lance la même commande dscl à partir d’une machine Snow Leopard, cela fonctionne sans erreur:

$ dscl -u bobsmith -p /LDAPv3/myldapserver.com -passwd /Users/bobsmith
Password: 
New Password: 

Il génère ces journaux sur le serveur

Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 fd=1283 ACCEPT from IP=10.0.1.2:51013 (IP=0.0.0.0:636)
Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 fd=1283 TLS established tls_ssf=256 ssf=256
Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 op=0 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 op=0 SRCH attr=supportedSASLMechanisms namingContexts dnsHostName krbName
Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 op=0 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 op=1 UNBIND
Jul  3 12:03:29 ldap slapd[7810]: conn=12293658 fd=1283 closed
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 fd=1283 ACCEPT from IP=10.0.1.2:51014 (IP=0.0.0.0:636)
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 fd=1283 TLS established tls_ssf=256 ssf=256
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 op=0 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 op=0 SRCH attr=supportedSASLMechanisms namingContexts dnsHostName krbName
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 op=0 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 op=1 BIND dn="uid=bobsmith,ou=Users,dc=mycompany,dc=com" method=128
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 op=1 BIND dn="uid=bobsmith,ou=Users,dc=mycompany,dc=com" mech=SIMPLE ssf=0
Jul  3 12:03:29 ldap slapd[7810]: conn=12293659 op=1 RESULT tag=97 err=0 text=
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=2 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=2 SRCH attr=uid cn
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=3 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=3 SRCH attr=uid cn
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=4 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=4 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=5 EXT oid=1.3.6.1.4.1.4203.1.11.1
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=5 PASSMOD id="uid=bobsmith,ou=Users,dc=mycompany,dc=com" new
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=5 RESULT oid= err=0 text=
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=6 SRCH base="ou=Users,dc=mycompany,dc=com" scope=2 deref=0 filter="(&(|(objectClass=posixAccount)(objectClass=inetOrgPerson)(objectClass=shadowAccount))(|(uid=bobsmith)(cn=bobsmith)))"
Jul  3 12:03:31 ldap slapd[7810]: conn=12293659 op=6 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jul  3 12:03:32 ldap slapd[7810]: conn=12293659 op=7 UNBIND
Jul  3 12:03:32 ldap slapd[7810]: conn=12293659 fd=1283 closed
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.