EnderUnix Software Development Team

 


 

 

Giris: 

                             

03 Aralik 2001 
           

         Bu dokumanda LDAP sisteminin ne oldugu, nerelerde kullanildigi ve ornek ldap dizin yapisi anlatilacaktir. LDAP'in gercek hayatta nerelerde kullanildigina ornek vermek icin son kisimda LDAP'in gerceklestirimleri verilecektir. Yazar (Omer Faruk Sen, roots@enderunix.org ) sisteminize verilebilecek hicbir zararin sorumlulugunu kabul etmemektedir. Bu dokuman yazarin izini dahilinde hardcopy olmamak sarti ile yayinlanabilir. Bu dokumanin ana adresi ve en guncel hali  http://EnderUNIX.ORG/documents/ldap_fundamentals/ adresindedir.

 

LDAP Nedir ? 

         
         LDAP (Lightweight Directory Access Protocol) LAN hizmetlerinin yerellestirilmesi icin ortaya cikmis bir ikincil sistemdir. X.500 dizinlerinin gerektirdigi 7 katmanli OSI katmani yerine hafiflestirilmis (lightweight) olan 4 katmanli TCP/IP kullanilmistir. Sekil.1 de LDAP'in kullandigi dizinsunucu/istemci modeli verilmistir. Ornek vermek gerekirse bir sirketteki butun printerlarin, calisanlarin, demirbaslarin tutuldugu bir dizin (directory) yapisidir. Buradaki "dizin" ifadesi genelde akil karistirmaktadir.

         Sekil.1' de 

