Libnss-ldapd ile Samba Üzerinden Kimlik Doğrulama
Tags: pardus, samba, ldap, authentication
Published: 2020-07-28 21:28:43

### Genel Bakış
Libnss-ldapd, LDAP sunucunuzun kullanıcı hesabı(user account), grubu (gorups), ana bilgisayar adı (hostname), takma adı (aliases), ağ grubu (netgroup) ve temelde /etc/passwd, /etc/group (flat files) dosyalarından veya NIS'den alacağınız diğer bilgileri sağlamasına olanak tanıyan bir Ad Hizmeti Anahtarı (Name Server Switch, NSS, nsswitch) modülü sağlar [1] https://arthurdejong.org/nss-pam-ldapd/. Ayrıca unix sistemlerde bir LDAP/AD/Samba sunucusuyla kimlik ve kimlik doğrulama yönetimi kullanmak için Takılabilir Kimlik Doğrulama Modülü (Pluggable Authentication Module, PAM) sağlar.

libnss-ldapd asıl amacı libnss-ldap’nin eksikliklerini gidermek olan bir çatalıdır (fork’udur). libnss-ldap yakın zamanda geliştirme yapılmamasının yanı sıra ssl ile çalışırklen hatalara neden olabilmektedir. Bunun dışında libnss-ldapd'nin, libnss-ldap’a karşı en önemli özellikleri aşağıdaki şekilde sıralanabilir:

• hafif ve basit NSS ve PAM kütüphaneleri
• tüm programlara LDAP ve SSL kitaplıklarını yüklemekten kaçınır
• NSS, PAM ve LDAP kodu arasındaki ayrım
• LDAP sunucusuna daha az bağlantı
• daha iyi hata ayıklama olanakları
• daha iyi performans

? libnss-ldapd -> kullanıcıara parolalarının süresinin yakında dolacağını bildirmediği yazılmış fakat test edilmesi gerekiyor ¿

### Ornek LDAP Sorgusu
Terminal üzerinden Samba, Aktif dizin, ya da Openldap'a sorgu atmak için aşağıdaki temel komut kullanılabilir. Makine sınıfına dahil olmayan, mail attribute'u boş olan kullanıcıların listesini döndürür.
```
# ldapsearch -x  -H ldaps://hostname_yada_ip_adresi -D 'kullanici_adi@domain' -b "dc=domain" -W "istenen_filtre"
ldapsearch -x  -H ldaps://192.168.1.5 -D 'openldapuser@ornek.domain.com' -b "dc=ornek,dc=domain,dc=com" -W "(&(objectClass=organizationalPerson)(!(objectClass=computer))(!(mail=*)))"
```

### Başlamadan Önce

Bu dökümanda kurulu bir samba ya da aktif dizin sunucunuz olduğu varsayılarak hazırlanmıştır. Dökümanda kullanılan örnek Samba Domainin bilgileri aşağıdaki gibidir.
* ldap server URI -> ldaps://192.168.1.5:636
* ldap server search base -> dc=ornek,dc=domain,dc=com

Kullanıcıları sorgulamak için kullanılacak kullanıcı bilgisi aşağıdaki gibidir. Bu kullanıcının da aşağıdaki özellikleri olması gerekmektedir.
* Kullanıcı adı -> openldapuser (Users altında, dn=cn=openldapuser,cn=Users,dc=test,dc=domain,dc=com)
* Parola -> Passw0rd

### Domain Kullanıcılarına Linux Sınıfları Ekleme
Samba ya da Aktif dizin üzerinde oluşturulan varsayılan kullanıcı özellikleri, linux istemci üzerinde ldap ile kimlik doğrulama yapabilmek için yeterli değildir. Bunun için kullanıcılara "posixAccount" ve "shadowAccount" sınıfları eklenmelidir. Bu sınıflar ile gelen uid, uidNumber, gidNumber, homeDirectory, loginShell bilgileri doldurulmalıdır. Özellikle ldap yapılandırmasında kullanılacak kullanıcıda bu bilgiler olmalıdır. 

Ekleme işlemi AD Admin & Reporting Tool, Apache Directory Studio ya da windows kullanılıyorsa rsat ile düzenlenebilir.

### Kurulum
* Gerekli paketler yüklenir
```
sudo export DEBIAN_FRONTEND=noninteractive
sudo apt-get update -y
sudo apt-get -y install libpam-ldapd nscd ldap-utils libnss-ldapd
```
* /etc/nslcd.conf dosyası düzenlenir

```
uid nslcd
gid nslcd
uri ldaps://192.168.1.5:636
base dc=test,dc=domain,dc=com
ldap_version 3
binddn cn=openldapuser,cn=Users,dc=test,dc=domain,dc=com
bindpw Passw0rd
tls_reqcert never
tls_cacertfile /etc/ssl/certs/ca-certificates.crt
# Filters
filter  passwd  (&(description=222)(objectClass=user))
filter  group   (objectClass=group)
#Attribute mappings
map     passwd  uid                sAMAccountName
map     passwd  homeDirectory      unixHomeDirectory
map     passwd  gecos              displayName
map     passwd  gidNumber          primaryGroupID
pagesize        1000
referrals       off
nss_nested_groups yes
```

* filter ile kullanıcı ya da gruplar için filtreleme yapılabilir

```
# Kullanıcı filtresi
filter  passwd  (&(!(objectCLass=computer))(objectClass=organizationalPerson))
# Grup filtresi
filter  group   (objectClass=group)
```

* "getent passwd" ile filtrelenen kullanıcıları görebilmek için /etc/nsswitch.conf dosyasına koyu renkli olan kısımların eklendiğinden emin olunur.

> passwd:         files **ldap** systemd 
> group:          files **ldap** systemd
> shadow:         files
> gshadow:        files
> 
> hosts:          files mdns4_minimal [NOTFOUND=return] dns
> networks:       files
> 
> protocols:      db files
> services:       db files
> ethers:         db files
> rpc:            db files
> 
> netgroup:       nis

* Ev dizini olmayan kullanıcıların ev dizinleri otomatik oluşması /etc/pam.d/common-session dosyasında aşağıdaki satır yoksa, dosyanın sonuna eklenir
```
session    required   pam_mkhomedir.so skel=/etc/skel/ umask=0022
```

* Servis yeniden başlatılır ve kullanıcılar çekilir
```
sudo systemctl restart nslcd.service 
getent passwd
```