Bu yazıda bir sanal sunucu üzerine OpenLDAP kurulup halihazırda kurulu olan bir Jira servisinin yetkilendirme işlemi yapılacaktır.

Anlatımda komut satırına aşina olduğunuz varsayılmaktadır.


LDAP nedir?

Lightweight Directory Access Protocol(LDAP) dizin erişimi ve yönetimi için kullanılan standart haline gelmiş bir protokoldür. Dizinlerde genellikle kullanıcılar, gruplar, bilgisayarlar gibi veriler bulunmasına rağmen herhangi bir şey içerebilir.

Okuma hızının yüksek olmasını istediğimiz ama yazma hızının çok hızlı olmasına gerek duyulmayan durumlarda LDAP kullanımı uygundur. LDAP database yerine geçmez, hatta kendisine erişmek için database kullanır.


Neden OpenLDAP?

Bu anlatımda OpenLDAP’ı tercih etmemin sebebi, OpenLDAP’ın hem özgür yazılım hem de ücretsiz olmasıdır. Ayrıca OpenLDAP, muadilleri arasında en yaygın kullanılanlardan biridir. Bunun yanı sıra, öncesinde kurulumunu yapmış olduğum tek LDAP implementasyonu olduğu için anlatımının daha rahat olacağını düşündüm.


Neden internal değil de LDAP?

Öncelikle internal authentication nedir, ondan bahsedelim biraz. Internal authentication uygulamanın authentication mekanizmasını kendisinin yönetmesidir.

Örnek verecek olursak bir şirketimiz olsun ve bu şirket Jira, Bitbucket ve Confluence kullansın. Bu uygulamaların her birinde internal authentication ayarladığımızı varsayalım. Şirkete yeni bir çalışan alındığında her birinde ayrı ayrı hesap açılması gerekecek. Çalışan parolasını değiştirmek istediğinde her birinde tek tek değiştirmesi gerekecektir. Şirketten çalışan çıkartıldığında servislerden tek tek hesabının silinmesi gerekecektir.

Internal authentication yerine external olarak LDAP kullanılırsa, kullanıcı eklerken sadece LDAP sunucusunda bir kullanıcı hesabı oluşturarak istenen uygulama gruplarına eklemek yeterli olacaktır. Çalışan parolasını değiştirdiğinde her biri zaten LDAP’tan authenticate olduğu için parolası her biri için değişmiş olacaktır. Çalışanın herhangi bir uygulamaya erişimi kesilmek istendiğinde ise uygulama grubundan çıkartılması yeterli olacaktır. Çalışan çıkartma durumunda ise hesabının LDAP’tan silinmesi yeterli olacaktır.

Yani sonuç olarak LDAP kullanarak kullanıcı yönetim işlemlerini kolaylaştıracağız.


Örnek Kurulum ve Konfigürasyon

OpenLDAP kurulumu

Kurulum işlemi yeni oluşturulmuş bir Ubuntu 16.04 dağıtımında yapılacak olup, ldaptest.kodgemisi.com alan adı bu sunucuyu gösterecek şekilde ayarlanmıştır.

İlk olarak sunucuya login oluyoruz ve sunucunun hostname’ini ayarlıyoruz.

hostnamectl set-hostname ldaptest.kodgemisi.com

logout ardından login olduğumuz zaman değişikliği görüyoruz.

OpenLDAP kurulumunu apt paket yöneticisini kullanarak yapacağız, herhangi bir indirme yapmadan önce update işlemini yapıyoruz.

apt update

Update işlemi tamamlandıktan sonra OpenLDAP sunucusunu ve OpenLDAP servisine erişim için gerekli araçları indiriyoruz.

apt -y install slapd ldap-utils

Kurulum işlemi tamamlandıktan sonra bizden admin parolasını girmemizi istiyor, admin parolasını girip doğruluyoruz.

Kurulum aşamaları tamamlandıktan sonra konfigürasyon dosyalarıyla uğraşmaktansa OpenLDAP sunucusunu baştan konfigüre ediyoruz.

dpkg-reconfigure slapd

Bize konfigürasyon hakkında birkaç soru soruyor, sırasıyla istenen değerleri giriyoruz.

Omit OpenLDAP server configuration?: No
DNS domain name: ldaptest.kodgemisi.com
Organization name: Kodgemisi
Administrator password: ***********
Confirm password: ***********
Database backend to use: MDB(HDB de seçebilirsiniz ama BDB seçmemeye çalışın)
Do you want the database to be removed when slapd is purged?: No
Move old database?: Yes
Allow LDAPv2 protocol?: No

