Lab001 - Linux Dağıtımlarında LDAP Üzerinden Kimlik Doğrulama
Tags: linux, ldap, terraform, ansible
Published: 2022-10-11 19:25:14


# İçindekiler


1. [Terraform ile Ortamın Kurulması](#terraform-ile-ortamın-kurulması)
2. [Ansible ile Yapılandırma](#ansible-ile-yapılandırma)
3. [LDAP Adımları](#ldap-adımları)
4. [Lab Dosyaları](#Lab-Dosyaları)





## 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.

[Terraform Kurulumu](https://learn.hashicorp.com/tutorials/terraform/install-cli)

[AWS CLI Kurulumu](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)

* [AWS Console](console.aws.amazon.com) da IAM -> Users -> **Add Users** bölümünden **terraformUser** isimli kullanıcı oluşturuyoruz. Credential type için **Access key** i seçiyoruz.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/43hdkspaawzkhi8ymata.png)

* 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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f5vwtb1811l96mbgk1id.png)

* **Add tags** bölümünde herhangi bir seçim yapmamıza gerek yok. Bir sonraki adıma geçiyoruz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xn670utr2p9muffln56.png)

* **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.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1euvltefplcrdy1ip4zs.png)

* Son adımda **Download .csv** ile kimlik bilgilerinin olduğu dosya indirilir.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/95xb3inj0chig2r3dtok.png)

* 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.

{% embed https://asciinema.org/a/531308 %}


```
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.

{% embed https://asciinema.org/a/531234 %}

```
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.

{% embed https://asciinema.org/a/531312 %}


* 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
}
```

{% embed https://asciinema.org/a/531320 %}

* 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.
{% embed https://asciinema.org/a/533536 %}

## 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](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] (https://res.cloudinary.com/practicaldev/image/fetch/s--FnCUiKCd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4mmyqoq0h6wzgj59r2ff.png)👈👈

{% embed https://asciinema.org/a/533541 %}

### İ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.
```
sudo visudo
# Açılan sudoers dosyasında ilgili kullanıcının grubunu ekliyorum
%drivers   ALL=(ALL:ALL) ALL
```
{% embed https://asciinema.org/a/533857 %}



## Lab Dosyaları

👉👉[Github Bağlantısı](https://github.com/BerkantErbey/Linux-Dagitimlarinda-LDAP-Uzerinden-Kimlik-Dogrulama)👈👈

**Okuduğunuz için teşekkürler** 🙂
<img width="100%" style="width:100%" src="https://media.giphy.com/media/h6Kc0amrAvn3Cnrkbd/giphy.gif">


Kaynaklar
1. Kapak görseli -> Image by <a href="https://pixabay.com/users/12019-12019/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=172770">David Mark</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=172770">Pixabay</a>
2. https://wiki.debian.org/LDAP/PAM
3. https://wiki.debian.org/LDAP/OpenLDAPSetup
4. https://www.howtoforge.com/linux_ldap_authentication
5. https://www.server-world.info/en/noteos=Debian_11&p=openldap
6. https://marcin.owsiany.pl/ldif2dot-page
7. https://github.com/ltb-project