İçindekiler
Giriş
Bu yazıda sadece LDAP Sunucusu kurulumu anlatmayacağım. LDAP kurup, kayıtları ekleyip, kullanıcıların linux sunucularda LDAP üzerinden yetkilendirilmesini anlatacağım. Bunu yaparken ortam kurulumu için Terraform, yapılandırma için de Ansible kullanacağım.
⚠️⚠️ Ekran görüntülerinde ve terminal kayıtlarında yazı içinde farklı IP adresleri görebilirsiniz. Bu yazıyı takip ederken LDAP Sunucusu mu yoksa istemci makineden mi bahsediliyor dikkat ediniz.
Terraform ile Ortamın Kurulması
Bulut ortamlarından AWS yi seçtim bu lab için siz dilediğiniz bulut sağlayıcıda veya kendi yerelinizde bu ortamı kurabilirsiniz.
AWS de varsayılan VPC nin içine iki sunucu(LDAP + Test Sunucusu) kuracağız. Bunlar aynı güvenlik grubuna(security group) bağlı, güvenlik grubunda dışarıdan(VPC nin dışından) gelecek SSH ve LDAP bağlantılarına izin verecek iki kural var. Ayrıca sunuculara terraform da , açık anahtarımızı(public ssh key) tanıtacağız ssh bağlantısı için.
- AWS Console da IAM -> Users -> Add Users bölümünden terraformUser isimli kullanıcı oluşturuyoruz. Credential type için Access key i seçiyoruz.
-
Bir sonraki adımda Set Permissions ekranında Attach Existing policies directly bölümünden aşağıdaki yetkiler seçilir. Yetkiler Filter Policies ekranından aranarak bulunabilir.
- AmazonEC2FullAccess , AmazonVPCFullAccess
- Add tags bölümünde herhangi bir seçim yapmamıza gerek yok. Bir sonraki adıma geçiyoruz.
- Review bölümünde bize önceki adımlarda yaptığımız seçenekleri gösteriyor. Alttaki ekran görüntüsüyle karşılaştırıp doğrulamanız iyi olur.
- Son adımda Download .csv ile kimlik bilgilerinin olduğu dosya indirilir.
- Terraform dosyalarının AWS de yapıyı kurabilmesi için önceki adımlarda indirdiğimiz .csv dosyasındaki profili , aws cli da tanıtalım. Bu profili Terraformda tanımlayalım.
provider "aws" {
region = "us-east-1"
profile = "terraformUser"
}
- Oluşturacağımız sunuculara hem Ansible ın erişmesi için hem de ssh üzerinden erişebilmemiz için sunuculara açık SSH anahtarımızı Terraform ile yerleştiriyoruz.
resource "aws_key_pair" "myKey" {
key_name = "mySSHKey"
public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICT1k5NTCYPbi19DKDUvJQ8V9pkVFvCK8FZaXhv8bJty berkant@ryzen"
}
- terraform fmt komutuyla dosya varsayılan biçimde formatlanır. terraform validate komutu ile oluşturulan ayarlar ve yapı geçerli mi diye kontrol edilir. terraform init ile terraformun çalışması gereken çeşitli hazırlıklar yapılır(sağlayıcı dosyasını indirmek gibi). terraform plan kurulacak yapı için gereken değişiklikleri gösterir. terraform apply yapıyı kurar.
- Kaydın sonunda hata almasının sebebi AWS de Terraform tarafından oluşturulmayan bir kaynağı kullanmaya çalışmamız. Terraform dosyalarında varsayılan VPC yi kullandım. Bu kaynak Terraform tarafından oluşturulmadığı için , AWS deki o kaynağı içe aktarmamız lazım.
resource "aws_vpc" "myVPC" {
# Bu kaynak aws tarafından oluşturuldu.İçe aktarılacak.
# Kullanmamız için bu tanımlama ve terraform import ile içe aktarılması yeterli
}
- Tekrar terraform apply yaptığımızda sorunsuz bir şekilde kurulacak. Terraform bölümünü bitirdik 🏁
Ansible ile Yapılandırma
- Ansible ile kuracağımız iki sunucuda paket yükleme, ssh ayarlarını değiştirme, ayar dosyalarını atma işlemlerini yapacağız. Altta temel ansible-playbook komutunun açıklamaları var.
ansible-playbook -i inventoryFile playbook.yaml --key-file keyFile
inventoryFile: playbook.yaml daki kuralların hangi sunucularda işletileceğine yönelik bilgiler. Bu bilgilerle ssh bağlantısı sağlanacak. (IP adresi, sunucu, kullanıcı adı vb). [] Köşeli parantezler içinde yazan ifade ansible dosyasında hosts ile belirttiğimiz değişkene karşılık geliyor.
[LDAP]
XXX.XXX.XXX.XXX ansible_user=admin
[Client]
XXX.XXX.XXX.XXX ansible_user=admin
playbook.yaml: Ansible kodlarının olduğu dosya.
keyFile: SSH ile bağlanırken kimlik doğrulama için anahtar dosyası.
- İhtiyacımız olan paketleri kurup, dosyaları kopyalayıp, ayar dosyalarında değişiklikler yaptık.
LDAP Adımları
LDAP Sunucusundaki Adımlar
LDAP sunucumuza giriyoruz, slapd ve ldaputils paketi ansible ile kurulmuştu. Varsayılan olarak kurulumda sunucu isminden dn(ayırt edici ad ~ distinguished name) almaya çalışıyor. Bu değerlere slapcat komutuyla bakabiliriz.
Örneğin cloudsio ismindeki yapımız için cloudsio.com a karşılık gelecek şekilde kurduğumuzu düşünelim. LDAP ı sudo dpkg-reconfigure slapd komutuyla yeniden yapılandırabiliriz. Adımlarda oluşturulan admin hesabının okuma/yazma yetkileri var.
LDAP ı yeniden yapılandırdıktan sonra drivers.ldif dosyamızı ldap a ekleyelim alttaki komut ile. (.ldif uzantılı dosyalar ldap kayıtlarını düz metin olarak saklar.)
👉👉LDIF Dosyaları Hakkında Kısa Notlar👈👈
ldapadd -x -W -D "cn=admin,dc=cloudsio,dc=com" -f drivers.ldif
👉👉drivers.ldif in görselleştirilmiş hali👈👈
İstemci/Client ta Yapılacak Adımlar
- LDAP sunucusunda yapmamız gerekenler adımlar bitti. Kimlik doğrulama işini LDAP a soracak sunucudaki(istemci / client) adımlara geçelim.
sudo apt update && sudo apt install libnss-ldapd libpam-ldapd ldap-utils -y
Sunucuya libnss-ldapd , libpam-ldapd, ldap-utils paketlerini yüklüyoruz. Paketlerin yüklenme adımında ldap sunucusu ile ilgili ve bulunduğumuz pam modülünün ayarları ile ilgili seçenekleri soruyor.
Son olarak /etc/pam.d/common-session dosyasına , sunucuya giren kullanıcaların ev dizininin sunucuya girer girmez oluşturulması için aşağıdaki pam seçeneğini ekliyoruz.
session optional pam_mkhomedir.so skel=/etc/skel umask=077
İlgili nscd ve nslcd servislerini yeniden başlatıyoruz.
systemctl restart nscd nslcd
Kendi makinemizden yaptığımız bağlantılarda ssh servisinin MaxAuthTries (varsayılan 6) değerini aştığımız için aşağıdaki gibi bir hata alabiliriz.
berkant@ryzen:~/LAB001/terraform$ ssh jbianchi@54.243.0.128
Received disconnect from 54.243.0.128 port 22:2: Too many authentication failures
Disconnected from 54.243.0.128 port 22
Eğer başka bir makineden bağlanırsak, ya da /etc/ssh/sshd_config MaxAuthTries değerini yükseltip, ssh servisi yeniden başlatırsak sorun çözülür.
- Kullanıcılar sunucuya girdi ama henüz sudo yetkileri yok. Ne yapmalıyız?
- /etc/sudoers dosyasında değişiklik yapmamız gerekecek.
-r--r----- 1 root root 668 Oct 31 20:00 /etc/sudoers
dosyanın izinleri bu şekilde olduğundan herhangi bir metin düzenleyici içine girip değişiklik yapamıyoruz. sudoers dosyalarını düzenlemek için visudo komutunu kullanabiliriz.
- /etc/sudoers dosyasında değişiklik yapmamız gerekecek.
sudo visudo
# Açılan sudoers dosyasında ilgili kullanıcının grubunu ekliyorum
%drivers ALL=(ALL:ALL) ALL
Lab Dosyaları
Kaynaklar
- Kapak görseli -> Image by David Mark from Pixabay
- https://wiki.debian.org/LDAP/PAM
- https://wiki.debian.org/LDAP/OpenLDAPSetup
- https://www.howtoforge.com/linux_ldap_authentication
- https://www.server-world.info/en/noteos=Debian_11&p=openldap
- https://marcin.owsiany.pl/ldif2dot-page
- https://github.com/ltb-project
Top comments (1)
Eklemeler
Yazıda eklememişim, .ldif kayıtlarında kullanıcılar için userPassword değeri slappasswd komutu ile oluşturulabilir.
LDAP sunucusuna kayıt ekleme/silme/düzenleme işlemleri ldap komutları yerine GUI li bir araç kullanmak isterseniz Apache Directory Studio yu öneriyorum.