LDAP ile Merkezi Kullanıcı Yönetimi

On kişilik bir şirkette kullanıcı yönetimi yapmak zor değil. Ama 50, 100, 500 kullanıcı olunca ve bunların farklı sunuculara, farklı servislerekişmesi gerekince iş çığından çıkıyor. Her sunucuda ayrı ayrı kullanıcı açmak, şifre değişikliklerini takip etmek, işten ayrılan birinin tüm sistemlerdeki erişimini kapatmak… Bunlar sysadmin’in kabusu. LDAP tam da bu noktada devreye giriyor: tek bir yerden tüm kullanıcıları yönet, değişiklik her yere anında yansısın.

LDAP Nedir ve Neden Önemlidir

LDAP (Lightweight Directory Access Protocol), dizin servisleri için kullanılan bir protokoldür. Ağ üzerindeki kullanıcılar, gruplar, bilgisayarlar gibi kaynakların merkezi bir veritabanında tutulmasını ve sorgulanmasını sağlar. Microsoft’un Active Directory’si de arka planda LDAP kullanır, bu yüzden kavramlar aslında birbiriyle oldukça yakın.

Linux dünyasında en yaygın kullanılan LDAP implementasyonu OpenLDAP‘tir. Açık kaynaklı, ücretsiz ve kurumsal ortamlarda yıllardır kendini kanıtlamış bir çözüm. Buna alternatif olarak FreeIPA da son yıllarda ciddi popülerlik kazandı; ancak bu yazıda OpenLDAP üzerinden ilerleyeceğiz.

LDAP’ın sağladığı avantajlar:

  • Merkezi yönetim: Kullanıcıyı bir kez oluştur, tüm sistemlerde geçerli olsun
  • Tek oturum açma (SSO) altyapısı: Kerberos ile birleştirildiğinde tam SSO mümkün
  • Kolay denetim: Kim nereye erişti, hangi gruba üye, tek noktadan görülebilir
  • Hızlı devre dışı bırakma: İşten ayrılan birini saniyeler içinde tüm sistemlerden kopar
  • Grup tabanlı yetkilendirme: sudo hakları, servis erişimleri grup üyeliğiyle kontrol altında

OpenLDAP Sunucu Kurulumu

Ubuntu/Debian tabanlı sistemlerde başlayalım:

sudo apt-get update
sudo apt-get install -y slapd ldap-utils

# Kurulum sırasında admin şifresi sorulur
# Sonradan tekrar yapılandırmak için:
sudo dpkg-reconfigure slapd

dpkg-reconfigure slapd komutu sizi interaktif bir kurulum sihirbazına alır. Burada dikkat etmeniz gerekenler:

  • DNS domain adı: sirket.local veya gerçek domain adınız, örneğin ornekfirma.com
  • Organization name: Şirket adınız
  • Admin şifresi: Güçlü bir şifre seçin, bunu kaybederseniz işler zorlaşır
  • Database backend: MDB seçin, modern ve performanslı

Kurulum sonrası servis durumunu kontrol edin:

sudo systemctl status slapd
sudo systemctl enable slapd

# Temel bağlantı testi
ldapsearch -x -H ldap://localhost -b "dc=ornekfirma,dc=com" -D "cn=admin,dc=ornekfirma,dc=com" -W

Bu komut şifre sorarak LDAP dizinine bağlanır ve tüm girişleri listeler. Boş bir dizin döndüyse her şey yolunda demektir.

LDAP Dizin Yapısı

LDAP hiyerarşik bir yapıya sahiptir. Bunu şöyle düşünebilirsiniz: dosya sistemi gibi, ama kullanıcılar ve gruplar için. Her giriş DN (Distinguished Name) ile tanımlanır.

Tipik bir kurumsal LDAP yapısı şöyle görünür:

dc=ornekfirma,dc=com
├── ou=People          (kullanıcılar)
│   ├── uid=ahmet
│   ├── uid=mehmet
│   └── uid=ayse
├── ou=Groups          (gruplar)
│   ├── cn=sysadmin
│   ├── cn=developers
│   └── cn=finance
└── ou=Sudo            (sudo politikaları)
    └── cn=sysadmin

Bu yapıyı oluşturmak için LDIF (LDAP Data Interchange Format) dosyaları kullanılır. Temel OU’ları ekleyelim:

cat > base_structure.ldif << 'EOF'
# People OU
dn: ou=People,dc=ornekfirma,dc=com
objectClass: organizationalUnit
ou: People

# Groups OU
dn: ou=Groups,dc=ornekfirma,dc=com
objectClass: organizationalUnit
ou: Groups

# Sudo OU
dn: ou=Sudo,dc=ornekfirma,dc=com
objectClass: organizationalUnit
ou: Sudo
EOF

