Linux’ta Hesap Kilitleme ve Başarısız Giriş Yönetimi

Bir sisteme yetkisiz erişim girişimlerinin büyük çoğunluğu brute-force saldırılarıyla başlar. Saldırgan bir kullanıcı adı bilir ya da tahmin eder ve şifreyi tekrar tekrar dener. Eğer sistemde herhangi bir kısıtlama yoksa bu deneme yanılma süreci otomatize araçlarla saniyeler içinde binlerce kombinasyonu test edebilir. İşte bu noktada hesap kilitleme ve başarısız giriş yönetimi devreye girer. Bu yazıda Linux sistemlerde hesap kilitleme mekanizmalarını, başarısız girişlerin nasıl izleneceğini ve gerçek dünya senaryolarında bu yapıların nasıl kurulacağını detaylıca ele alacağız.

Hesap Kilitleme Neden Kritik?

Çoğu sysadmin güvenlik duvarı kuralları, SSH hardening ve SELinux politikalarıyla ilgilenirken hesap kilitleme mekanizmalarını göz ardı eder. Oysa bir kullanıcı hesabı sınırsız giriş denemesine açıksa, diğer tüm önlemler ikinci planda kalabilir.

Gerçek bir senaryodan bahsedelim: Bir müşterimizin CentOS sunucusunda fail2ban kurulu değildi ve PAM yapılandırması varsayılan haldeydi. /var/log/secure dosyasını incelediğimizde 48 saat içinde tek bir IP adresinden 180.000’den fazla başarısız SSH giriş denemesi yapıldığını gördük. Sistem ayaktaydı çünkü şifre yeterince güçlüydü, ama bu durum fark edilmeden günlerce devam etmişti. İşte bu tür senaryolara karşı proaktif önlemler almak, bir sysadmin’in temel görevlerinden biridir.

PAM ile Hesap Kilitleme: pam_tally2 ve pam_faillock

Linux sistemlerde hesap kilitleme için birincil araç PAM (Pluggable Authentication Modules) sistemidir. Eski sistemlerde pam_tally2, modern sistemlerde ise pam_faillock modülü kullanılır.

pam_faillock Yapılandırması (RHEL/CentOS 8+, Ubuntu 20.04+)

pam_faillock modülü, başarısız giriş denemelerini takip eder ve belirlenen eşik aşıldığında hesabı kilitler. Önce modülün mevcut durumunu kontrol edelim:

# Mevcut faillock yapılandırmasını kontrol et
authselect current

# faillock durumunu görüntüle (belirli bir kullanıcı için)
faillock --user kullanici_adi

# Tüm kilitli hesapları listele
faillock

/etc/security/faillock.conf dosyasını yapılandıralım:

# /etc/security/faillock.conf dosyasını düzenle
sudo nano /etc/security/faillock.conf

Dosyanın içeriği şu şekilde olmalı:

# Kaç saniye içindeki başarısız denemeleri say
deny = 5
# 5 başarısız denemeden sonra kilitle

# Kilitleme süresi (saniye cinsinden, 0 = manuel kilit açma gerekli)
unlock_time = 900
# 15 dakika sonra otomatik kilit açılır

# Kök hesabı da kilitleme kuralına dahil et
even_deny_root = true
root_unlock_time = 60

# Log dosyası
audit

# Hangi IP'lerden geldiğini de logla
silent = false

PAM Yapılandırma Dosyalarını Düzenleme

/etc/pam.d/system-auth ve /etc/pam.d/password-auth dosyalarını düzenlemek gerekir. RHEL tabanlı sistemlerde:

# system-auth dosyasını düzenle
sudo nano /etc/pam.d/system-auth

# Dosya içeriği şu şekilde olmalı:
# auth bölümüne eklenecek satırlar:
# auth        required      pam_faillock.so preauth
# (mevcut auth satırlarından sonra)
# auth        required      pam_faillock.so authfail
# auth        sufficient    pam_faillock.so authsucc

# account bölümüne:
# account     required      pam_faillock.so

Ubuntu/Debian tabanlı sistemlerde common-auth dosyası kullanılır:

# Ubuntu'da PAM yapılandırması
sudo nano /etc/pam.d/common-auth

# Dosyaya şu satırı ekle (en üste):
auth required pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=900

# auth [default=die] pam_faillock.so authfail satırını da ekle
# En sona:
auth sufficient pam_faillock.so authsucc

Kilitli Hesabı Manuel Olarak Açma

Bir kullanıcı hesabı kilitlendiğinde sistem yöneticisi manuel müdahale yapabilir:

# Belirli bir kullanıcının kilidini aç
sudo faillock --user ali --reset