Sekil.1

         LDAP istemcisi ldap icin yazilmis ve ldap istemcisinin icine gomulmus API(Application Programming Interface)  vasitasiyla aradigi bilginin formatini olusturarak TCP/IP vasitasiyla dizin sunucusuna gonderir. Bu istegi alan dizin sunucusu bu istegi dizini iceren bilgisayari sorgulayarak (Eskiden LDAP  X.500 dizinlerineulasmak icin kullanilan bir gateway idi ve boylece LDAP sunucusu ile X.500 dizini farkli bilgisayarlarda bulunurdu. Fakat zamanla X.500'un getirdigi yuk sebebi ile dizin direk sunucunun oldugu sisteme gomulmustur) gerekli bilgiyi yine ayni yolla istemciye gonderir. 

        Genel olarak bu dizin ifadesi LDAP'in yapisi ve icerdigi bilgi itibari ile "database" olarak adlandirilmaktadir. Dizin ifadesiaslinda dizinin icerdigi belirli bir siradaki herbir nesne hakkinda bilgi veren bir listeseklinde aciklanmaktadir. LDAP yapisi genelde sarisayfalar (yellow pages) ile ozdeslestirilmektedir. Soyleki sari sayfalarda bilgi belirli bir sirada dizilmistir ve bu tip sari sayfa kataloglari bir matbaa'da basilir(ldap karsiligi write) ve daha sonra isteyen ya da izin verilen herkes bu listeden aradigini bulur. Bulunan sahisin hakkindaki bilgiler sahisin telefonunu, evadresini ... vermektedir. 

         Bu asamada dizin(directory) ve veritabani(database) arasindaki farki aciklayayim. Database  dizayinda amac hem HIZLI yazmak hemde mumkun oldugunca HIZLI okumaktir. Burada hizli yazmak daha dogrusu yazmak sistem icin ek bir yuk getirmektedir. Oysaki ldap yazilimlarinda (OpenLdap, Tivoli,iPlanet, Novell Directory Server) ana amac aranan degerin mumkun olan en kisa surede bulunmasidir. Yazmak icin sql'deki kadar yogun bir algoritma gelistirilmemistir.


         Aslinda LDAP (Lightweight Directory Access Protocol) adin da anlasilacagi uzere bir dizin degildir bir PROTOCOL'dur ve dizinlerin sorgulanmasi icin gerekli tasimanin (transport) ve tasinan mesajin formatini belirlerse de  genel olarak "ldap dizini" olarak adlandirilabilir. Daha onceden de belirttigim uzere LDAP bir X.500 dizinine (Sekil.2) 

Sekil.2

gateway olabilecegi gibi tek basina dizini sorgulayacak yapiyi icerebilir(Sekil.3). 

Sekil.3

Bu sekildeki bir LDAP sunucusuna Stand-alone ldap sunucusu denmektedir. X.500 dizinine gateway olan ldap sunucusu RFC 1777(Ldap Version 2)' de RFC 2251(Ldap V3)'de ise Sekil.3' teki yapi anlatimistir. 


LDAP dizinlerde assagidaki islemlerin yapilmasina izin verir: 

                        *Kullanicin girdigi kritere gore arama yapma (search)
                        *Bir girdi(entry) ekleme (add)
                        *Bir entry silme (delete)
                        *Bir girdiyi degistrime (modify)
                        *Distinguished name (DN)** 'i yada RDN(Relative Distinguished Name)' in
                          dizindeki yerini degistirme (modifydn)
                        *Iki entry'i karsilastirma (compare)

** DN herhangi bir entry'nin dizin agacindaki biricik yerini belirleyen ifadedir. Mesela "dn: cn=root, dc=enderunix, dc=org" . RDN ise dizindeki belirli bir kesimden baslayarak alinan dn' dir.


             LDAP'ta bilgiler DIT (Directory Information Tree) (Sekil.4)

Sekil.4

          

 denen bir agac seklindeki yapida tutulmaktadir. Ustteki resimde dikkat edilirse Directoy Root tam olarak gosterilmemistir LDAP dizininde "directory root" olmasina ragmen kullanilmaz. Bu agac tipki DNS sistemindeki agac seklindeki yapiya yada SNMP'deki MIB gibidir. DIT' deki herbir entry entry'i aciklayan bir ve/veya daha fazla "attribute" icerir ve her bir attribute bir "type" ve "value" icermektedir. Directory entry'si bazi object'leri tanimlar ve entryde kullanibilecek attribute'lari belirler. Sekil.5


Sekil.5



Bir "objectclass" bir entry icinde bulunabilecek attribute 'lari tanimlar. Bu asamada bir ldap entry'sinin ornek verelim. LDAP dizinine bu entry'ler LDIF (LDAP Data Interchange Format) dosyasi kullanilarak eklenir.. :


------ldif.txt---------

dn: cn=ofsen, ou=sysadmin, o=enderunix.org
objectclass: top
objectclass: organization
objectclass: organizationalUnit
cn: Omer Faruk Sen
ou: sysadmin
cn: ofsen
postaladdress: Somewhere in ISTANBUL
 

----------------------


     
    NOT: Ldif dosyasindaki girilecek bilgiler (dn dahil) buyuk harfe duyarli degildir. Yani windowstaki gibi buyuk harf ve kucuk harf ayni manaya gelir.

 

 

OpenLDAP' in Kurulmasi:

    1) OpenLDAP'in resmi sitesinden http://www.openldap.org/software/download/ openldap-2.0.18 indirelim.
  OpenLDAP surekli gelisen bir proje oldugu icin versiyon farkli olabilir. Nitekim yaklasik her 2 ayda bir yeni bir surum cikmaktadir.

   2) gunzip -c openldap-VERSION.tgz | tar xf -
         cd openldap-VERSION

   3) OpenLDAP'imizin ldapv3 destekli olmasi icin gerekli yazilimlar vardir bunlar:

         *OpenSSL
         *Cyrus SASL
         *BerkeleyDB yada GDBM
        

    4) ./configure --help ile derleme opsiyonlarini gorebilirsiniz. Ornek configure formati:
        
        ./configure --prefix=/usr/local/ldap --with-cyrus-sasl --with-tls --with-threads --enable-crypt --enbale-ldbm --enable-wrappers 

     Burada enable-ldbm onemli. Bunu kullanarak backend olarak ldbm kullanacagimizi belirtiyoruz. Her ne kadar bu default olsa da ldap'in bir protokol oldugunu vurgulamak icin kullandim. LDAP bir protokoldur ve cesitli backendlerle haberlesir. Ornek olarak: shell, sql, passwd, dnssrv . 

     5) make && make depend && make test && make install
   
     Ldap sunucumuz ldbm backend' ini kullanarak /usr/local/ldap dizinine kuruldu. 

OpenLDAP'in Calistirilmasi ve ornek entry'ler:

   OpenLdap paketinde ldap serverlari, ldap APIsi ve ldap client yazilimlari gelmektedir. Server olarak slapd (Standalone ldap daemon) ve slurpd (Standalone LDAP Update Replication Daemon) gelmektedir. Slurpd iki ldap server arasi data kopyalanmasi vazifesini gormektedir.

   Ldap serverimizi (slapd) baslatmadan once konfigurasyon dosyasini editleyelim. Bunun icin /usr/local/ldap/etc/openldap/slapd.conf' u kullanacagiz (yada $INSTALL_DIR/etc/openldap/slapd.conf) 

