[PHP] Show Group membership Novell (en nog wat vragen)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 21-09 00:11
Beste tweakers,

voor een intranet ben ik wat zaken aan het uitzoeken of het technisch haalbaar is. Zo wil ik toegangs rechten beheren via Novell NDS. Nu ben ik zelf (helaas nog) geen Novell Specialist dus sommige zaken zal ik eerst moeten doorgronden :)

Onze NDS structuur is globaal als volgt opgebouwd

code:
1
2
3
4
5
6
7
8
9
10
11
O = ORG
 OU = Beheer
 OU = Rotterdam
           OU = users
                    cn = username
            OU = servers
             OU = printers

 OU = Den Helder

 OU = Nice


Idem voor Den Helder en Nice. Er staan er nog meer in , maar dat is voor dit voorbeeld niet relevant denk ik.

Ik heb via PHP en LDAP een goed werkend authenticatie script gemaakt. Dit werkt met gebruikers waarvan ik opgegeef dat ze in ou=users,ou=rotterdam,o=org zitten.

PHP:
1
2
$ldaprdn  = "cn=".$userid.",ou=users,ou=rdam,o=ORG";   
$ldappass = $_POST['password'];


Mijn eerste prangende vraag is : Hoe kan ik nu via PHP uitlezen welke groepen deze gebruiker heeft? Ik denk zelf dat het zoiets moet gaan als volgt (maar misschien is mijn denkwijze fout)

Connect met LDAP server , authenticeer username en password , Bind met LDAP als user en query voor zijn gegevens. (Moet dit als eigen user? Of als admin?). Ik kan eigenlijk niets vinden wat me opweg helpt.. En wellicht is mijn denkwijze fout?

Mijn 2e vraag :

Is er een mogelijkheid om een username in de ORG tree op te sporen? Ik wil de volledige naam (Dus met de juiste stad of land) automatisch doorgeven aan het PHP authenticatie script omdat gebruikers dan niet hun volledige inlognaam in hoeven te vullen (bijv : .username.users.vlis.org)

Ik had zelf het volgende scriptje gemaakt (echter zonder bevredigend resultaat omdat het wel wat terug gaf , maar niet het gewenste)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
echo "<h3>LDAP query test</h3>";

$ds=ldap_connect("ip_ldap_server"); 
echo "connect result is " . $ds . "<br />";

if ($ds) { 
    echo "Binding ..."; 
    $r=ldap_bind($ds);     
                           
    echo "Bind result is " . $r . "<br />";

    $sr=ldap_search($ds, "o=ORG", "cn=a*");  
    echo "Search result is " . $sr . "<br />";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:<p>";

    for ($i=0; $i<$info["count"]; $i++) {
        echo "dn is: " . $info[$i]["dn"] . "<br />";
       
    }

    echo "Closing connection";
    ldap_close($ds);

} else {
    echo "<h4>Unable to connect to LDAP server</h4>";
}
?> 


Ik verwacht dus dat ik een query doe in de o=ORG en zoek naar alles wat er onder valt (startend met een c)

Mijn result is :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LDAP query test
Connecting ...connect result is Resource id #1
Binding ...Bind result is 1
Search result is Resource id #2
Number of entires returned is 7
Getting entries ...
Data for 7 items returned:

dn is: cn=ChangePasswordGadget,ou=WebAccess,ou=SERVERS,ou=HAMB,o=ORG
dn is: cn=ChangePasswordGadget,ou=WebAccess,ou=SERVERS,ou=NICE,o=ORG
dn is: cn=CMELER,ou=USERS,ou=HAMB,o=ORG
dn is: cn=HAMBNW Backup Queue,ou=SERVERS,ou=HAMB,o=ORG
dn is: cn=NICENW Backup Job Queue,ou=SERVERS,ou=NICE,o=ORG
dn is: cn=SMS SMDR Group,ou=SERVERS,ou=HAMB,o=ORG
dn is: cn=SMS SMDR Group,ou=SERVERS,ou=NICE,o=ORG
Closing connection


Dit is slechts 1 user die met een C begint , maar er staan er nog veel meer in (in HAMB , maar ook in Rotterdam , en andere OU's)

Wie kan me even een beetje op gang helpen?

Qua platform. De LDAP server is een Novell Netware v6.0 server en PHP draait op een IIS server met PHP 4.3.10 (ldap module is uiteraard ingeladen)

Oja , schiet me nog even een vraag te binnen :) .. Zoals je in het begin al zag is de security van het script nog niet optimaal. Nu vroeg ik me af of het volgende zin heeft :)

Even er vanuitgaande dat er geen SSL gebruikt kan worden...

• De post waarden van een invoer veld encrypted opsturen naar het verwerkings script van PHP en daar weer decoderen?

Een secured LDAP connectie is nog in de planning.. :) .. maar dit staat momenteel uit op de servers.

[ Voor 12% gewijzigd door om3ega op 25-01-2005 07:43 ]


Acties:
  • 0 Henk 'm!

  • Onno
  • Registratie: Juni 1999
  • Niet online
om3ega schreef op dinsdag 25 januari 2005 @ 07:42:
Mijn eerste prangende vraag is : Hoe kan ik nu via PHP uitlezen welke groepen deze gebruiker heeft? Ik denk zelf dat het zoiets moet gaan als volgt (maar misschien is mijn denkwijze fout)