Değerleri girdikten sonra konfigürasyon tamamlanıyor, konfigürasyonu test ediyoruz.

slapcat

Aşağıdaki çıktıyı alıp değerlerin doğruluğunu kontrol ediyoruz.

dn: dc=ldaptest,dc=kodgemisi,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Kodgemisi
dc: ldaptest
structuralObjectClass: organization
entryUUID: b6129d3c-988c-1038-9bdf-415c609ae43f
creatorsName: cn=admin,dc=ldaptest,dc=kodgemisi,dc=com
createTimestamp: 20181220102108Z
entryCSN: 20181220102108.831262Z#000000#000#000000
modifiersName: cn=admin,dc=ldaptest,dc=kodgemisi,dc=com
modifyTimestamp: 20181220102108Z

dn: cn=admin,dc=ldaptest,dc=kodgemisi,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9anpnWG5raE0xUTZ0TS9peWtWYWUwM0YvK2ZjT2JmbWU=
structuralObjectClass: organizationalRole
entryUUID: b612f502-988c-1038-9be0-415c609ae43f
creatorsName: cn=admin,dc=ldaptest,dc=kodgemisi,dc=com
createTimestamp: 20181220102108Z
entryCSN: 20181220102108.833569Z#000000#000#000000
modifiersName: cn=admin,dc=ldaptest,dc=kodgemisi,dc=com
modifyTimestamp: 20181220102108Z

Çıktının doğruluğunu teyit ettikten sonra kullanıcılar ve gruplarını ekleyebileceğimiz birer organizationalUnit oluşturuyoruz.

Bunun için herhangi bir text editörle base.ldif adında bir dosya oluşturup içini aşağıdaki gibi dolduruyoruz:

dn: ou=people,dc=ldaptest,dc=kodgemisi,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=ldaptest,dc=kodgemisi,dc=com
objectClass: organizationalUnit
ou: groups

Dosyayı açıp içini belirtilen şekilde doldurduktan sonra dosya içeriğini servisimize import ediyoruz.

ldapadd -x -D cn=admin,dc=ldaptest,dc=kodgemisi,dc=com -W -f base.ldif

Komutu çalıştırdıktan sonra bize admin parolasını soruyor, parolayı girdikten sonra işlem başarıyla tamamlanırsa aşağıdaki gibi bir çıktı veriyor.

Enter LDAP Password: 
adding new entry "ou=people,dc=ldaptest,dc=kodgemisi,dc=com"

adding new entry "ou=groups,dc=ldaptest,dc=kodgemisi,dc=com"

LetsEncrypt kurulumu

OpenLDAP servisi ve onunla authenticate olan servisler arasındaki trafiğin şifreli olarak akmasını istiyoruz. Bu amaca ulaşmak için biz certificate authority olarak LetsEncrypt kullanıyoruz.

LetsEncrypt kurulumunu yapıyoruz.

apt install letsencrypt

Kurulum işlemi tamamlandıktan sonra ldaptest.kodgemisi.com için sertifika alıyoruz.

letsencrypt certonly -d ldaptest.kodgemisi.com

İlk kez kullandığımız için bizden e-posta adresi girmemizi ve Terms of Service sözleşmesini kabul etmemizi istiyor.

İstenenleri yaptıktan sonra sertifikamız oluşuyor.

Oluşan sertifika ve chain’i slapd servisinin erişim yetkisinin olduğu bir yere kopyalıyoruz.

cp /etc/letsencrypt/live/ldaptest.kodgemisi.com/{fullchain.pem,cert.pem,privkey.pem} /etc/ldap/sasl2/

Kopyalama işleminden sonra sahipliklerini openldap kullanıcı ve grubu şeklinde ayarlıyoruz.

chown openldap. /etc/ldap/sasl2/{fullchain.pem,cert.pem,privkey.pem}

privkey.pem ve cert.pem için erişim yetkisini sadece sahibi için okuyabilir yapıyoruz.

chmod 400 /etc/ldap/sasl2/{privkey.pem,cert.pem}

Herhangi bir text editörle letsencrypt.ldif adında bir dosya oluşturup içini aşağıdaki gibi dolduruyoruz.

dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/sasl2/fullchain.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/sasl2/cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/sasl2/privkey.pem

Servise import ediyoruz.

ldapmodify -Y EXTERNAL -H ldapi:/// -f letsencrypt.ldif

İşlem başarıyla tamamlanırsa aşağıdaki gibi bir çıktı veriyor.

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