ldapadd -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -f base_structure.ldif

Kullanıcı ve Grup Oluşturma

Şimdi gerçek kullanıcılar ekleyelim. Önce şifre hash’i oluşturalım:

# Şifre hash'i oluştur
slappasswd -s "KullanicisifRe123!"
# Çıktı: {SSHA}xxxxxxxxxxxxxxxxxx şeklinde olacak

Kullanıcı LDIF dosyası hazırlayalım:

cat > add_user.ldif << 'EOF'
dn: uid=ahmet.yilmaz,ou=People,dc=ornekfirma,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: ahmet.yilmaz
cn: Ahmet Yilmaz
sn: Yilmaz
givenName: Ahmet
mail: [email protected]
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/ahmet.yilmaz
loginShell: /bin/bash
userPassword: {SSHA}buraya_slappasswd_ciktisini_yapistirin
shadowLastChange: 0
shadowMax: 90
shadowWarning: 7
EOF

ldapadd -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -f add_user.ldif

Burada uidNumber değerinin önemli olduğunu vurgulayayım. 1000 altı sistem kullanıcıları için ayrılmıştır. Önerdiğim yaklaşım, LDAP kullanıcıları için 10000’den başlamak. Bu sayede yerel kullanıcılarla çakışma yaşanmaz.

Grup oluşturma:

cat > add_group.ldif << 'EOF'
dn: cn=sysadmin,ou=Groups,dc=ornekfirma,dc=com
objectClass: posixGroup
cn: sysadmin
gidNumber: 20001
memberUid: ahmet.yilmaz
memberUid: mehmet.demir

dn: cn=developers,ou=Groups,dc=ornekfirma,dc=com
objectClass: posixGroup
cn: developers
gidNumber: 20002
memberUid: ayse.kaya
memberUid: can.ozturk
EOF

ldapadd -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -f add_group.ldif

İstemci Sunucularda LDAP Yapılandırması

Sunucuyu kurduk, ama asıl iş şimdi başlıyor: diğer Linux sunucuların bu LDAP’e bağlanmasını sağlamak. Bu iş için iki farklı yöntem var: SSSD (System Security Services Daemon) veya eski usul nss-ldap + pam_ldap ikilisi. Kesinlikle SSSD kullanın, hem daha güvenli hem de önbelleğe alma (caching) özelliği sayesinde LDAP sunucu geçici olarak erişilemez olsa bile kullanıcılar sisteme girmeye devam edebilir.

İstemci paketi kurulumu:

# Ubuntu/Debian
sudo apt-get install -y sssd sssd-ldap ldap-utils

# RHEL/CentOS/Rocky Linux
sudo dnf install -y sssd sssd-ldap openldap-clients

SSSD yapılandırma dosyası hazırlayalım:

sudo cat > /etc/sssd/sssd.conf << 'EOF'
[sssd]
services = nss, pam, sudo
config_file_version = 2
domains = ornekfirma.com

[domain/ornekfirma.com]
id_provider = ldap
auth_provider = ldap
sudo_provider = ldap

ldap_uri = ldap://192.168.1.10
ldap_search_base = dc=ornekfirma,dc=com
ldap_user_search_base = ou=People,dc=ornekfirma,dc=com
ldap_group_search_base = ou=Groups,dc=ornekfirma,dc=com
ldap_sudo_search_base = ou=Sudo,dc=ornekfirma,dc=com

ldap_default_bind_dn = cn=readonly,dc=ornekfirma,dc=com
ldap_default_authtok = readonly_sifre

ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/ssl/certs/ldap-ca.pem

# Önbellek ayarları
cache_credentials = true
krb5_store_password_if_offline = true

# Kullanıcı home dizini otomatik oluşturulsun
fallback_homedir = /home/%u
default_shell = /bin/bash

[nss]
homedir_substring = /home
EOF

sudo chmod 600 /etc/sssd/sssd.conf
sudo systemctl enable --now sssd

Bir önemli nokta: ldap_default_bind_dn için readonly bir kullanıcı kullanın. Admin hesabı bilgilerini istemci sunuculara dağıtmak güvenlik açığı yaratır. LDAP sunucuda ayrı bir readonly bağlama hesabı oluşturun.

Home dizinlerinin otomatik oluşturulması için PAM yapılandırması:

# Ubuntu/Debian
sudo pam-auth-update --enable mkhomedir

# RHEL/CentOS
sudo authselect select sssd with-mkhomedir --force

TLS ile Güvenli LDAP Bağlantısı

Şifreler ağ üzerinden şifresiz geçmemeli. Mutlaka TLS yapılandırın:

