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:
suveya test kullanıcısıyla önce deneyin.
- common-auth değişikliklerinde dikkatli olun: Bu dosya tüm servisleri etkiler. Sadece
sshdveyasudodosyası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=3veunlock_time=900iyi bir başlangıç noktasıdır - pam_pwquality.so ile şifre politikalarını zorunlu kılın, özellikle
minlen=12ve 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.logveya/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.