slapd servisinin ldaps portunu açmak için /etc/default/slapd dosyasındaki SLAPD_SERVICES değerine ldaps:/// ekliyoruz.

Konfigürasyonu kontrol ediyoruz.

grep -ve "^#" -ve "^$" /etc/default/slapd

Aşağıdaki çıktıyı alıp ldaps:/// değerinin eklendiğini teyit ediyoruz.

SLAPD_CONF=
SLAPD_USER="openldap"
SLAPD_GROUP="openldap"
SLAPD_PIDFILE=
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd
SLAPD_OPTIONS=""

Yeni konfigürasyonun geçerli olması için servisi yeniden başlatıyoruz.

systemctl restart slapd

phpldapadmin kurulumu

Biz OpenLDAP arayüzü için phpldapadmin kullanıyoruz.

phpldapadmin kurulumunu yapıyoruz.

apt -y install phpldapadmin

Yükleme işlemini tamamladıktan sonra /etc/phpldapadmin/config.php dosyasının içeriğini aşağıdaki gibi güncelliyoruz.

$servers->setValue('server','name','ldaptest.kodgemisi.com');
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array('dc=ldaptest,dc=kodgemisi,dc=com'));
$servers->setValue('login','bind_id','cn=admin,dc=ldaptest,dc=kodgemisi,dc=com');

Konfigürasyon işlemini tamamladıktan sonra apache servisini yeniden başlatıyoruz.

systemctl restart apache2

Web servisimiz yeniden başladıktan sonra http://ldaptest.kodgemisi.com/phpldapadmin/ adresine giriş yapıyoruz.

Login sayfasına geliyoruz.

admin kullanıcısını kullanarak login oluyoruz.

Jira’yı OpenLDAP ile authanticate etmek

Öncelikle Jira’da admin yetkisi olan bir hesap ile login oluyoruz.

Administration kısmından User management sayfasına gidiyoruz.

Sol panelden User Directories sayfasına gidiyoruz.

Sayfanın altındaki Add Directory butonundan LDAP’ı seçip Next diyoruz.

Gelen sayfada alanları aşağıdakiler gibi dolduruyoruz.

Doldurduktan sonra Quick Test yapıyoruz.

Gelen sayfada aşağıdaki bölümü gördükten sonra Save and Test butonuyla devam ediyoruz.

Aşağıdakine benzer bir sayfa gelecektir.

Kullanıcı eklemek için phpldapadmin sayfasına geliyoruz ve sol panelden ou=people kısmına geliyoruz.

Gelen sayfadan Create a child entry sayfasına geçiyoruz.

Template’lerden Default’ı seçiyoruz.

Gelen sayfadan inetOrgPerson seçip devam ediyoruz.

Alanları doldurup Create Object diyoruz.

Commit yapıp kullanıcıyı kaydediyoruz.

Aşağıda da gördüğünüz üzere kullanıcımız eklendi.

Jira’ya geri dönüp test sayfasından yeni oluşturduğumuz kullanıcıyı deniyoruz.

Test işlemi tamamlandıktan sonra aşağıdaki gibi bir sayfa gelecektir.

LDAP sunucumuzda Jira grup tanımı olmadığı için yukarıdaki gibi bazı hatalar alıyoruz.

Grup tanıma yapmak için sol taraftaki panelden Users sayfasına geliyoruz.

Gelen sayfada kullanıcımızı bulup Edit user groups diyoruz.

İstediğimiz grupları seçiyoruz.

İstediğimiz grupları seçtikten sonra Join selected groups diyoruz.

User Directories sayfasına geri dönüyoruz.

Gelen sayfadan Test sayfasına gidiyoruz.

Oluşturduğumuz kerem kullanıcısı için test yapıyoruz.

Sonuç olarak gerekli ayarları yaptığımız için aşağıdaki sonucu elde ediyoruz.

Ayrıca Jira üzerinden yapmış olduğumuz grup eklemesini LDAP sunucumuzda da görüyoruz.


Sonuç

Sonuç olarak şirketimiz için merkezi bir authentication sunucusu olarak OpenLDAP kurulumu yaptık. OpenLDAP ile servisler arasında akan verinin güvenliği için LetsEncrypt kullanarak trafiğin ldaps portu üzerinden şifreli bir şekilde akmasını sağladık. OpenLDAP’ın kolay kullanımı için web arayüzü olan phpldapadmin kurulumu yaptık. Ayrıca Jira ile OpenLDAP entegrasyonunu yaptık.