--------------------------slapd.conf-------------------------------------------------------------

##########################################################
# ldbm database definitions
##########################################################

database ldbm
#suffix "dc=-domain,dc=com"
suffix "dc=enderunix, dc=org"
#rootdn "cn=Manager,dc=my-domain,dc=com"
rootdn "cn=root,dc=enderunix, c=org"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd/tools. Mode 700 recommended.
directory /usr/local/var/openldap-ldbm

-----------------------------------slapd.conf_un sonu------------------------------------------

 

    Burada onemli olan parametreler suffix, rootdn ve rootpw'dir. Simdi slapd' imizi calistirabiliriz. 
#/usr/local/ldap/libexec/slapd -d 255                        (255 debugging icin gerekli verilmesede olur )

  Su anda ldap serverimiz calismaktadir. Ldap server'imiza entry girmeye baslayabiliriz.

 


 

Ornek Entry' ler:

 


       Ldap dizinine entry girmek icin bir ascii text dosyasina mesela "ldif.txt" Ldap dizinine ilk basta assagida girecegim entry girilmelidir. Her bir entry mutalaka bir distinguished name (dn) icermelidir. Boylece herbir entry'nin agacta tam olarak nerede duracagi belirlenir. 

 


-------------ldif.txt--------------------- 

dn: dc=enderunix, dc=org
objectclass: Top

-------------xxxxxx--------------------

 




Daha sonra diger ornek entry'lerimizi ayni ldif.txt'e girebiliriz


--------ldif2.txt----------------------

dn: o= qldapadmin, dc=enderunix, dc=org
objectclass: Top
objectclass: Organization
o: qldapadmin



dn: ou=server, ou=qldapadmin, dc=enderunix, dc=org
objectclass: Top
objectclass: OrganizationalUnit
objetclass: Organization
o: qldapadmin
ou: server

dn: ou=cluster, ou=qldapadmin, dc=enderunix, dc=org
objectclass: Top
objectclass: OrganizationalUnit
objetclass: Organization
o: qldapadmin
ou: cluster



---------xxxxx-------------

     Her bir entry'de mutlaka o entry'de kullanilan attributelarin neler olabilecegini belirleyen objectclass lar olmalidir. Assagidaki ldif2.txt' de dikkat edilirse dn: o= qldapadmin, dc=enderunix, dc=org icin objectclass olarak Organization verilmistir. Boylece attribute olarak ' o ' kullanabiliriz. (Aslinda KULLANMALIYIZ! ** MUST **). Eger Organization objectclass' ini vermeseydik ldap bize "objectclass violation" seklinde bir hata mesaji verecekti. Objectclass'larin tanimlari schema dosyalarinda verilmistir. Ek olarak objectclass'in kendisi de bir attribute' tur. Schemalar /usr/local/ldap/etc/openldap/schema dizininde bulunurlar. Bu dizinde bulunan core.schema' ya bakarsak ustteki ldif.txt ifadesi daha iyi anlasilacaktir. 

----------core.schema------------

objectclass ( 2.5.6.4 NAME 'organization' SUP top STRUCTURAL
MUST o
MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $
x121Address $ registeredAddress $ destinationIndicator $
preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
telephoneNumber $ internationaliSDNNumber $
facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )

objectclass ( 2.5.6.5 NAME 'organizationalUnit' SUP top STRUCTURAL
MUST ou
MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $
x121Address $ registeredAddress $ destinationIndicator $
preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
telephoneNumber $ internationaliSDNNumber $
facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )

----------xxxxxx------------------

 

      Dikkat edilirse her bir objectclass taniminda MAY ve MUST'lar vardir. Ussteki entry'mizde objectclass: Organization diyerek atttribute olarak "o: qldapadmin" tanimlama zorunlulugu getirilmistir. Istenirse MAY icerisindeki herhangi bir deger'de eklenebilirdi.

   Goruldugu gibi ustteki ldif2.txt icinde 3 dn var. Bu da 3 entry demektir. Sira ldif dosyalarimizi ldap dizinine import etmeye geldi :

% ldapadd -D "cn=root, dc=enderunix, dc=org" -x -W -f ldif.txt 

