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.localveya gerçek domain adınız, örneğinornekfirma.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_anonayarı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ı.