Portál AbcLinuxu, 8. května 2025 00:07

Dotaz: OpenLDAP ACL vs PHP ldap_search()

20.5.2015 14:59 Marián
OpenLDAP ACL vs PHP ldap_search()
Přečteno: 300×
Odpovědět | Admin
Mám problém, že PHPčkovská funkcia ldap_search() mi nevráti žiaden záznam, ale konzolový príkaz ldapsearch volaný s tými istými parametrami mi očakávaný výsledok vráti.

Konzolový príkaz (má vrátiť obsah parametra URL pre záznam s uID = 1011223):
ldapsearch -H ldaps://localhost:636 -x -D "uid=webuser,ou=people,dc=domain,dc=tld" -W -b "ou=users,dc=domain,dc=tld" "(uID=1011223)" "URL"
PHP funkcia:
ldap_bind($ldap_conn, 'uid=webuser,ou=people,dc=domain,dc=tld', 'heslo')

$ldap_dn        = 'ou=users,dc=domain,dc=tld';
$ldap_filter    = "(uID=$uid)";
$ldap_attr      = array('URL');

$ldap_search_result     = ldap_search($ldap_conn, $ldap_dn, $ldap_filter, $ldap_attr);
skončí chybovou hláškou PHP Warning: ldap_search(): Search: No such object.

Pri debugovaní na strane servera som zistil, že PHP ldap_search() sa snaží ísť o úroveň vyššie (dc=domain,dc=tld) a neviem prečo.

Debug konzolového príkazu ldapsearch:
conn=1007 op=1 SRCH base="ou=users,dc=domain,dc=tld" scope=2 deref=0 filter="(uid=1011223)"
conn=1007 op=1 SRCH attr=url
=> access_allowed: search access to "ou=users,dc=domain,dc=tld" "entry" requested
=> dn: [1] ou=users,dc=domain,dc=tld
=> acl_get: [1] matched
=> acl_get: [1] attr entry
=> acl_mask: access to entry "ou=users,dc=domain,dc=tld", attr "entry" requested
=> acl_mask: to all values by "uid=webuser,ou=people,dc=domain,dc=tld", (=0)
<= check a_dn_pat: uid=webuser,ou=people,dc=domain,dc=tld
<= acl_mask: [1] applying read(=rscxd) (stop)
<= acl_mask: [1] mask: read(=rscxd)
=> slap_access_allowed: search access granted by read(=rscxd)
=> access_allowed: search access granted by read(=rscxd)
Debug PHP funkcie ldap_search():
conn=1011 op=1 SRCH base="ou=users,dc=domain,dc=tld" scope=2 deref=0 filter="(uid=1011223)"
conn=1011 op=1 SRCH attr=url
=> access_allowed: disclose access to "dc=domain,dc=tld" "entry" requested
=> dn: [1] ou=users,dc=domain,dc=tld
=> acl_get: [3] attr entry
=> acl_mask: access to entry "dc=domain,dc=tld", attr "entry" requested
=> acl_mask: to all values by "uid=webuser,ou=people,dc=domain,dc=tld", (=0)
<= check a_dn_pat: cn=manager,dc=domain,dc=tld
<= acl_mask: no more who clauses, returning =0 (stop)
=> slap_access_allowed: disclose access denied by =0
=> access_allowed: no more rules
Skúšal som pridať oprávnenie disclose a dokonca read pre dc=domain,dc=tld. Výsledok bol, že som už nemal "access denied", ale nemal som ani očakávaný výsledok. Chyba v PHP bola stále tá istá (ldap_search(): Search: No such object).

LDAP používateľ webuser má nastavené oprávnenie, že vie čítať iba dva atribúty uID a URL a to len zo stromu "ou=users,dc=domain,dc=tld".

Defaultné ACL "access to * by users read" mám zakázané, lebo takto vedel webuser čítať aj iné atribúty. A možno tu je kameň úrazu. Podľa dokumentácie k OpenLDAP-u sa ACL spracúvajú v poradí ako sú napísané a ich spracovávanie končí pri prvej zhode (ak sa nepoužije break). ACL pre webuser-a bol ako prvý a "access to * by users read" ako posledný, ale aj tak vedel webuser vyčítavať atribúty, ktoré nemal. V prípade, že je aktívny "access to * by users read", tak to nemá nijaký vplyv na výsledok ldap_search(), v debug logoch síce nemám "access denied", ale nemám ani výsledok. Neviem ako si mám vysvetlovať slovo "stop" v logoch (napr.: acl_mask: [2] applying read(=rscxd) (stop)), či to znamená chybu alebo niečo iné.

ACL z konfiguráku OpenLDAP-u:
access to dn.subtree="ou=users,dc=domain,dc=tld" attrs=uID,URL
     by dn.exact="uid=webuser,ou=people,dc=domain,dc=tld" read
     by * none

access to attrs=userPassword
    by anonymous auth
    by * none

access to *
    by dn.exact="cn=Manager,dc=domain,dc=tld" write
#   by users read
    by * none
Skúšal som aj ldap_read() a ldap_list(), ktoré sa líšia v scope. V oboch prípadoch (ldapsearch a ldap_search()) je bind úspešný, takže tam nie je problém.

Ešte skúsim novšiu verziu PHP (mám 5.3.3-7+squeeze26) napriek tomu privítam rady.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.5.2015 15:29 NN
Rozbalit Rozbalit vše Re: OpenLDAP ACL vs PHP ldap_search()
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kde se tam vezme to cn=manager?
21.5.2015 07:34 Marián
Rozbalit Rozbalit vše Re: OpenLDAP ACL vs PHP ldap_search()
To je tam zo strany servera. Ja tom nemám v svojom kóde. Spravil som test a doplnil vymysleného používateľa "zzz" do ACL:
access to *
    by dn.exact="cn=Manager,dc=domain,dc=tld" write
    by dn.exact="cn=zzz,dc=domain,dc=tld" read
    by users read
    by * none
a objavilo sa to v debug logoch:
May 21 07:28:03 localhost slapd[11218]: <= check a_dn_pat: cn=manager,dc=domain,dc=tld
May 21 07:28:03 localhost slapd[11218]: <= check a_dn_pat: cn=zzz,dc=domain,dc=tld
May 21 07:28:03 localhost slapd[11218]: <= check a_dn_pat: users
Inak, skúšal som PHP 5.6.9 na Windows s rovnakým neúspešným výsledkom.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.