# Sertifika oluştur (production'da gerçek CA kullanın)
sudo openssl req -new -x509 -nodes -out /etc/ldap/ldap.crt 
  -keyout /etc/ldap/ldap.key -days 3650 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=OrnekFirma/CN=ldap.ornekfirma.com"

sudo chown openldap:openldap /etc/ldap/ldap.crt /etc/ldap/ldap.key
sudo chmod 640 /etc/ldap/ldap.key

# TLS yapılandırmasını LDAP'e uygula
cat > tls_config.ldif << 'EOF'
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/ldap.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ldap.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ldap.key
EOF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls_config.ldif

LDAPS (port 636) yerine STARTTLS kullanmanızı öneririm; daha modern ve esnek bir yaklaşım. İstemci tarafında sssd.conf’ta ldap_id_use_start_tls = true eklemek yeterli.

Sudo Yetkilendirmesi LDAP Üzerinden

Bu kısım birçok sysadmin’in gözden kaçırdığı ama çok güçlü bir özellik. Sudo kurallarını da LDAP’te saklayabilirsiniz. Böylece bir kullanıcıya sudo yetkisi vermek için her sunucuya girip sudoers dosyasını düzenlemenize gerek kalmaz.

LDAP’e sudo schema yükleyelim:

# sudo schema'yı yükle
sudo ldapadd -Y EXTERNAL -H ldapi:/// 
  -f /usr/share/doc/sudo-ldap/schema.OpenLDAP

# Sysadmin grubuna tam sudo yetkisi ver
cat > sudo_rule.ldif << 'EOF'
dn: cn=sysadmin,ou=Sudo,dc=ornekfirma,dc=com
objectClass: sudoRole
cn: sysadmin
sudoUser: %sysadmin
sudoHost: ALL
sudoCommand: ALL
sudoOption: !authenticate
sudoRunAsUser: ALL

dn: cn=developers_restart,ou=Sudo,dc=ornekfirma,dc=com
objectClass: sudoRole
cn: developers_restart
sudoUser: %developers
sudoHost: web-servers
sudoCommand: /bin/systemctl restart nginx, /bin/systemctl restart php-fpm
sudoRunAsUser: root
EOF

ldapadd -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -f sudo_rule.ldif

Bu yapıyla sysadmin grubundaki herkes tüm sunucularda şifresiz tam sudo yetkisine sahip olurken, developers grubu yalnızca web sunucularında Nginx ve PHP-FPM yeniden başlatabilir. Granüler yetki yönetimi tam anlamıyla budur.

Günlük Yönetim İşlemleri

Kullanıcı Şifresi Değiştirme

# Admin olarak başka kullanıcının şifresini değiştir
ldappasswd -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W 
  -S "uid=ahmet.yilmaz,ou=People,dc=ornekfirma,dc=com"

# Kullanıcı kendi şifresini değiştirsin
ldappasswd -H ldap://localhost 
  -D "uid=ahmet.yilmaz,ou=People,dc=ornekfirma,dc=com" 
  -W -S

Kullanıcı Hesabını Kilitleme

İşten ayrılan biri için tek yapmanız gereken, hesabı kilitlemek veya silmek:

# Hesabı kilitle (loginShell'i geçersiz bir değere ayarla)
cat > lock_user.ldif << 'EOF'
dn: uid=ahmet.yilmaz,ou=People,dc=ornekfirma,dc=com
changetype: modify
replace: loginShell
loginShell: /sbin/nologin
EOF

ldapmodify -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -f lock_user.ldif

# Ya da tamamen sil
ldapdelete -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W "uid=ahmet.yilmaz,ou=People,dc=ornekfirma,dc=com"

Sildiğinizde değişiklik anında tüm sistemlere yansır. SSSD önbelleği biraz geciktirebilir, o yüzden acil durumlarda istemcilerde sss_cache -E komutu ile önbelleği temizleyin.

LDAP Sorgulama ve Sorun Giderme

# Tüm kullanıcıları listele
ldapsearch -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -b "ou=People,dc=ornekfirma,dc=com" "(objectClass=posixAccount)" uid cn mail

# Belirli bir kullanıcıyı ara
ldapsearch -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -b "dc=ornekfirma,dc=com" "(uid=ahmet.yilmaz)"

# Bir grubun üyelerini listele
ldapsearch -x -H ldap://localhost 
  -D "cn=admin,dc=ornekfirma,dc=com" 
  -W -b "ou=Groups,dc=ornekfirma,dc=com" "(cn=sysadmin)"

# İstemci tarafında kullanıcı bulunuyor mu kontrol et
id ahmet.yilmaz
getent passwd ahmet.yilmaz
getent group sysadmin

getent komutu NSS üzerinden LDAP’e sorgu atar. Sonuç geliyorsa istemci düzgün yapılandırılmış demektir.

