Parola Politikası Zorlama: pam_pwquality ve chage Kullanımı

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.

Yorum yapın