burada " -D " sistemin rootdn'ini yani agacta degisiklik yapma yetkisine sahip kullaniciyi belirler. " -x "  simple authentication icin kullanilir. " -W " ise sifre rootdn'in sifresinin interaktif bir sekilde sorulmasini saglar.

 


NOT: Ldif dosyasi yazarken dikkat edilmesi gereken bazi kisimlar vardir. Bunlar

1)ldif dosyasinda buyuk ve kucuk harfler ayni manaya gelmektedir (case insentitive)
2)Ldif formati ldifv1 ve ldifv2 olmak uzere iki tanedir. Bu makalede ldifv2 kullanilmistir.
3)"," den sonra bosluk gelebilir ama once gelemez (!!!) yani cn=root, dc=enderunix, dc=org olabilir ama cn=root ,dc=enderunix , dc=org olamaz. Eger kullanirsa yazilim ya hata mesaji verir; ya da bosluk karakteri ile beraber dizin'e istedigimiz biligler atilir ki bu arama sirasinda istedigimiz entry' nin bulunmamasi sonucunu verir.
4) Ldiff dosyasinin genel formati:

# comment 
dn: <distinguished name> 
    <attrdesc>: <attrvalue> 
    <attrdesc>: <attrvalue>

 

 
Simdi ise ekledigimiz entry'i dizinde aratalim bunun icin ldapsearch komutunu kullanacagiz. (ldif2.txt'e icin)


%ldapsearch -b "o=qldapadmin, dc=enderunix, dc=org" -x

 

version: 2

#
# filter: (objectclass=*)
# requesting: ALL
#

# qldapadmin, enderunix, org
dn: o=qldapadmin, dc=enderunix, dc=org
objectClass: top
objectClass: Organization
o: qldapadmin

# server, qldapadmin, enderunix, org
dn: ou=server, o=qldapadmin, dc=enderunix, dc=org
objectClass: top
objectClass: OrganizationalUnit
objectClass: Organization
o: qldapadmin
ou: server

# cluster, qldapadmin, enderunix, org
dn: ou=cluster, o=qldapadmin, dc=enderunix, dc=org
objectClass: top
objectClass: OrganizationalUnit
objectClass: Organization
o: qldapadmin
ou: cluster

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

Goruldugu gibi arama sonucunda o=qldapadmin altindaki hersey bulundu. 




 

Ldapv2 ve Ldapv3 

   

      Ldapv2 ldapv3'e gore eksikilikler icermektedir. Ornek vermek gerekirse SSL destegi LDAPv2 ile gelmemektedir. Bu destedigi ldapv2' de saglamak icin cesitli wrapper'lar kullanilabilir. Fakat ldapv3' te bu destek direk protokolde gelmektedir. Assagida Ldav3' un Ldapv2'ye ustunlukleri siralanmistir.

 

        * Ldapv3 Authentication mechanism icermektedir. Bu destek Cyrus SASL ya da mevcut diger araclarla saglanabilir.

        * Ldapv3  SSL destegi icermektedir. Istemci ve sunucu arasindaki iletisim ldapv3'un tam saglanmasi icin sifrelenmis sekilde gerceklestirilmelidir

        * LDAPv3 UTF-8 encoding destegi icermelidir. Dizinde tutulan bilgiler UTF-8 formatinda tutulur. Boylece multi-byte' li karakterler ornegin Turkce karakterler dizinde tutulabilir.

        * Ldapv3 referral destegi icermelidir. Eger bir ldap sunucusu kendisinde bulunmayan bir bilgiyi sorgulayan istemci ile temasa gecerse bu bilgileri icerebilecek baska bir ldapv3 sunucusuna client'i yonlendirebilir.

       

        Herne kadar Ldapv3 ldapv2'ye gore bircok ustunluk icersede ldapv3'un icermedigi eksiklikler vardir. Bu eksiklikleri kapatmak icin her uretici kendine gore ldap sunucularinda programlama yapmislardir. Bunlar:

         * Ldapv3 icinde ACL destegi yoktur. Boylece dizine girisi olan her kullanici butun dizini okuyabilir. LDAP yazilim ureticileri bu eksikligi kendilerine gore kapatmislardir. Mesela OpenLDAP icersinde ACL destegi vardir.

         * Ldapv3 icinde dizinlerin birden fazla dizin sunuculari arasinda kopyalanma (replication) destegi yoktur. Yine her uretici kendi cozumlerini sunmaktadir.