# pam_tally2 kullanan eski sistemlerde (RHEL 7, CentOS 7):
sudo pam_tally2 --user=ali --reset

# Kullanıcının mevcut kilitleme durumunu sorgula
faillock --user ali

passwd ve usermod ile Hesap Yönetimi

PAM seviyesinin dışında, sistem yöneticileri doğrudan kullanıcı hesaplarını da kilitleyip açabilir.

# Kullanıcı hesabını kilitle
sudo passwd -l kullanici_adi
# veya
sudo usermod -L kullanici_adi

# Hesabı tekrar aktif et
sudo passwd -u kullanici_adi
sudo usermod -U kullanici_adi

# Hesap durumunu kontrol et
sudo passwd -S kullanici_adi
# Çıktıda "L" harfi hesabın kilitli olduğunu gösterir
# Çıktıda "P" harfi aktif şifre olduğunu gösterir

# Hesabın son giriş bilgilerini ve kilitleme durumunu görüntüle
sudo chage -l kullanici_adi

passwd -S çıktısını okumayı bilmek önemlidir:

  • L: Hesap kilitli
  • P: Şifre aktif
  • NP: Şifre yok
  • Tarihler: Son şifre değişikliği, son kullanma tarihi, uyarı süresi

Fail2ban: Servis Seviyesinde Koruma

fail2ban PAM’dan bağımsız çalışır ve log dosyalarını izleyerek belirlenen kurala uyan IP adreslerini otomatik olarak iptables veya firewalld ile engeller. SSH’ın yanı sıra Apache, Nginx, vsftpd gibi servisleri de koruyabilir.

Fail2ban Kurulum ve Temel Yapılandırma

# RHEL/CentOS
sudo dnf install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Ubuntu/Debian
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Yerel yapılandırma dosyası oluştur
# ASLA jail.conf'u doğrudan düzenleme, çünkü güncellemede kaybolur
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

jail.local dosyasında kritik ayarlar:

[DEFAULT]
# Kaç dakikalık pencerede denemeleri say
findtime  = 10m

# Kaç başarısız denemede ban uygula
maxretry = 5

# Ne kadar süre ban uygula
bantime  = 1h

# Bu IP'leri asla banlama (kendi yönetim IP'lerini ekle)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.5

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 24h

[apache-auth]
enabled = true
port    = http,https
logpath = %(apache_error_log)s
maxretry = 6

[nginx-http-auth]
enabled = true
port    = http,https
logpath = %(nginx_error_log)s

Fail2ban Yönetim Komutları

# fail2ban durumunu genel olarak görüntüle
sudo fail2ban-client status

# Belirli bir jail'in durumunu görüntüle
sudo fail2ban-client status sshd

# Manuel olarak bir IP'yi ban listesine ekle
sudo fail2ban-client set sshd banip 192.168.100.50

# Bir IP'nin banını kaldır
sudo fail2ban-client set sshd unbanip 192.168.100.50

# Mevcut ban listesini görüntüle
sudo fail2ban-client get sshd banned

# fail2ban loglarını takip et
sudo tail -f /var/log/fail2ban.log

Başarısız Giriş Girişimlerini İzleme

Başarısız girişleri takip etmek hem güvenlik olaylarını tespit etmek hem de hangi hesapların hedef alındığını anlamak için kritiktir.

last, lastb ve lastlog Komutları

# Son başarılı girişleri listele
last -20

# Son başarısız girişleri listele (root yetkisi gerekebilir)
sudo lastb -20

# Belirli bir kullanıcının başarısız girişlerini filtrele
sudo lastb ali | head -20

# Her kullanıcının son giriş zamanını göster
lastlog

# lastlog'da hiç giriş yapmamış hesapları filtrele
lastlog | grep "Never logged in"

# Son 24 saatteki başarısız girişleri say (IP bazında)
sudo lastb --since yesterday | awk '{print $3}' | sort | uniq -c | sort -rn | head -20

Log Dosyalarını Manuel İnceleme

# RHEL/CentOS - auth logları
sudo grep "Failed password" /var/log/secure | tail -50

# Ubuntu/Debian - auth logları
sudo grep "Failed password" /var/log/auth.log | tail -50

# Başarısız denemeleri IP bazında grupla ve say
sudo grep "Failed password" /var/log/auth.log | 
  grep -oP '(?<=from )S+' | 
  sort | uniq -c | sort -rn | head -20

# Hedef alınan kullanıcı adlarını listele
sudo grep "Invalid user" /var/log/auth.log | 
  awk '{print $8}' | sort | uniq -c | sort -rn | head -20

