Endersys Sistem Ekibi olarak bilgi paylaşımına blog platformumuzda devam ediyoruz. Çok yakın zamanda yeni makaleleri bu sayfa görebilirsiniz.
1 OpenLDAP Sunucu
1.1 LDAP Nedir?
LDAP (Lightweight Directory Access Protocol : Hafif Dizin Erişim Protokolü)
Dizin ifadesi LDAP’in yapısı ve içerdigi bilgi itibari ile “veritabanı” olarak adlandırılmaktadır. LDAP’da ana amaç aranan verinin mümkün olan en kısa sürede bulunmasıdır. LDAP’da veriler hiyerarşik nesneler şeklindedir. LDAP nesneleri entry adı verilir. TCP üzerinden X.500 Dizin Servislerine erişmek için tasarlandı. En güncel LDAP protokol sürümü LDAPv3’dür. 1990’dan itibaren bu sürüm kullanılmaktadır.
Klasik bir LDAP ağacı aşağıdaki gibidir.
1.2 Niçin LDAP ?
- Kullanıcı bilgileri,Grup bilgileri vb bilgilerin merkezi yönetimi.
- Kullanıcıların aradıkları bilgiye hızlı ve kolay ulaşım.
- Dağıtık mimariye uygun.
- Her sistemde kullanılabilir.
1.3 Nerelerde LDAP Kullanabilirim ?
- Sunucu ve kullanıcı yetkilendirmesinde
- Kullanıcı ve sistem gruplarında
- Adres,Telefon defteri uygulamalarında
- Organizasyon yapısında
- Uygulama bilgilerinin saklanmasında
1.4 LDAP ile Veritabanı Arasındaki Farklar
- LDAP özel amaçlı bir veritabanı gibi düşünülebilir.
- Veritabanları hem okuma hemde yazmaya karşı optimize edilmiştir.
- LDAP okuma/arama özellikleri yazma özelliklerine göre çok daha gelişkindir.
- Veritabanları komplex işlemleri (rollback,transaction) destekler.
- LDAP komplex veritabanı işlemlerini desteklemez.
- LDAP sunucular göreceli statik bilgiler saklarken, Veritabanı sunucuları dinamik veriler saklarlar.
- LDAP standartlar üzerine kurulmuştur.Bir LDAP istemcisi tüm LDAP sunuculara erişebilir.
- Farklı veritabanı araçları sadece kendi ürünlerine erişmek için kullanılabilir.
1.5 LDAP Temelleri
1.5.1 LDIF Nedir ?
LDIF’in açılımı: LDAP Data Interchange Format
- LDAP kayıtları düz metin formatında sunulur.
- Veri değişiklerini kolaylaştırır.
- Okunabilir bir formata sahiptir.
- Betikler ve çeşitli araçlar ile hazırlanabilir,aktarılabilir vs..
- Yedekleme ve başka bir sisteme aktarma işlemleri yapılabilir
1.5.2 LDAP Şema(Schema) Nedir?
- Dizinde saklanacak verinin türünü ve yapısını belirten kurallar bütünü.
- Veritabanındaki tablo yapısı benzer denilebilir.
- Veri bütünlüğü, uyumluluk sağlar
- Benzer veriler girilmesini ve kaynak israfını engeller
- Uygulamalar için kolaylık sağlar
- Object class özelliği kaydın uyması,takip etmesi gereken kuralları, şemalar da objectclass’ların izlemesi gereken kuralları belirler.
Bir şema aşağıdakileri içermelidir:
- Gerekli özellikler
- İzin verilen özellikler
- Özellikler nasıl karşılaştırılacak
- Özelliğin saklayacağı veri ve veri tipi kısıtlama getirebilir
Ön tanımlı Şemalar Aşağıdaki gibidir:
- corba.schema
- cosine.schema
- core.schema
- openldap.schema
- inetorgperson.schema
- java.schema
- misc.schema
- nis.schema
Örnek bir şema kaydı(inetorgperson.schema):
# displayName
# When displaying an entry, especially within a one-line summary list, it
# is useful to be able to identify a name to be used. Since other attri-
# bute types such as ‘cn’ are multivalued, an additional attribute type is
# needed. Display name is defined for this purpose.
attributetype ( 2.16.840.1.113730.3.1.241
NAME ‘displayName’
DESC ‘RFC2798: preferred name to be used when displaying entries’
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE )
# employeeNumber
# Numeric or alphanumeric identifier assigned to a person, typically based
# on order of hire or association with an organization. Single valued.
attributetype ( 2.16.840.1.113730.3.1.3
NAME ‘employeeNumber’
DESC ‘RFC2798: numerically identifies an employee within an organization’
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE )
1.5.3 Attributes(Özellikler)
attributetype ( 2.5.4.6 NAME ( ‘c’ ‘countryName’ )
DESC ‘RFC2256: ISO-3166 country 2-letter code’
SUP name SINGLE-VALUE )
attributetype ( 2.5.4.29 NAME ‘presentationAddress’
DESC ‘RFC2256: presentation address’
EQUALITY presentationAddressMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 SINGLE-VALUE )
Bir attr ibute aşağıdaki alanlardan oluşur.
Name : Tekildir(unique), büyük-küçük harf duyarlılığı yoktur.
Object Identifier (OID) : Aralarında nokta olan sayılar dizisi
Attribute Sentaksı aşağıdaki değerler ve kontroller içerir:
- Saklanabilecek veri özellikleri
- Kontrol ve Karşılaştırmalar nasıl yapılacak
- Tekil Değer(Single Value) veya Çoklu Değer(Multiple Value)
OID Şeması
Bazı Attribute’lar:
- uid – User id
- cn – Common Name
- sn – Surname
- mail – Mail Address
- l – Location
- ou – Organisational Unit
- dc – Domain Component
- c – Country
1.5.4 ObjectClass
LDAP : Lightweight Directory 27 Access Protocol
Özelliklerde ne tip bilgiler ve bu bilgilerin hangi formatta olacağını belirler. Her bir objectclass entry’de tutulacak veriler için bir template görevi görür. Entry’de olması gereken zorunlu attributes ve tercihe bağlı attributes’leri tanımlar.
Bir kayıt icin birden fazla Objectclass olabilir.
Hangi objectclass’ların kullanılabileceği şemalar (schema) ile belirlenir.
Bazı objectclass’lar:
- account
- posixAccount
- posixGroup
- shadowAccount
- top
- organizationalUnit
organizationalUnit objectclass’ı (core.schema)
objectclass ( 2.5.6.5 NAME ‘organizationalUnit’
DESC ‘RFC2256: an organizational unit’
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 ) )
MUST: Zorunlu olan attributelar
MAY: Tercihe bağlı(optional) attribute’lar
SUP: Parent Object
ObjectClass Türleri
Structural Object Class: Person veya organizationalUnit gibi gerçek nesneleri ifade eder.
Auxiliary(Yardımcı) Object Class: Structural Object Class’a bazı karakteristikler ekler. Bunlar tek başlarına kullanılamazlar. Sadece structural object class’ları tamamlar. Örnek: simpleSecurityObject, mailRecipient ve cacheObject
Abstract Object Class: Yazılım dillerinde olduğu gibi abstract işlevini yapar. Örnek: top
1.5.5 DN(Distinguished Name)
Saklanan her bir veriye ait tekil tanımlayıcıya verilen ad. Bir veritabanı tablosundaki unique alan olarak düşünülebilir. Örnek bir dn değeri aşağıdaki gibidir:
dn: uid=ismail, ou=system, dc=endersys, dc=com
1.6 OpenLDAP Kurulumu
Ön tanımlı olarak tüm Linux dağıtımlarında OpenLDAP gelmektedir. En güncel ve kararlı sürümü şu anda 2.4’dür. Linux kurulumu sırasında paket olarak seçebileceğiniz gibi internet bağlantısı olan bir Linux’te aşağıdaki komutla OpenLDAP’ı kurabilirsiniz.
# yum install openldap*
Kurulu OpenLDAP paketlerini ise aşağıdaki komutla görebilirsiniz.
# rpm -qa |grep openldap
openldap-2.3.43-3.el5
openldap-servers-2.3.43-3.el5
openldap-servers-sql-2.3.43-3.el5
openldap-devel-2.3.43-3.el5
compat-openldap-2.3.43_2.2.29-3.el5
openldap-clients-2.3.43-3.el5
openldap-servers-overlays-2.3.43-3.el5
1.7 Temel Konfigürasyon
vi /etc/openldap/slapd.conf
#
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/dnszone.schema
# Allow LDAPv2 client connections. This is NOT the default.
allow bind_v2
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
loglevel 256
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database bdb
suffix “dc=deneme,dc=com”
rootdn ”cn=root,dc=deneme,dc=com”
# Cleartext passwords, especially for the rootdn, should
# be avoided. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# rootpw {crypt}ijFYNcSNctBYg
directory /var/lib/ldap
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
#slapd.conf dosyasının sonu
slapd.conf Değişkenleri:
include: Dahil edilecek şema dosyalarını belirtir.
loglevel: Log tutma seviyesini belirtir. Tüm log seviyeleri aşağıdaki gibidir.
|
Level |
Information recorded |
| -1 | All logging information |
| 0 | No Logging information |
| 1 | Trace function calls |
| 2 | Packet-handling debugging information |
| 4 | Heavy trace debugging |
| 8 | Connection management |
| 16 | Packets sent and received |
| 32 | Search filter processing |
| 64 | Configuration file processing |
| 128 | Access control list processing |
| 256 | Statistics for connection, operations, and results |
| 512 | Statistics for results returned to clients |
| 1024 | Communication with shell backends |
| 2048 | Print entry parsing debug information |
database: Kullanılacak veritabanı tipini belirtir. Ön tanımlı olarak bdb(Berkeley DB transactional backend) kullanılır.
suffix: Hizmet verilecek LDAP ağacını belirler.
rootdn: UNIX sistemlerindeki superuser gibi tüm LDAP kayıtlarında işlem yetkisine sahip kullanıcıyı ifade etmektedir.
Buradaki dc ifadesi “domain context” anlamına gelmektedir.
rootpw:root parolasını belirler. Yukarıdaki gibi düz metin olduğu gibi parolanın şifrelenmiş halide yazılabilir. Slapasswd komutu ile şifrelenmiş parola üretebilirsiniz.
[root@endersysegitim ~]# slappasswd
New password:
Re-enter new password:
{SSHA}Ue4ZyZyxQfkrs0CalEHESLnbXelZ6Z82
[root@endersysegitim ~]# slappasswd -h {CRYPT}
New password:
Re-enter new password:
{CRYPT}FE2cKmGfb9/zc
directory: LDAP kayıtlarının tutulacağı dizini belirtir.
index :slapd servisinin indekslerini belirtir. Veritabanında olduğu gibi burada da indeksler gibi arama performansını artırmak için kullanılır.
- approx (approximate): Yaklaşık arama
- eq (equality): Eşit
- pres (presence): Var olup olmamasına göre indeks.
- sub (substring): İçeren.
LDAP loglarını LOCAL4 öncelik değeri ile syslog üzerinden tutar. LDAP loglarını görmek için aşağıdaki işlemler yapılır.
- /etc/syslog.conf dosyasına aşağıdaki satır eklenir.local4.* /var/log/ldap.log
- /var/log/ldap.log dosyası oluşturulur.
[root@endersysegitim ~]# touch /var/log/ldap.log
- Syslog ve ldap servisleri restart edilir.
[root@endersysegitim ~]# /etc/init.d/syslog restart ; /etc/init.d/ldap restart
[root@endersysegitim ~]# tail -f /var/log/ldap.log
Oct 8 02:08:46 egitim slapd[11494]: config_build_entry: “olcDatabase={1}bdb”
Oct 8 02:08:46 egitim slapd[11494]: backend_startup_one: starting “dc=deneme,dc=com”
Oct 8 02:08:46 egitim slapd[11494]: bdb_db_open: dc=deneme,dc=com
Oct 8 02:08:46 egitim slapd[11494]: bdb_db_open: dbenv_open(/var/lib/ldap) Oct 8 02:08:46 egitim slapd[11494]: slapd starting
Oct 8 02:08:46 egitim slapd[11494]: daemon: added 4r listener=(nil) Oct 8 02:08:46 egitim slapd[11494]: daemon: added 7r listener=0x82fb520 Oct 8 02:08:46 egitim slapd[11494]: daemon: added 8r listener=0x82fb5f8 Oct 8 02:08:46 egitim slapd[11494]: daemon: epoll: listen=7 active_threads=0 tvp=NULL
Oct 8 02:08:46 egitim slapd[11494]: daemon: epoll: listen=8 active_threads=0 tvp=NULL
1.8 OpenLDAP Bileşenleri
Sunucu Programları:
- /usr/sbin/slapd: LDAP Sunucu programı
- /usr/sbin/slurpd: LDAP Replikasyon yardımcısı
İstemci Programları:
- /usr/bin/ldapadd: LDAP’a kayıt ekleme programı
- /usr/bin/ldapmodify: Kayıt güncelleme programı
- /usr/bin/ldapdelete: LDAP’tan kayıt silme programı
- /usr/bin/ldapsearch: Kayıt arama programı
- /usr/sbin/slapadd: LDIFF formatındaki veriyi doğrudan backend dosyalarına yazar.
- /usr/sbin/slapcat: Veritabanından direkt LDIFF formatında dosya oluşturur.
1.9 OpenLDAP ACL(Access Control List)
1.9.1 Bağlantı kuranları ifade eden ACL değişkenleri:
- * : Anonim erişim dahil tüm bağlantı kuran kullanıcıları ifade eder.
- self : Başarılı bir şekilde bağlantı kurmuş(yetkilendirilmiş) kullanıcının kendisini ifade eder.
- anonymous: Yetkilendirme(authentication) yapılmamış kullanıcı bağlantıları
- users : Yetkilendirme yapmış kullanıcı bağlantıları
1.9.2 Erişim Seviyeleri
- write: Attribute’ı güncelleme hakkı
- read: Arama sonuçlarını okuma hakkı
- search: Arama hakkı
- compare: Karşılaştırma hakkı
- auth: Yetkilendirme hakkı
- none: Erişim yok.
Örnekler:
Tüm herkese okuma hakkı:
access to *
by * read
access to *
by self write (Kullanıcı kendi bilgilerini güncelleyebilir)
by users read (Yetkilendirme yapmış kullanıcılar kayıtları okuyabilir)
by * none (Geri kalan tüm kullanıcılara erişimi engelle,anonymous)
access to attrs=userPassword
by dn=”cn=root,dc=deneme,dc=com” write
(root userPassword alanını değiştirebilir)
by self write (Kullanıcı kendi parolasını değiştirebilir.)
by * auth (Geri kalanlar oturum açmak zorundadır. userPassword bilgisini okuyamaz ve yazamazlar)
1.10 OpenLDAP’ın Başlatılması
[root@endersysegitim ~]# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[root@endersysegitim ~]# chown ldap /var/lib/ldap/DB_CONFIG
[root@endersysegitim ~]# /etc/init.d/ldap start
Checking configuration files for slapd: config file testing succeeded
[ OK ]
Starting slapd: [ OK ]
[root@endersysegitim ~]# ldapadd -x -D”cn=root,dc=deneme,dc=com” -w secret -f ilk.ldiff
adding new entry “dc=deneme, dc=com”
[root@endersysegitim ~]# ldapsearch -x -b ‘dc=deneme,dc=com’ ‘(objectclass=*)’
# extended LDIF
#
# LDAPv3
# base <dc=deneme,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# deneme.com
dn: dc=deneme,dc=com
objectClass: dcObject
objectClass: organization
o: deneme ltd
dc: deneme
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
LDAP verileri LDAP servisi çalışmasa bile slapcat komutu ile listelenebilir.
[root@endersysegitim ldap]# slapcat
dn: dc=deneme,dc=com
objectClass: dcObject
objectClass: organization
o: deneme ltd
dc: deneme
structuralObjectClass: organization
entryUUID: f3f519f4-453f-102e-8283-79f25680c01c
creatorsName: cn=root,dc=deneme,dc=com
createTimestamp: 20091004144258Z
entryCSN: 20091004144258Z#000000#00#000000
modifiersName: cn=root,dc=deneme,dc=com
modifyTimestamp: 20091004144258Z
[root@endersysegitim ldap]# cat ou.ldif
dn: ou=people, dc=deneme, dc=com
ou: people
objectClass: organizationalUnit
dn: ou=users, dc=deneme, dc=com
ou: users
objectClass: organizationalUnit
[root@endersysegitim ldap]# ldapadd -x -D”cn=root,dc=deneme,dc=com” -f ou.ldif –W
Enter LDAP Password:
adding new entry “ou=people, dc=deneme, dc=com”
adding new entry “ou=users, dc=deneme, dc=com”
# cat user.ldiff
dn: cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com
cn: Ismail YENIGUL
sn: YENIGUL
mail: ismail.yenigul@endersys.com
labeledURI: http://www.endersys.com
roomNumber: 123 Golbasi Teknokent
departmentNumber: Engineering
telephoneNumber: 123-555-2345
mobile: 0533-747-3665
objectclass: inetOrgPerson
# ldapadd -x -D”cn=root,dc=deneme,dc=com” -w secret -f user2.ldiff
adding new entry “cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com”
#ldapsearch -x -b ‘dc=deneme,dc=com’ ‘(mail=*)’
# Ismail YENIGUL, people, deneme.com
dn: cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com
cn: Ismail YENIGUL
sn: YENIGUL
mail: ismail.yenigul@endersys.com
labeledURI: http://www.endersys.com
roomNumber: 123 Golbasi Teknokent
departmentNumber: Engineering
telephoneNumber: 123-555-2345
mobile: 0533-747-3665
objectClass: inetOrgPerson
# Cenk IZANLI, people, deneme.com
dn: cn=Cenk IZANLI,ou=people,dc=deneme,dc=com
cn: Cenk IZANLI
sn: IZANLI
mail: cenk.izanli@endersys.com
labeledURI: http://www.endersys.com
roomNumber: 124 Golbasi Teknokent
departmentNumber: Support Team
telephoneNumber: 123-567-8915
mobile: 0533-747-3666
objectClass: inetOrgPerson
# ldapsearch -x -b ‘dc=deneme,dc=com’ ‘(mail=ismail.yenigul@endersys.com)’ telephoneNumber mobile
# Ismail YENIGUL, people, deneme.com
dn: cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com
telephoneNumber: 123-555-2345
mobile: 0533-747-3665
# cat update.ldif
dn: cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com
changetype: modify
delete: mail
mail: ismail.yenigul@endersys.com
-
add: mail
mail: ismail.yenigul@endersys.com.tr
# ldapmodify -x -D”cn=root,dc=deneme,dc=com” -w secret -v -f update.ldif
ldap_initialize( <DEFAULT> )
delete mail:
ismail.yenigul@endersys.com
add mail:
ismail.yenigul@endersys.com.tr
modifying entry “cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com”
modify complete
# cat update2.ldif
dn: cn= Ismail YENIGUL,dc=deneme,dc=com
changetype: modify
replace: mail
mail: yenimail@deneme.com
-
add: title
title: Proce Yoneticisi
-
add: jpegPhoto
jpegPhoto:< file:///tmp/afili.jpeg
-
delete: mobile
-
# cat delete.ldif
cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com
# ldapdelete -x -D”cn=root,dc=deneme,dc=com” -w secret -v -f delete.ldif
ldap_initialize( <DEFAULT> )
deleting entry “cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com”
Aynı kayıt ldapmodify komutu ile aşağıdaki şekilde silinebilir.
# cat delete2.ldiff
dn: cn=Ismail YENIGUL,ou=people,dc=deneme,dc=com
changetype: delete
# ldapmodify -x -D”cn=root,dc=deneme,dc=com” -w secret -v -f update2.ldif
1.11 LDAP SSL/TLS
[root@endersysegitim]# cd /etc/pki/tls/certs/
[root@endersysegitim]# mv slapd.pem slapd.pem.yedek
[root@endersysegitim]# make slapd.pem
# chown ldap:ldap slapd.pem
# vi /etc/openldap/slapd.conf
TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
TLSCertificateFile /etc/pki/tls/certs/slapd.pem
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem
[root@endersysegitim]# /etc/init.d/ldap restart
# netstat -na |grep LISTEN
….
tcp 0 0 :::389 :::* LISTEN
tcp 0 0 :::636 :::* LISTEN
[root@endersysegitim]# openssl s_client -connect localhost:636 -showcerts
CONNECTED(00000003)
depth=0 /C=TR/ST=Marmara/L=Ankara/O=My Company Ltd/CN=ldap.server.com
verify error:num=18:self signed certificate
Not: Bu yazı Endersys Sistem Destek ekibi tarafından hazırlanmıştır. Referans gösterilmek şartıyla başka sitelerde yayınlanabilir.
Faydalanılan Kaynaklar:
- Addison Wesley, Understanding and Deploying LDAP Directory Services
- Oreilly, LDAP System Admistration
- OpenLDAP 2.4 Admin Guide
- www.enderunix.org/docs/ldap_fundamentals/
- http://www.erhanekici.com/files/LDAP_Protokolu_15052004.pdf
- http://www.ahmetorhan.com/openldap.pdf
- http://download.cizgi.com.tr/akademi/355/ldap.pdf
| LDAP System Administration |

Güzel bir kaynak olmuş. Bunun gibi belgelendirmeler için blog yerine wiki kullansanız daha derli toplu olmaz mı?
Bu bilgilendirici yazı için teşekkürler. Kesinlikle sık kullanılanlarımda yer alacak bir site. Tebrikler.