PAM Yapılandırması: Linux’ta Kimlik Doğrulama Modülleri

Sistem yöneticiliğinde güvenliğin en kritik katmanlarından biri kimlik doğrulamadır. Linux sistemlerinde bu işi PAM (Pluggable Authentication Modules) üstlenir ve doğru yapılandırılmadığında ciddi güvenlik açıkları bırakabilir. Bu yazıda PAM’ın nasıl çalıştığını, modüllerini ve gerçek dünya senaryolarında nasıl yapılandırılacağını ele alacağız.

PAM Nedir ve Neden Önemlidir?

PAM, Linux sistemlerinde kimlik doğrulama mekanizmasını uygulamalardan soyutlayan bir ara katmandır. PAM olmadan her uygulama kendi kimlik doğrulama kodunu yazmak zorunda kalırdı. SSH, sudo, login, su gibi araçların hepsi PAM üzerinden kimlik doğrulama yapar.

PAM’ın temel avantajı esnekliktir. Bir uygulamayı değiştirmeden kimlik doğrulama davranışını değiştirebilirsiniz. Örneğin SSH girişlerine Google Authenticator eklemek istiyorsanız, SSH kodunu değiştirmenize gerek yoktur; sadece PAM yapılandırmasını güncellersiniz.

PAM dört temel modül türüyle çalışır:

  • auth: Kullanıcının iddia ettiği kişi olup olmadığını doğrular (şifre kontrolü gibi)
  • account: Hesabın giriş yapma iznine sahip olup olmadığını kontrol eder (hesap süresi, saat kısıtlamaları)
  • password: Şifre değiştirme işlemlerini yönetir
  • session: Oturum açma ve kapama işlemlerini yönetir (ev dizini bağlama, log kayıtları)

PAM Yapılandırma Dosyaları

PAM yapılandırması /etc/pam.d/ dizininde yer alır. Her uygulama için ayrı bir dosya bulunur:

ls /etc/pam.d/
# common-auth  common-account  common-password  common-session
# sshd  sudo  login  su  gdm-password

Debian/Ubuntu tabanlı sistemlerde common-* dosyaları merkezi yapılandırma noktasıdır. Diğer dosyalar bu ortak dosyaları @include direktifiyle dahil eder. RHEL/CentOS tabanlı sistemlerde ise system-auth ve password-auth dosyaları aynı işlevi görür.

Her PAM yapılandırma satırı şu formatı izler:

tip  kontrol_bayragi  modül_yolu  [argümanlar]

Kontrol bayrakları PAM’ın önemli bir parçasıdır:

  • required: Modül başarısız olursa işlem sonuçta başarısız olur, ancak diğer modüller çalışmaya devam eder
  • requisite: Modül başarısız olursa işlem anında durur
  • sufficient: Modül başarılı olursa ve önceki required modüller geçilmişse işlem başarılı sayılır
  • optional: Modülün sonucu genellikle görmezden gelinir
  • include: Başka bir PAM dosyasını dahil eder

Temel PAM Modülleri

pam_unix.so

En temel modüldür. /etc/passwd ve /etc/shadow dosyalarını kullanarak standart Unix kimlik doğrulaması yapar:

cat /etc/pam.d/common-auth
# auth [success=1 default=ignore] pam_unix.so nullok_if_unset

Önemli argümanlar:

  • nullok: Boş şifreye izin verir
  • shadow: Shadow dosyasını kullanır
  • md5: MD5 şifre hash’i kullanır
  • remember=5: Son 5 şifreyi hatırlar (password modülüyle)

pam_faillock.so

Başarısız giriş denemelerini takip eder ve hesapları kilitler. RHEL 8+ ve modern sistemlerde pam_tally2.so yerine kullanılır:

# /etc/pam.d/system-auth dosyasına eklenecek
auth        required      pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth        sufficient    pam_unix.so nullok
auth        [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900

Bu yapılandırmayla 5 başarısız denemeden sonra hesap 900 saniye (15 dakika) kilitlenir. Hesap durumunu kontrol etmek için:

# Belirli kullanıcının başarısız giriş sayısını göster
faillock --user ahmet

# Hesabı manuel olarak aç
faillock --user ahmet --reset

pam_pwquality.so

Şifre kalitesini kontrol eden modüldür. /etc/security/pwquality.conf dosyasıyla da yapılandırılabilir:

# /etc/pam.d/common-password
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1

Argümanların açıklaması:

  • retry=3: Kullanıcıya 3 deneme hakkı tanır
  • minlen=12: Minimum 12 karakter zorunlu
  • dcredit=-1: En az 1 rakam zorunlu (negatif değer minimum sayıyı belirtir)
  • ucredit=-1: En az 1 büyük harf zorunlu
  • ocredit=-1: En az 1 özel karakter zorunlu
  • lcredit=-1: En az 1 küçük harf zorunlu

Yapılandırmayı test etmek için:

# pwscore komutuyla şifre kalitesini test et
echo "Zayif123" | pwscore
echo "G%venl1_Sifre2024" | pwscore

pam_limits.so

Kullanıcı ve grup bazlı sistem kaynak limitlerini uygular. /etc/security/limits.conf dosyasını kullanır:

# /etc/pam.d/common-session
session required pam_limits.so
# /etc/security/limits.conf örnek yapılandırması
# Kullanıcı  Tip    Limit    Değer
ahmet        hard   nofile   65536
ahmet        soft   nofile   32768
@developers  soft   nproc    2048
@developers  hard   nproc    4096
*            hard   core     0

Gerçek Dünya Senaryosu 1: SSH için İki Faktörlü Doğrulama

Google Authenticator ile SSH’a TOTP tabanlı iki faktörlü doğrulama eklemek oldukça yaygın bir gereksinimdir. Önce gerekli paketi yükleyelim:

# Debian/Ubuntu
apt install libpam-google-authenticator

# RHEL/CentOS
dnf install google-authenticator pam_google_authenticator

Kullanıcı tarafında kurulum:

# Her kullanıcı kendi token'ını oluşturmalı
google-authenticator

# Sorulara cevaplar:
# Time-based tokens? -> y
# Update .google_authenticator? -> y
# Disallow multiple uses? -> y
# Permit 30 second clock skew? -> y
# Enable rate-limiting? -> y

PAM yapılandırması:

# /etc/pam.d/sshd dosyasına ekle
auth required pam_google_authenticator.so nullok

SSH daemon yapılandırması da güncellenmeli:

# /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
UsePAM yes
systemctl restart sshd

nullok argümanı, henüz Google Authenticator kurulmamış kullanıcıların giriş yapabilmesini sağlar. Tüm kullanıcılar kurulumu tamamladıktan sonra bu argümanı kaldırabilirsiniz.

Gerçek Dünya Senaryosu 2: Sudo için Ek Güvenlik

Kritik sunucularda sudo kullanımı için ekstra doğrulama katmanı eklemek güvenliği artırır:

# /etc/pam.d/sudo dosyasını düzenle
auth       required   pam_unix.so
auth       required   pam_faillock.so preauth
auth       sufficient pam_unix.so
auth       [default=die] pam_faillock.so authfail
account    required   pam_unix.so
session    required   pam_limits.so

Buna ek olarak, belirli saatlerde sudo kullanımını kısıtlamak için pam_time.so kullanabilirsiniz:

# /etc/security/time.conf
# Servis  Terminal  Kullanıcı  Zaman
sudo;*;!root;!Wk0800-1800

Bu yapılandırma root dışındaki kullanıcıların hafta içi 08:00-18:00 dışında sudo kullanmasını engeller.

pam_env.so ile Ortam Değişkenleri

Oturum açıldığında ortam değişkenlerini ayarlamak için pam_env.so kullanılır:

# /etc/pam.d/common-session
session required pam_env.so readenv=1 envfile=/etc/environment
# /etc/security/pam_env.conf
# Değişken  Operatör  Değer
JAVA_HOME   DEFAULT=/usr/lib/jvm/java-17
PATH        DEFAULT=${PATH}:/opt/local/bin
EDITOR      DEFAULT=vim

pam_access.so ile Erişim Kontrolü

Belirli kullanıcıların belirli terminallerden veya IP adreslerinden giriş yapmasını kısıtlamak için pam_access.so kullanılır:

# /etc/pam.d/sshd veya common-account
account required pam_access.so
# /etc/security/access.conf yapılandırması
# Format: izin/engel : kullanıcı : kaynak

# Root sadece lokal konsoldan girebilir
-:root:ALL EXCEPT LOCAL

# Admin grubu her yerden girebilir
+:wheel:ALL

# Belirli IP bloğundan giriş izni
+:ahmet:192.168.1.0/24

# Geri kalan herkesi engelle
-:ALL:ALL

Bu yapılandırma özellikle üretim sunucularında root girişini kısıtlamak için çok işe yarar.

PAM Stack Debugging

PAM sorunlarını debug etmek bazen zorlaşabilir. pam_debug.so modülü ve sistem logları bu konuda yardımcıdır:

# PAM loglarını gerçek zamanlı izle
tail -f /var/log/auth.log          # Debian/Ubuntu
tail -f /var/log/secure            # RHEL/CentOS

# Belirli bir kullanıcı için test girişi yap
su - testkullanici -c "whoami"

# pam_debug.so'yu geçici olarak etkinleştir
# /etc/pam.d/sudo'ya ekle:
# auth optional pam_debug.so

Sistemd tabanlı sistemlerde journald loglarını da inceleyebilirsiniz:

# PAM ile ilgili tüm logları göster
journalctl -t pam -f

# Belirli bir servis için PAM logları
journalctl _SYSTEMD_UNIT=sshd.service | grep pam

Özel Senaryo: Web Sunucusu Ortamı için Kapsamlı PAM Yapılandırması

Bir web sunucusunda güvenliği sıkılaştırmak için birden fazla modülü birlikte kullanalım. Bu senaryoda SSH erişimi, şifre politikaları ve kaynak limitleri bir arada yapılandırılıyor:

# /etc/pam.d/sshd - Kapsamlı SSH PAM yapılandırması
# Kimlik doğrulama katmanı
auth        required      pam_faillock.so preauth silent deny=3 unlock_time=600
auth        required      pam_access.so
auth        sufficient    pam_unix.so
auth        [default=die] pam_faillock.so authfail
auth        required      pam_deny.so

# Hesap kontrolü
account     required      pam_nologin.so
account     required      pam_unix.so
account     required      pam_faillock.so

# Şifre politikası
password    requisite     pam_pwquality.so retry=3 minlen=14 dcredit=-1 ucredit=-2 ocredit=-1 lcredit=-1 difok=3
password    required      pam_unix.so sha512 shadow remember=10

# Oturum yönetimi
session     required      pam_limits.so
session     required      pam_unix.so
session     optional      pam_lastlog.so showfailed

pam_lastlog.so modülü kullanıcıya son başarısız giriş denemelerini gösterir. Bu özellikle güvenlik farkındalığı açısından faydalıdır.

pam_script.so ile Özel İşlemler

Kullanıcı girişinde veya çıkışında özel scriptler çalıştırmak için pam_script.so kullanılabilir. Önce paketi yükleyin:

apt install libpam-script    # Debian/Ubuntu
# /etc/pam.d/common-session
session optional pam_script.so
# /etc/pam-script.d/pam_script_ses adında script oluştur
#!/bin/bash
# Kullanıcı girişini özel log dosyasına kaydet

LOG_FILE="/var/log/custom_auth.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

if [ "$PAM_TYPE" = "open_session" ]; then
    echo "$TIMESTAMP - GIRIS: Kullanici=$PAM_USER, Host=$PAM_RHOST, TTY=$PAM_TTY" >> $LOG_FILE
elif [ "$PAM_TYPE" = "close_session" ]; then
    echo "$TIMESTAMP - CIKIS: Kullanici=$PAM_USER" >> $LOG_FILE
fi

chmod 644 $LOG_FILE
chmod +x /etc/pam-script.d/pam_script_ses

Yaygın Hatalar ve Çözümleri

PAM yapılandırmasında yapılan hatalar sistemi tamamen kilitleyebilir. Bu nedenle dikkat edilmesi gereken noktalar:

  • Her zaman yedek terminal açık tutun: PAM dosyalarını düzenlerken başka bir root terminal açık bırakın. Yanlış yapılandırmada geri dönebilmeniz için bunu yapmak zorunludur.
  • Test etmeden uygulamaya almayın: su veya test kullanıcısıyla önce deneyin.
  • common-auth değişikliklerinde dikkatli olun: Bu dosya tüm servisleri etkiler. Sadece sshd veya sudo dosyasını değiştirmek daha güvenlidir.
  • Syntax hatalarına dikkat edin: PAM dosyaları syntax kontrolü yapmaz, hatalı yapılandırma anında etkili olur.
# PAM modülünün varlığını kontrol et
ls -la /lib/x86_64-linux-gnu/security/pam_faillock.so
ls -la /lib64/security/pam_faillock.so  # RHEL için

# Modülleri listele
find /lib -name "pam_*.so" 2>/dev/null | sort
find /lib64 -name "pam_*.so" 2>/dev/null | sort

Yapılandırmayı Test Etme

Değişiklikleri uygulamadan önce test etmek kritik önem taşır:

# pamtester aracını kur
apt install pamtester

# Belirli bir servis için auth testini çalıştır
pamtester -v sshd testkullanici authenticate

# Sudo PAM yapılandırmasını test et
pamtester -v sudo ahmet authenticate

# pam_pwquality testi
echo "test" | cracklib-check

Ayrıca pam_config aracı Debian/Ubuntu sistemlerde PAM modüllerini güvenli şekilde yönetmenizi sağlar:

# Mevcut PAM yapılandırmasını göster
pam-auth-update --list

# Interaktif yapılandırma arayüzünü aç
pam-auth-update

Sonuç

PAM, Linux güvenlik mimarisinin bel kemiğini oluşturur. Doğru yapılandırıldığında brute force saldırılarına karşı hesap kilitleme, güçlü şifre politikaları, çok faktörlü doğrulama ve erişim kontrolü gibi katmanları merkezi bir noktadan yönetebilirsiniz.

Özetlemek gerekirse:

  • pam_faillock.so ile başarısız giriş denemelerini sınırlayın, kritik sunucularda deny=3 ve unlock_time=900 iyi bir başlangıç noktasıdır
  • pam_pwquality.so ile şifre politikalarını zorunlu kılın, özellikle minlen=12 ve karmaşıklık kurallarını ihmal etmeyin
  • pam_access.so ile IP ve terminal bazlı erişim kısıtlamaları ekleyin
  • pam_google_authenticator.so ile kritik erişimler için iki faktörlü doğrulamayı devreye alın
  • Her değişikliği /var/log/auth.log veya /var/log/secure üzerinden takip edin

En önemli kural şu: PAM yapılandırmasını değiştirirken her zaman açık bir kurtarma terminaliniz olsun. Yanlış bir satır tüm sistemi kilitleyebilir ve recovery moduna girmek zorunda kalabilirsiniz. Üretim ortamında önce test sunucusunda deneyin, ardından değişiklikleri uygulayın.

Yorum yapın