# Belirli bir zaman aralığındaki başarısız girişler
sudo grep "Failed password" /var/log/auth.log | 
  grep "Dec 15" | wc -l

journalctl ile Sistem Loglarını İzleme

Systemd tabanlı sistemlerde journalctl çok daha güçlü filtreleme imkanı sunar:

# SSH servisine ait başarısız girişleri göster
sudo journalctl -u sshd --since "1 hour ago" | grep "Failed"

# Son 100 başarısız giriş girişimi
sudo journalctl -u sshd | grep "Failed password" | tail -100

# Gerçek zamanlı SSH log takibi
sudo journalctl -u sshd -f

# Belirli bir kullanıcı için auth eventlerini filtrele
sudo journalctl _COMM=sshd | grep "user ali" | tail -20

Şifre Politikası ile Hesap Kilitlemeyi Birleştirme

Hesap kilitleme tek başına yeterli değildir. Güçlü şifre politikasıyla birleştirilmesi gerekir. pam_pwquality modülü bu amaç için kullanılır:

# pam_pwquality yapılandırması
sudo nano /etc/security/pwquality.conf

Örnek yapılandırma:

# Minimum şifre uzunluğu
minlen = 12

# En az 1 büyük harf
ucredit = -1

# En az 1 küçük harf
lcredit = -1

# En az 1 rakam
dcredit = -1

# En az 1 özel karakter
ocredit = -1

# Ardışık aynı karakter sayısı limiti
maxrepeat = 3

# Kullanıcı adını şifrede kullanmayı engelle
usercheck = 1

# Son kaç şifreyi hatırla (şifre geçmişi)
# Bu ayar pam_pwhistory ile yapılır

Şifre geçmişini zorlamak için /etc/pam.d/system-auth dosyasına şu satırı ekle:

# Şifre bölümüne ekle:
password    required      pam_pwhistory.so remember=10 use_authtok

Hesap Süre Yönetimi ile Kilitleme

chage komutu hesap ve şifre geçerlilik sürelerini yönetir. Bu da dolaylı olarak hesap kilitleme mekanizmasının bir parçasıdır:

# Kullanıcı hesabının şifre politikasını görüntüle
sudo chage -l ali

# Şifrenin maksimum geçerlilik süresini 90 gün yap
sudo chage -M 90 ali

# Şifre değiştirilmeden önce minimum bekleme süresi (gün)
sudo chage -m 1 ali

# Şifre süresi dolmadan 14 gün önce uyarı ver
sudo chage -W 14 ali

# Hesabın belirli bir tarihte otomatik kapanmasını sağla
sudo chage -E 2025-03-31 ali

# Hesabı hemen kilitle (şifre süresini geçmişe al)
sudo chage -E 1 ali
# Tarihi 1970-01-02 olarak ayarlar, hesap anında geçersiz olur

# Şifre değişikliğini bir sonraki girişte zorla
sudo chage -d 0 ali

Gerçek Dünya Senaryosu: Toplu Hesap Güvenliği Denetimi

Onlarca kullanıcısı olan bir sistemde hangi hesapların riskli olduğunu hızlıca tespit etmek için bir script yazalım:

#!/bin/bash
# hesap_denetim.sh - Hesap güvenliği denetim scripti

echo "=== HESAP GÜVENLİK DENETİMİ ==="
echo "Tarih: $(date)"
echo ""

echo "### Kilitli Hesaplar ###"
awk -F: '($2 ~ /^!/) {print $1}' /etc/shadow

echo ""
echo "### Şifresi Olmayan Hesaplar ###"
awk -F: '($2 == "" || $2 == "!!" ) {print $1}' /etc/shadow

echo ""
echo "### Süresi Geçmiş Hesaplar ###"
for user in $(awk -F: '{print $1}' /etc/passwd); do
    expiry=$(chage -l $user 2>/dev/null | grep "Account expires" | awk -F: '{print $2}' | xargs)
    if [ "$expiry" != "never" ] && [ ! -z "$expiry" ]; then
        echo "$user: $expiry"
    fi
done

echo ""
echo "### Son 30 Gün İçinde Giriş Yapmamış Aktif Hesaplar ###"
lastlog | awk 'NR>1 && $2!="**Never" {print}' | 
  awk -v d="$(date -d '30 days ago' '+%b %d %Y')" 
  'NF>1 && $4" "$5" "$9 < d {print $1}'

echo ""
echo "### Şifresi Son 90 Günde Değiştirilmemiş Hesaplar ###"
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" | awk -F: '{print $2}' | xargs)
    echo "$user: Son şifre değişikliği - $last_change"
done

echo ""
echo "=== DENETİM TAMAMLANDI ==="