Linkler:

   

  1) http://www.openldap.org 
     OpenSource ldap yazilimi

  2) http://www.redbooks.ibm.com/redbooks/SG244986.html 
     IBM Understanding LDAP dokumani ayrica ayni kitabin  PDF  versiyonuda var. 

   3)LDAP Schema Resources page from Linux Center (HK) Ltd.:
     
http://ldap.hklc.com

   4)Netscape Directory Deployment Guide:
      http://home.netscape.com/eng/server/directory/3.0/deployrtm/contents.html

   5)Netscape Directory Information Tree Design:
       http://home.netscape.com/eng/server/directory/3.0/deploy/dit.htm

   6)ITU information on X.500:
      http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-X.500

   7)http://www.bayour.com/LDAPv3-HOWTO.html 
     Kapsamli bir OpenLDAP dokumani  

   8)http://www.raphinou.com/ldaps
     OpenLDAP+pam_ldap+SSL dokumani (Ldap'in coklu ortamlarda authentication icin kullanilmasi)

    9)http://blacklotus.cc.ic.ac.uk/~pjm3/solaris8_ldap.html
      http://www.bolthole.com/solaris/LDAP.html
      Solaris 8 icin ldap linkleri. Solaris kullananlar icin yararli olabilir

    10) http://www.enic.fr/people/landru/lobster/openldap/OpenLDAP-authenticating-with-PAM.txt
         WinNT domani icin OpenLDAP authenticationun kullanilmasini anlatiyor.
    

 


      

 

QLdapAdmin:

 

   
  QLDAPAdmin EnderUNIX Yazilim Gelistirme Ekibi tarafindan ldiff file'larin teker teker el ile eklenmesinin getirdigi zorluklari ortadan kaldirmak icin C++ ile yazilmis bir yazilimdir. Qmail+Ldap kurulu bir sistemde QLDAPAdmin sunlari yapabilir:

    
  • Virtual Domain yaratir

  • Yaratilan Virtual Domainleri siler

  • Virtual user yaratabilir

  • Virtual userlar uzerinde degisiklik yapabilir

  • Kullanicilarin sifresini, mailhostunu(qmail cluster icin gerekli), mail quotasini .... duzenler 

  • Mevcut mailboxlar icin alternatif adresler yaratir

  • Bir mailbox icin forwardin adresi ekleyebilir

  • Kullanicilarin bilgilerini listeler.

  • Kullanicilari LDAP dizininden silebilir.

  • Butun Qmail domainlerini listeler

  • Qmail domainleri icindeki butun kullanicilari listeleyebilir.

   QLDAPAdmin ile gelen calistirilabilir dosyalar:
  

     -r-x------ 1 root wheel 31008 Jul 2 03:33 /usr/local/bin/qadddomain
     -r-x------ 1 root wheel 44154 Jul 2 03:33 /usr/local/bin/qadduser
     -r-x------ 1 root wheel 29334 Jul 2 03:33 /usr/local/bin/qdeldomain
     -r-x------ 1 root wheel 29773 Jul 2 03:33 /usr/local/bin/qdeluser
     -r-x------ 1 root wheel 26492 Jul 2 03:33 /usr/local/bin/qlistdomains
     -r-x------ 1 root wheel 28919 Jul 2 03:33 /usr/local/bin/qlistusers
     -r-x------ 1 root wheel 47624 Jul 2 03:33 /usr/local/bin/qmodifyuser
     -r-x------ 1 root wheel 30886 Jul 2 03:33 /usr/local/bin/qpasswd
     -r-x------ 1 root wheel 30507 Jul 2 03:33 /usr/local/bin/qsetmailhost
     -r-x------ 1 root wheel 30539 Jul 2 03:33 /usr/local/bin/qsetmsgstore
     -r-x------ 1 root wheel 32122 Jul 2 03:33 /usr/local/bin/qsetquota
     -r-x------ 1 root wheel 28819 Jul 2 03:33 /usr/local/bin/quserinfo

   Ayrica QT libraryleri kullanilarak yazilmis QLDAPAdmin GUI' de mevcuttur. 
   Daha fazla bilgi icin http://www.enderunix.org/qldapadmin/ adresini ziyaret edebilirsiniz.

 

 

         Sorunlariniz icin http://www.openldap.org/lists/ adresinde yer alan mailing listesini kullanabilirsiniz. Ek olarak IBM tarafindan yayinlanan Understanding LDAP dokumanini siddetle (!) tavsiye ederiz.