Connect met LDAP server , authenticeer username en password , Bind met LDAP als user en query voor zijn gegevens. (Moet dit als eigen user? Of als admin?). Ik kan eigenlijk niets vinden wat me opweg helpt.. En wellicht is mijn denkwijze fout?
Het hangt af van hoe de rechten in NDS ingesteld zijn of je moet binden of niet. Als [Public] leesrechten heeft voor het groupmembership attribuut, dan hoeft dat niet. Moet dat wel, bind dan als de user zelf (dat doe je immers toch al, om te controleren of iemands wachtwoord klopt). Als je de group memberships wilt weten voordat iemad z'n wachtwoord heeft moeten intikken, maak dan een speciale proxy user aan die je gebruikt hiervoor, en die alleen die rechten krijgt die je nodig hebt. In dit geval dus leesrechten voor groupmembership. Een admin user gebruiken is onveilig omdat je het wachtwoord dan in je script zult moeten opslaan, en omdat als er een bug in je script zit waardoor de query wat aan te passen is, mensen mogelijk meer informatie terugkrijgen dan eigenlijk zou moeten kunnen.
Is er een mogelijkheid om een username in de ORG tree op te sporen? Ik wil de volledige naam (Dus met de juiste stad of land) automatisch doorgeven aan het PHP authenticatie script omdat gebruikers dan niet hun volledige inlognaam in hoeven te vullen (bijv : .username.users.vlis.org)

Ik had zelf het volgende scriptje gemaakt (echter zonder bevredigend resultaat omdat het wel wat terug gaf , maar niet het gewenste)

PHP:
1
    $sr=ldap_search($ds, "o=ORG", "cn=a*");

Ik verwacht dus dat ik een query doe in de o=ORG en zoek naar alles wat er onder valt (startend met een c)
Dat zou moeten werken om alle objecten beginnend met een a te vinden, waarvoor je compare rechten hebt op het CN attribuut. Het is goed mogelijk dat je dat standaard niet op alle objecten hebt.
Oja , schiet me nog even een vraag te binnen :) .. Zoals je in het begin al zag is de security van het script nog niet optimaal. Nu vroeg ik me af of het volgende zin heeft :)

Even er vanuitgaande dat er geen SSL gebruikt kan worden...

• De post waarden van een invoer veld encrypted opsturen naar het verwerkings script van PHP en daar weer decoderen?
Dat heeft geen zin. Gewoon SSL op je webserver. :)
Een secured LDAP connectie is nog in de planning.. :) .. maar dit staat momenteel uit op de servers.
SSL/TLS aanzetten in NDS is een fluitje van een cent, dus zorg ervoor dat dat gebeurt.

Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 21-09 00:11
Bedankt voor je reactie Onno

Ik heb net met de beheerder van de Novell server gesproken. SSL op de NDS gaat aangezet worden.

SSL op de webserver zal ook wel lukken :)

Ok , ik heb nog even wat gechecked..

Via een LDAP Browser kan ik een anonymous bind doen op de NDS. Hier kan ik alle users op alle levels zien. (in ieder geval de username). Tot aan de ORG (top) container toe.

Voor mij is het logisch om te denken dat ik dan ook zonder al te veel problemen een search moet kunnen doen (als anonymous) om zo de juiste context bij een user te zoeken (welke OU's valt hij onder)

Dit is namelijk de eerste stap van mijn login procedé. Ik wil niet dat users een volledige username inclusief alle OU's en O's in hoeven te vullen , maar dat het PHP script wel uitzoekt waar deze user is aangemaakt.

Overigens heb ik het zoek script iets aangepast... en het werkt nu wel goed . (maar niet op de manier zoals ik het wil)

PHP:
1
$sr=ldap_search($ds, "O=ORG", "(sn=c*)");


Geeft (volgens mij) alle users weer waarvan de achternaam met een C begint. (Ook die in de beheer container) ...

Dus anonymous bind kan dus wel degelijk zoeken ... maar waarom niet op username?
Hoe kom ik er achter of de username wel echt in de CN staat opgeslagen? De LDAP browser zegt dat wel , maar is dat ook zo? Zijn er nog alternatieven?

[ Voor 6% gewijzigd door om3ega op 25-01-2005 10:00 ]


Acties:
  • 0 Henk 'm!

  • Onno
  • Registratie: Juni 1999
  • Niet online
om3ega schreef op dinsdag 25 januari 2005 @ 09:48:
Dus anonymous bind kan dus wel degelijk zoeken ...
Het gaat er niet om of ie kan zoeken of niet, maar of ie op een bepaald attribuut kan zoeken of niet.
maar waarom niet op username?
Misschien heeft [Public] geen compare rechten op CN maar wel op SN. Met alleen leesrechten ben je er niet, als je wilt zoeken op deze manier. Dat de browser wel alles laat zien betekent alleen maar dat je in ieder geval leesrechten voor sommige dingen hebt. (kun je echt het CN attribuut zien? dan heb je daar leesrechten op.. zie je alleen maar wat CN is doordat CN opgenomen is in de DN? dan is dat zelfs nog maar de vraag :))
Hoe kom ik er achter of de username wel echt in de CN staat opgeslagen?
Dat is zo. Daar hoef je niet aan te twijfelen.

[ Voor 15% gewijzigd door Onno op 25-01-2005 11:46 ]