Bu scripti çalıştırmak için:

sudo chmod +x hesap_denetim.sh
sudo ./hesap_denetim.sh | tee /var/log/hesap_denetim_$(date +%Y%m%d).log

SSH Özelinde Ek Önlemler

PAM ve fail2ban’a ek olarak SSH yapılandırmasında da kısıtlamalar tanımlamak gerekir:

sudo nano /etc/ssh/sshd_config

Kritik ayarlar:

# Maksimum başarısız deneme sayısı
MaxAuthTries 3

# Boşta kalan bağlantıları kapat
LoginGraceTime 30

# Root ile direkt SSH girişini engelle
PermitRootLogin no

# Şifre ile girişi kapat, sadece SSH key kullan
PasswordAuthentication no

# Boş şifre ile girişi kesinlikle engelle
PermitEmptyPasswords no

# Sadece belirli kullanıcıların SSH ile giriş yapmasına izin ver
AllowUsers ali mehmet deploy_user

# Veya sadece belirli grupları izin ver
AllowGroups sshusers devops

# X11 yönlendirmesini kapat (gereksizse)
X11Forwarding no

# TCP keepalive ile ölü bağlantıları temizle
ClientAliveInterval 300
ClientAliveCountMax 2

Değişiklikleri uygulamak için:

# Yapılandırma dosyasını syntax kontrolünden geçir
sudo sshd -t

# SSH servisini yeniden başlat
sudo systemctl restart sshd

Kilitleme Olaylarına Alerting Eklemek

Hesap kilitleme olaylarını gerçek zamanlı izlemek için basit bir alert mekanizması kurabiliriz:

#!/bin/bash
# ssh_alert.sh - Başarısız giriş alerting scripti
# /etc/cron.d/ssh_alert ile her 5 dakikada çalıştır

LOGFILE="/var/log/auth.log"
THRESHOLD=10
ALERT_EMAIL="[email protected]"
TEMPFILE="/tmp/ssh_failures_$(date +%Y%m%d%H%M)"

# Son 5 dakikadaki başarısız girişleri al
grep "Failed password" $LOGFILE | 
  grep "$(date +'%b %e %H:%M' -d '5 minutes ago' | sed 's/  / /')" 
  > $TEMPFILE 2>/dev/null

FAILURE_COUNT=$(wc -l < $TEMPFILE)

if [ $FAILURE_COUNT -ge $THRESHOLD ]; then
    SUBJECT="UYARI: $FAILURE_COUNT SSH başarısız giriş denemesi tespit edildi - $(hostname)"
    BODY="Son 5 dakika içinde $FAILURE_COUNT başarısız SSH giriş denemesi:nn$(cat $TEMPFILE)"
    echo -e "$BODY" | mail -s "$SUBJECT" $ALERT_EMAIL
    logger -p auth.warning "SSH brute-force şüphesi: $FAILURE_COUNT başarısız deneme"
fi

rm -f $TEMPFILE

Cron ile zamanlama:

# Her 5 dakikada çalıştır
echo "*/5 * * * * root /usr/local/bin/ssh_alert.sh" > /etc/cron.d/ssh_alert

Sonuç

Hesap kilitleme ve başarısız giriş yönetimi, Linux güvenliğinin göz ardı edilemeyecek katmanlarından biridir. Bu yazıda ele aldığımız konuları özetlersek:

  • PAM pam_faillock ile sistem genelinde hesap kilitleme politikası tanımlanmalı, kilitleme eşiği ve süresi kurumun risk iştahına göre ayarlanmalıdır.
  • fail2ban servis seviyesinde IP bazlı engelleme sağlar ve SSH’ın ötesinde birçok servisi koruyabilir.
  • lastb, journalctl ve log analizi ile başarısız giriş örüntüleri düzenli olarak incelenmelidir.
  • chage ve passwd komutlarıyla hesap süre yönetimi, şifre politikasıyla birleştirilmelidir.
  • SSH yapılandırması PAM ve fail2ban’ı destekleyecek şekilde sertleştirilmelidir.
  • Denetim scriptleri periyodik çalıştırılarak sistemdeki riskli hesaplar tespit edilmelidir.

Bu mekanizmaları bir arada kullanmak brute-force saldırılarına karşı katmanlı savunma oluşturur. Tek bir araç asla yeterli değildir; ama doğru kurgulanmış bir kombinasyon saldırganın işini son derece güçleştirir. Sisteminizi bu açıdan denetlemek için fazla beklemeyin; bir ihlal sonrası değil, öncesinde harekete geçmek her zaman daha az maliyetlidir.

Yorum yapın