
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, [email protected]
) 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 (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.
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.
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 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 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. |