Sisteminizdeki kullanıcıların “123456” veya “sirket2024” gibi parolalar kullandığını düşünün. Bir güvenlik denetiminde bu durumu fark ettiğinizde çok geç olabilir. Linux’ta parola politikası uygulamak, hem iç tehditlere hem de brute-force saldırılarına karşı ilk savunma hattınızdır. Bu yazıda pam_pwquality modülüyle güçlü parola kuralları nasıl tanımlanır, chage komutuyla parola yaşam döngüsü nasıl yönetilir, bunları gerçek dünya senaryolarıyla birlikte ele alacağız.
pam_pwquality Nedir?
pam_pwquality, PAM (Pluggable Authentication Modules) altyapısı üzerine inşa edilmiş bir modüldür. Eski pam_cracklib modülünün yerini almıştır ve modern RHEL, CentOS, AlmaLinux, Fedora ile Ubuntu sistemlerde varsayılan olarak gelir. Temel görevi, kullanıcı parola değiştirirken veya yeni parola belirlerken tanımladığınız kalite kurallarını zorlamaktır.
Modülün konfigürasyonu iki yerden yönetilir:
- /etc/pam.d/system-auth veya /etc/pam.d/common-password: PAM zinciri içindeki modül tanımı
- /etc/security/pwquality.conf: Modülün ayrıntılı konfigürasyon dosyası
Kurulum ve Temel Kontrol
Çoğu modern dağıtımda pam_pwquality zaten kurulu gelir. Kontrol etmek için:
# RHEL/CentOS/AlmaLinux
rpm -q libpwquality
# Ubuntu/Debian
dpkg -l libpam-pwquality
# Modül dosyasının varlığını kontrol et
ls -la /usr/lib64/security/pam_pwquality.so # RHEL tabanlı
ls -la /usr/lib/x86_64-linux-gnu/security/pam_pwquality.so # Debian tabanlı
Kurulu değilse:
# RHEL/CentOS/AlmaLinux
dnf install libpwquality
# Ubuntu/Debian
apt install libpam-pwquality
PAM Konfigürasyonunda pam_pwquality Tanımı
RHEL/AlmaLinux/CentOS Üzerinde
RHEL tabanlı sistemlerde /etc/pam.d/system-auth ve /etc/pam.d/password-auth dosyalarını düzenlersiniz. Ancak bu dosyaları authselect kullanmadan doğrudan düzenlemek tavsiye edilmez. Manuel düzenleme yapıyorsanız önce yedek alın:
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak
/etc/pam.d/system-auth dosyasında password satırını bulun ve pam_pwquality.so tanımını ekleyin ya da güncelleyin:
# Mevcut durumu görüntüle
grep -n "pam_pwquality|pam_cracklib" /etc/pam.d/system-auth
# Dosyayı düzenle
vi /etc/pam.d/system-auth
Dosyada şu satır bulunmalı (yoksa ekleyin, varsa güncelleyin):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
Ubuntu/Debian Üzerinde
Ubuntu’da ilgili dosya /etc/pam.d/common-password‘dır:
# Mevcut konfigürasyonu görüntüle
cat /etc/pam.d/common-password | grep pwquality
# Düzenle
vi /etc/pam.d/common-password
Şu satırın var olduğundan emin olun:
password requisite pam_pwquality.so retry=3
pwquality.conf ile Parola Kuralları Tanımlamak
Asıl konfigürasyon /etc/security/pwquality.conf dosyasında yapılır. Varsayılan durumda dosya yorum satırlarıyla doludur. Gerçek bir kurumsal ortam için şu ayarları kullanabilirsiniz:
# /etc/security/pwquality.conf
# Minimum parola uzunluğu
minlen = 12
# Büyük harf zorunluluğu (en az 1 büyük harf)
ucredit = -1
# Küçük harf zorunluluğu (en az 1 küçük harf)
lcredit = -1
# Rakam zorunluluğu (en az 1 rakam)
dcredit = -1
# Özel karakter zorunluluğu (en az 1 özel karakter)
ocredit = -1
# Tekrar eden karakterlerin maksimum sayısı (örn: aaa geçersiz)
maxrepeat = 3
# Ardışık aynı sınıftan karakter limiti (örn: abcde geçersiz)
maxsequence = 4
# Kullanıcı adının parola içinde geçmesini engelle
usercheck = 1
# Eski parolanın yeni parolada kaç karakter geçemeyeceği
difok = 5
# Sözlük kontrolü (cracklib üzerinden)
dictcheck = 1
# Palindrom kontrolü
gecoscheck = 1
Parametre Açıklamaları
minlen: Minimum karakter sayısını belirler. 12 günümüz için makul minimum değerdir, hassas sistemlerde 16 yapabilirsiniz.
ucredit: Negatif değer zorunluluk belirtir. -1 en az bir büyük harf demektir. Pozitif değer kredi sistemiyle çalışır, modern kullanımda negatif tercih edilir.
lcredit: Küçük harf zorunluluğu. -1 en az bir küçük harf.
dcredit: Rakam zorunluluğu. -2 yazarsanız en az iki rakam zorunlu olur.
ocredit: Özel karakter zorunluluğu (!@#$%^&* gibi).
maxrepeat: Aynı karakterin arka arkaya kaç kez gelebileceği. 3 yazarsanız aaaa geçersiz olur.
maxsequence: 1234 veya abcd gibi ardışık dizilerin maksimum uzunluğu.
difok: Yeni parola ile eski parolanın kaç karakterinin farklı olması gerektiği. 5 yazarsanız en az 5 karakter değişmeli.
dictcheck: 1 olduğunda cracklib sözlüğüne karşı kontrol yapar. Sifre123! gibi yaygın kombinasyonları reddeder.
usercheck: 1 olduğunda kullanıcı adının parola içinde geçmesini engeller.
gecoscheck: 1 olduğunda /etc/passwd dosyasındaki GECOS alanı bilgilerini (ad, soyad) parola içinde kontrol eder.
Konfigürasyonu Test Etmek
Ayarları yaptıktan sonra mutlaka test edin:
# pwscore komutuyla parola kalitesini test et (0-100 arası puan)
echo "zayifparola" | pwscore
echo "Guclu@Parola#2024!" | pwscore
# pwmake ile rastgele güçlü parola üret (80 bit entropi)
pwmake 80
# Gerçek kullanıcı değişikliğini simüle et
passwd testuser
pwscore komutu 0-100 arası bir puan döndürür. 0 puan parola kabul edilmeyeceği anlamına gelir. 100 ideal paroladır.
Gerçek Dünya Senaryosu 1: Kurumsal Ortam Politikası
Diyelim ki 200 kişilik bir şirkette sistem yöneticisisiniz. Bilgi güvenliği ekibi şu politikayı talep ediyor: En az 14 karakter, büyük/küçük harf, rakam ve özel karakter zorunlu, kullanıcı adı ve isim içeremez, son 5 parola tekrar kullanamaz.
Son 5 parola hatırlama için /etc/pam.d/system-auth dosyasına pam_pwhistory.so eklemeniz gerekir:
# /etc/pam.d/system-auth dosyasında password bloğu şöyle görünmeli:
# password requisite pam_pwquality.so try_first_pass retry=3
# password required pam_pwhistory.so use_authtok remember=5
# password sufficient pam_unix.so sha512 shadow use_authtok
Ve pwquality.conf ayarları:
cat > /etc/security/pwquality.conf << 'EOF'
minlen = 14
ucredit = -1
lcredit = -1
dcredit = -1
ocredit = -1
maxrepeat = 2
maxsequence = 3
difok = 6
usercheck = 1
gecoscheck = 1
dictcheck = 1
badwords = sirket company corp
EOF
badwords parametresi, şirket adı veya öngörülebilir kelimeleri parola içinde yasaklamak için kullanışlıdır.
chage ile Parola Yaşam Döngüsü Yönetimi
pam_pwquality parolanın kalitesini kontrol ederken, chage komutu parolanın ne zaman değiştirilmesi gerektiğini, ne kadar süre geçerli olduğunu ve hesap süresini yönetir. /etc/shadow dosyasındaki alanları değiştirir.
chage Temel Kullanımı
# Kullanıcının mevcut parola bilgilerini görüntüle
chage -l ahmet
# Çıktı şu alanları gösterir:
# Last password change
# Password expires
# Password inactive
# Account expires
# Minimum number of days between password change
# Maximum number of days between password change
# Number of days of warning before password expires
Önemli chage Parametreleri
-d: Son parola değişiklik tarihini ayarlar. -d 0 kullanıcının bir sonraki girişte parolasını değiştirmesini zorlar.
-m: Parola değiştirmek için minimum bekleme süresi (gün). 1 yaparsanız kullanıcı aynı gün tekrar değiştiremez, böylece eski parolaya dönmeyi engellemiş olursunuz.
-M: Parola maksimum geçerlilik süresi (gün). 90 yazarsanız 90 günde bir parola değişmeli.
-W: Parola sona ermeden kaç gün önce uyarı verilsin.
-I: Parola sona erdikten kaç gün sonra hesap kilitlensin (inactive).
-E: Hesabın sona ereceği tarih. YYYY-AA-GG formatında veya epoch gün sayısı.
Kurumsal Politika Uygulama
# Tek kullanıcıya parola politikası uygula
chage -m 1 -M 90 -W 14 -I 30 ahmet
# Bir sonraki girişte parola değiştirmeyi zorla
chage -d 0 ahmet
# Hesap bitiş tarihi belirle (sözleşmeli personel için)
chage -E 2024-12-31 sozlesmeli_user
# Toplu kullanıcılara politika uygula
for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
chage -m 1 -M 90 -W 14 -I 30 "$user"
echo "$user için politika uygulandı"
done
/etc/login.defs ile Varsayılan Değerleri Ayarlamak
chage mevcut kullanıcıları etkiler. Yeni oluşturulacak kullanıcılar için varsayılan değerleri /etc/login.defs dosyasından ayarlarsınız:
# /etc/login.defs dosyasını düzenle
vi /etc/login.defs
# Şu değerleri ayarlayın:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 14
PASS_MIN_LEN 12
Bu ayarlar, useradd ile yeni oluşturulan hesaplar için otomatik uygulanır. Mevcut hesapları etkilemez, bu yüzden yukarıdaki toplu chage komutunu çalıştırmanız gerekir.
Gerçek Dünya Senaryosu 2: Yeni Çalışan Onboarding Scripti
HR’dan kullanıcı listesi geldiğinde tek tek uğraşmak yerine bir script hazırlayabilirsiniz:
#!/bin/bash
# create_user_with_policy.sh
# Kullanım: ./create_user_with_policy.sh kullanici_adi "Ad Soyad" departman
USERNAME=$1
FULLNAME=$2
DEPARTMENT=$3
if [ -z "$USERNAME" ] || [ -z "$FULLNAME" ]; then
echo "Kullanim: $0 kullanici_adi 'Ad Soyad' departman"
exit 1
fi
# Kullanıcı oluştur
useradd -m -c "$FULLNAME" -s /bin/bash "$USERNAME"
# Geçici parola belirle (kullanıcı ilk girişte değiştirmeli)
TEMP_PASS=$(pwmake 80)
echo "$USERNAME:$TEMP_PASS" | chpasswd
# Parola politikasını uygula
chage -m 1 -M 90 -W 14 -I 30 -d 0 "$USERNAME"
# Departman grubuna ekle
if [ -n "$DEPARTMENT" ]; then
groupadd -f "$DEPARTMENT"
usermod -aG "$DEPARTMENT" "$USERNAME"
fi
echo "========================================"
echo "Kullanici olusturuldu: $USERNAME"
echo "Gecici Parola: $TEMP_PASS"
echo "Not: Kullanici ilk giriste parolayi degistirmeli"
echo "========================================"
# Geçici parolayı bir log dosyasına kaydet (güvenli bir şekilde iletilmeli)
echo "$(date): $USERNAME olusturuldu, $FULLNAME, $DEPARTMENT" >> /var/log/user_creation.log
Gerçek Dünya Senaryosu 3: Süresi Dolan Parolaları Tespit Etme
Sysadmin olarak periyodik olarak süresi dolan veya yakında dolacak parolaları takip etmeniz gerekir:
#!/bin/bash
# password_audit.sh - Parola durumu raporu
echo "=== PAROLA DURUM RAPORU ==="
echo "Tarih: $(date)"
echo ""
echo "--- Suresi Dolmus veya Bugün Dolacak Parolalar ---"
for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
# chage -l çıktısından gün sayısını hesapla
exp_date=$(chage -l "$user" 2>/dev/null | grep "Password expires" | cut -d: -f2 | xargs)
if [ "$exp_date" != "never" ] && [ -n "$exp_date" ]; then
exp_epoch=$(date -d "$exp_date" +%s 2>/dev/null)
now_epoch=$(date +%s)
days_left=$(( (exp_epoch - now_epoch) / 86400 ))
if [ "$days_left" -le 7 ] 2>/dev/null; then
echo " $user: $days_left gun kaldi (Son gun: $exp_date)"
fi
fi
done
echo ""
echo "--- Hic Parola Degistirmemis Kullanicilar ---"
for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
last_change=$(chage -l "$user" 2>/dev/null | grep "Last password change" | cut -d: -f2 | xargs)
if [ "$last_change" = "never" ]; then
echo " $user: Hic parola degistirmemis"
fi
done
echo ""
echo "--- Suresi Gecmis Parolasi Olan Kullanicilar (Hesap Kilitli Olabilir) ---"
awk -F: '($2 ~ /^[^!*]/) && ($5 != "" && $5 != 99999) {
if ($3 + $5 < systime()/86400) print $1 " parolasi suresi gecmis"
}' /etc/shadow
useradd Varsayılanlarını Yapılandırma
/etc/default/useradd dosyası, useradd komutunun davranışını etkiler:
# Mevcut varsayılanları görüntüle
useradd -D
# Varsayılan değerleri değiştir
useradd -D -e 0 # Hesap süre sonu yok (varsayılan)
useradd -D -f 30 # Parola sona erdikten 30 gün sonra hesabı devre dışı bırak
# /etc/default/useradd dosyasını direkt düzenleyebilirsiniz
cat /etc/default/useradd
Sistem Geneli Politika Doğrulama
Yaptığınız tüm ayarların doğru çalışıp çalışmadığını doğrulamak için:
# Test kullanıcısı oluştur ve politikaları test et
useradd -M testpolicy_user
echo "testpolicy_user:Baslangic@123!" | chpasswd
# Zayıf parola deneme (reddedilmeli)
echo "123456" | passwd --stdin testpolicy_user 2>&1
# veya Ubuntu'da:
echo -e "123456n123456" | passwd testpolicy_user 2>&1
# Güçlü parola deneme (kabul edilmeli)
echo "Guvenli@Parola#2024" | passwd --stdin testpolicy_user 2>&1
# Test kullanıcısını temizle
userdel -r testpolicy_user
# PAM konfigürasyonunu doğrula
authconfig --test 2>/dev/null || echo "authconfig yok, manuel kontrol gerekli"
# /etc/shadow'da politika değerlerini kontrol et
grep "testpolicy|ahmet" /etc/shadow | cut -d: -f1,2,3,4,5,6,7,8
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
PAM dosyalarını yanlış düzenlemek: /etc/pam.d/ altındaki dosyaları yanlış yapılandırmak sisteme girişi tamamen engelleyebilir. Her değişiklikten önce yedek alın ve mutlaka ayrı bir terminal oturumunu açık tutun.
root kullanıcısının etkilenmemesi: pam_pwquality varsayılan olarak root için uyarı verir ama zorlamaz. enforce_for_root parametresini eklerseniz root da dahil edilir:
# pwquality.conf'a ekle
echo "enforce_for_root" >> /etc/security/pwquality.conf
LDAP/AD entegrasyonunda çakışma: SSSD veya winbind kullanan ortamlarda parola politikası Active Directory’den de gelebilir. Çift politika uygulanmasını önlemek için dikkatli olun.
Çok katı politika kullanıcı deneyimini bozabilir: maxrepeat = 1 veya difok = 10 gibi aşırı katı kurallar kullanıcıları güvensiz davranışlara (parolayı kağıda yazmak gibi) yönlendirebilir. Denge önemlidir.
Sonuç
pam_pwquality ve chage birbirini tamamlayan iki araçtır. pam_pwquality parolanın ne kadar güçlü olduğunu denetlerken, chage ve /etc/login.defs parolanın yaşam döngüsünü yönetir. Bu ikisini birlikte doğru yapılandırdığınızda:
- Zayıf parolalar sisteme giremez
- Parolalar belirli aralıklarla yenilenir
- Eski parolaların tekrar kullanılması engellenir
- Hesapların süresi kontrollü şekilde dolar
Gerçek dünyada bu araçları kurmak birkaç dakika sürer, ancak asıl iş politikayı doğru belirlemektir. Çok katı politika kullanıcı direnişine, çok gevşek politika güvenlik açıklarına yol açar. Kullanıcı sayısı, sistemin hassasiyeti ve organizasyonun güvenlik olgunluğuna göre değerleri ince ayarlayın. Bir kez yapılandırdıktan sonra periyodik denetim scriptleriyle takip edin ve güvenlik ekibinizle politikayı düzenli olarak gözden geçirin.