LDAP ile Jira Authentication
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: 20181220102108Zdn: 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.