Gerçek Dünya Senaryosu: 80 Sunuculu Ortam

Bir müşterimizin altyapısında tam olarak bu problemi yaşadık. 80 adet üretim sunucusu, farklı departmanlardan 120 kullanıcı ve sürekli değişen erişim gereksinimleri. Her ay ortalama 5-6 kişi işe giriyor ya da çıkıyor, bunların hepsinin erişimlerini elle yönetmek saatler alıyordu.

OpenLDAP kurulumundan sonra yaptığımız şeyler şunlardı:

  • Tüm kullanıcılar LDAP’e taşındı, uidNumber’lar standartlaştırıldı
  • Departman bazlı gruplar oluşturuldu: finance, devops, developers, qa, management
  • Her gruba uygun sudo kuralları LDAP üzerinden tanımlandı
  • Tüm 80 sunucuya SSSD yapılandırması Ansible ile dağıtıldı
  • İşe giriş/çıkış süreci otomasyona bağlandı: İK’nın kullandığı sisteme entegrasyon yapıldı

Sonuç olarak, yeni birinin işe başlaması ile tüm sistemlere erişim kazanması arasındaki süre 2 günden 15 dakikaya indi. İşten ayrılanların erişimini kapatmak ise 5 saniye: tek bir ldapdelete komutu.

LDAP Yüksek Erişilebilirlik

Tek bir LDAP sunucusu büyük bir risk. LDAP sunucu çöktüğünde kimse sisteme giriş yapamaz, SSSD önbelleği bir süre idare eder ama bu kalıcı çözüm değil. Replikasyon şart:

OpenLDAP’te senkron replikasyon (syncrepl) yapılandırması provider tarafında şöyle görünür:

cat > replication.ldif << 'EOF'
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 1

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://ldap2.ornekfirma.com
  bindmethod=simple
  binddn="cn=replicator,dc=ornekfirma,dc=com"
  credentials=replikasyon_sifre
  searchbase="dc=ornekfirma,dc=com"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 5 300 3"
  interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f replication.ldif

İki sunuculu mirror mode ile her iki sunucu da okuma-yazma yapabilir. İstemcilerde ldap_uri satırına her iki sunucuyu da ekleyin:

ldap_uri = ldap://ldap1.ornekfirma.com ldap://ldap2.ornekfirma.com

SSSD birincisi erişilemez olduğunda otomatik ikinciye geçer.

Güvenlik Kontrol Listesi

LDAP kurulumu yaparken güvenlik açısından mutlaka kontrol etmeniz gerekenler:

  • Anonim bağlantıyı devre dışı bırak: olcDisallows: bind_anon ayarını ekle
  • TLS zorunlu kıl: Şifresiz bağlantılara izin verme
  • Readonly bağlama hesabı kullan: İstemcilere admin şifresi verme
  • Erişim kontrolü (ACL) tanımla: Kim hangi attribute’ı okuyabilir, yazabilir
  • Şifre politikası uygula: ppolicy overlay ile minimum uzunluk, karmaşıklık, süre sonu
  • Log’ları izle: slapd logları syslog üzerinden merkezi log sistemine gönder
  • Firewall: LDAP portunu (389, 636) sadece güvenilen IP bloklarına aç
  • Yedekleme: slapcat ile düzenli LDIF dışa aktarımı yap
# Günlük LDAP yedeği için cron job
echo "0 2 * * * root /usr/sbin/slapcat -n 1 > /backup/ldap/ldap-backup-$(date +%Y%m%d).ldif" 
  >> /etc/cron.d/ldap-backup

Sonuç

LDAP kurulumu başta karmaşık görünebilir, özellikle LDIF formatı ve DN sözdizimi alışılmadık gelebilir. Ama bir kez oturup düzgün yapılandırdıktan sonra ne kadar zaman kazandırdığını görünce bu çabaya değdiğini anlıyorsunuz.

Küçük özetlersek: 10 sunucunuz varsa belki elle yönetim hala mümkün. 20’nin üzerine çıktığınızda LDAP ciddi düşünülmeli. 50 üzerinde ise LDAP olmadan çalışmak profesyonelce değil. Üstelik LDAP sadece Linux değil, ağ ekipmanları, VPN, web uygulamaları ve daha pek çok şeyle entegre olabilir. Bir kez kurup oturttuğunuzda tüm altyapınızın kimlik doğrulama omurgası haline gelir.

Bir sonraki adım olarak Kerberos ile birleştirerek tam SSO (Single Sign-On) mimarisine geçmeyi veya FreeIPA gibi LDAP + Kerberos + DNS + Sertifika Yönetimi’ni paket olarak sunan çözümleri incelemenizi öneririm. Ama her şeyin temeli burada: sağlam bir LDAP altyapısı.

Yorum yapın