OpenLDAP Kurulum ve Yapılandırması

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.

  1. /etc/syslog.conf dosyasına aşağıdaki satır eklenir.local4.* /var/log/ldap.log
  2. /var/log/ldap.log dosyası oluşturulur.

[root@endersysegitim ~]# touch /var/log/ldap.log

  1. 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.

http://www.endersys.com.tr

Faydalanılan Kaynaklar:

LDAP System Administration

2 Responses to “OpenLDAP Kurulum ve Yapılandırması”


Leave a Reply