Auth Log Analizi: Yetkisiz Erişim Girişimlerini Tespit Etme
Sunucunuza her gün yüzlerce, belki binlerce yetkisiz erişim girişimi geliyor. Bunu fark etmeyebilirsiniz, çünkü bu girişimlerin büyük çoğunluğu sessizce başarısız oluyor ve logların derinliklerinde kayboluyor gidiyor. Ama o loglar orada, sizi bekliyor. Auth log analizi, bir sistem yöneticisinin en güçlü silahlarından biridir ve bunu düzgün kullanmayı öğrenmek, bir saldırıyı saatler içinde değil, dakikalar içinde fark etmenizi sağlar.
Auth Log Nedir ve Nerede Bulunur?
Linux sistemlerinde kimlik doğrulama ile ilgili tüm olaylar merkezi bir log dosyasına yazılır. Bu dosya, SSH bağlantıları, sudo kullanımı, başarısız login denemeleri, PAM olayları ve daha fazlasını içerir.
Dağıtıma göre bu dosyanın konumu değişir:
- Debian/Ubuntu sistemlerde:
/var/log/auth.log - RHEL/CentOS/Fedora sistemlerde:
/var/log/secure - systemd-journald kullanan sistemlerde:
journalctlkomutuyla erişilir
Dosyayı ilk kez incelemek için basit bir tail komutu yeterlidir:
tail -f /var/log/auth.log
Gerçek bir sunucuda bu dosyayı açtığınızda, saniyeler içinde akan onlarca satırla karşılaşabilirsiniz. Çoğu sistem yöneticisi bu noktada “zaten saldırı yok, her şey normal” diye düşünür ve dosyayı kapatır. Oysa asıl iş burada başlıyor.
Temel Log Formatını Anlamak
Auth log satırları belirli bir format izler. Örnek bir satır şöyle görünür:
Jan 15 03:24:17 webserver01 sshd[12453]: Failed password for root from 192.168.1.105 port 54321 ssh2
Jan 15 03:24:19 webserver01 sshd[12453]: Failed password for root from 192.168.1.105 port 54321 ssh2
Jan 15 03:24:21 webserver01 sshd[12453]: Failed password for invalid user admin from 192.168.1.105 port 54322 ssh2
Her satırda şu bilgiler bulunur:
- Tarih ve saat:
Jan 15 03:24:17 - Hostname:
webserver01 - Servis adı ve PID:
sshd[12453] - Mesaj içeriği: Başarısız giriş, kullanıcı adı, kaynak IP ve port
Bu üç satıra baktığınızda bir şey dikkatinizi çekiyor olmalı: 2 saniyelik aralıklarla gelen, aynı IP’den farklı kullanıcı adlarıyla yapılan denemeler. Bu klasik bir brute force saldırısının imzasıdır.
Başarısız Giriş Denemelerini Analiz Etmek
En Çok Deneme Yapan IP’leri Tespit Etmek
Hangi IP adreslerinin en çok başarısız giriş denemesi yaptığını bulmak için grep, awk ve sort komutlarını birleştirebilirsiniz:
grep "Failed password" /var/log/auth.log |
awk '{print $(NF-3)}' |
sort | uniq -c | sort -rn | head -20
Bu komut size şöyle bir çıktı verecektir:
4821 45.33.32.156
3102 192.99.14.87
2891 178.128.55.141
456 103.99.0.122
234 185.156.73.54
İlk IP’den 4821 başarısız deneme gelmiş. Bu artık brute force değil, tam anlamıyla bir saldırıdır.
Hangi Kullanıcı Adlarının Hedef Alındığını Görmek
Saldırganların hangi kullanıcı adlarını denediğini analiz etmek, onların metodolojisi hakkında fikir verir:
grep "Failed password" /var/log/auth.log |
awk '{print $9}' |
sort | uniq -c | sort -rn | head -20
Tipik bir çıkıda şunu görürsünüz:
8943 root
2341 admin
1205 test
892 ubuntu
743 oracle
521 postgres
334 deploy
Bu liste size saldırganların tahmin listesini gösteriyor. root, admin, test gibi kullanıcı adları her saldırganın listesinin başındadır. Eğer sisteminizde bu kullanıcı adlarıyla aktif hesaplar varsa ve güçlü şifre politikası uygulamıyorsanız, risk altındasınız demektir.
Belirli Bir Zaman Aralığını Analiz Etmek
Gece yarısı ani bir aktivite artışı mı oldu? Belirli bir tarih aralığını incelemek için awk ile filtreleme yapabilirsiniz:
awk '/Jan 15 02:00/,/Jan 15 04:00/' /var/log/auth.log |
grep "Failed password" |
awk '{print $(NF-3)}' |
sort | uniq -c | sort -rn
Bu komut, 15 Ocak gece 02:00 ile 04:00 arasındaki başarısız giriş denemelerini IP bazında listeler. Eğer bu iki saatlik pencerede binlerce deneme görüyorsanız, koordineli bir saldırıyla karşı karşıyasınız demektir.
Başarılı Girişleri İzlemek
Başarısız girişler önemli ama asıl alarm verici olan başarılı girişlerdir. Özellikle beklenmediği saatlerde veya beklenmedik lokasyonlardan gelen başarılı girişler ciddi bir tehlike işareti olabilir.
grep "Accepted password|Accepted publickey" /var/log/auth.log |
awk '{print $1, $2, $3, $9, $11}' |
sort -k4
Çıktıda her başarılı bağlantının tarih, saat, kullanıcı adı ve kaynak IP’sini göreceksiniz. Burada dikkat etmeniz gereken birkaç nokta var:
- Gece saatlerinde yapılan girişler: Saat 03:00’de kim bağlanıyor?
- Yabancı ülke IP’leri: Türkiye’de bir şirket sunucusuna Rusya veya Çin’den giriş varsa bu şüphelidir
- Şifre ile yapılan girişler: Eğer sunucunuzu sadece key-based authentication ile kullanacak şekilde yapılandırdıysanız,
Accepted passwordgörmeniz ciddi bir sorun işaretidir
Sudo Kullanımını İzlemek
Sisteme giren bir saldırganın ilk yapacağı şey yetki yükseltme denemesidir. Sudo kullanımını izlemek bu açıdan kritiktir:
grep "sudo" /var/log/auth.log |
grep -v "pam_unix" |
tail -50
Başarısız sudo denemeleri şöyle görünür:
Jan 15 14:23:11 webserver01 sudo: john : command not allowed ; TTY=pts/1 ; PWD=/home/john ; USER=root ; COMMAND=/bin/bash
Jan 15 14:23:45 webserver01 sudo: john : 3 incorrect password attempts ; TTY=pts/1 ; PWD=/home/john ; USER=root ; COMMAND=/usr/bin/passwd
john kullanıcısı root shell açmaya ve şifre değiştirmeye çalışmış. Bu, ya ele geçirilmiş bir hesabın işareti ya da yetkisini aşmaya çalışan bir iç tehdit senaryosudur.
Gerçek Dünya Senaryosu: Koordineli Brute Force Saldırısı
Geçen yıl yönettiğim bir e-ticaret sunucusunda şöyle bir durum yaşandı. Sabah 06:00’da monitoring sistemimiz CPU ve network yükünde ani bir artış bildirdi. Auth log’a baktığımda şunu gördüm:
grep "Failed password" /var/log/auth.log |
grep "Jan 22" | wc -l
Çıktı: 47832
Tek bir günde, sadece 6 saatlik bir pencerede neredeyse 50.000 başarısız giriş denemesi. Detaylı analiz yaptığımda:
grep "Failed password" /var/log/auth.log |
grep "Jan 22" |
awk '{print $(NF-3)}' |
sort -u | wc -l
Bu denemeler 234 farklı IP adresinden geliyordu. Tek bir kaynak değil, dağıtık bir botnet saldırısıydı. Her IP belirli aralıklarla az sayıda deneme yaparak rate limiting’i atlatmaya çalışıyordu.
Bu tür saldırıları tespit etmek için şu analizi kullanabilirsiniz:
grep "Failed password" /var/log/auth.log |
awk '{print $1, $2, substr($3,1,5), $(NF-3)}' |
sort | uniq -c |
awk '$1 > 5 {print}' |
sort -rn | head -30
Bu komut, aynı saat diliminde (5 dakikalık pencerede) aynı IP’den 5’ten fazla başarısız deneme yapılan durumları listeler.
Otomatik Analiz Script’i Yazmak
Manuel analizler güzel ama zamanınız her zaman yetmez. Düzenli çalışacak bir bash script’i bu işi sizin yerinize yapabilir:
#!/bin/bash
LOG_FILE="/var/log/auth.log"
REPORT_FILE="/var/log/auth_analysis_$(date +%Y%m%d).txt"
THRESHOLD=100
echo "=== Auth Log Analiz Raporu - $(date) ===" > $REPORT_FILE
echo "" >> $REPORT_FILE
echo "--- En Cok Basarisiz Giris Yapan IP'ler ---" >> $REPORT_FILE
grep "Failed password" $LOG_FILE |
awk '{print $(NF-3)}' |
sort | uniq -c | sort -rn | head -20 >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "--- Son 24 Saatte Basarili Girisler ---" >> $REPORT_FILE
grep "Accepted" $LOG_FILE |
grep "$(date '+%b %d')" |
awk '{print $1, $2, $3, $9, $11}' >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "--- Esik Degeri Asan IP'ler (> $THRESHOLD deneme) ---" >> $REPORT_FILE
grep "Failed password" $LOG_FILE |
awk '{print $(NF-3)}' |
sort | uniq -c |
awk -v threshold=$THRESHOLD '$1 > threshold {print $2, "->", $1, "deneme"}' >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "--- Sudo Basarisiz Denemeleri ---" >> $REPORT_FILE
grep "sudo.*incorrect password|sudo.*command not allowed" $LOG_FILE |
tail -20 >> $REPORT_FILE
cat $REPORT_FILE
Bu script’i crontab’a ekleyerek her sabah mail olarak alabilirsiniz:
# Crontab'a eklemek için:
# crontab -e
0 7 * * * /usr/local/bin/auth_analysis.sh | mail -s "Gunluk Auth Raporu" [email protected]
journald ile Auth Log Analizi
Systemd kullanan modern sistemlerde journalctl çok daha güçlü sorgulama imkanı sunar:
# Son 24 saatin SSH başarısız girişlerini göster
journalctl -u sshd --since "24 hours ago" |
grep "Failed password" |
awk '{print $(NF-3)}' |
sort | uniq -c | sort -rn | head -10
# Belirli bir kullanıcı için tüm auth olaylarını göster
journalctl _COMM=sshd --since "2024-01-15" --until "2024-01-16" |
grep "john"
# Gerçek zamanlı SSH olaylarını izle
journalctl -u sshd -f
journalctl ile çok daha detaylı sorgular yapabilirsiniz. Özellikle --since ve --until parametreleri belirli zaman aralıklarını incelemeyi kolaylaştırır.
Fail2ban ile Otomatik Önlem Almak
Analiz tek başına yeterli değil, tespit ettiğiniz tehditlere karşı otomatik önlem almanız gerekiyor. Fail2ban bu iş için en yaygın kullanılan araçtır.
Fail2ban kurulumu:
apt install fail2ban # Debian/Ubuntu
# veya
yum install fail2ban # RHEL/CentOS
Temel konfigürasyon (/etc/fail2ban/jail.local):
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
backend = systemd
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
[sshd-ddos]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 10
findtime = 120
bantime = 3600
Bu konfigürasyonla, 10 dakika içinde 3 başarısız deneme yapan IP adresi 24 saat boyunca yasaklanır.
Yasaklanan IP’leri görmek için:
fail2ban-client status sshd
Çıktı size kaç IP’nin yasaklandığını ve hangi IP’lerin aktif olarak engellendiğini gösterir.
Log Rotasyonu ve Arşivleme
Auth loglarınızın silinmediğinden ve düzgün arşivlendiğinden emin olmanız gerekiyor. Bir saldırı sonrasında forensic analiz yapabilmek için geçmişe dönük loglara ihtiyaç duyacaksınız.
/etc/logrotate.d/rsyslog dosyasını kontrol edin:
cat /etc/logrotate.d/rsyslog
Tipik bir konfigürasyon şöyle görünür:
/var/log/auth.log
{
rotate 12
monthly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Bu konfigürasyon logları aylık rotate eder ve 12 ay boyunca saklar. Güvenlik açısından en az 6 ay, ideal olarak 1 yıl log saklamanızı tavsiye ederim. Kritik sistemler için bu süreyi 2 yıla çıkarmayı düşünebilirsiniz.
İleri Seviye: Log Analizi için AWK ve SED Kombinasyonları
Daha karmaşık analizler için awk’ın gücünden tam olarak yararlanabilirsiniz:
# Saatlik dağılıma göre saldırı yoğunluğunu göster
grep "Failed password" /var/log/auth.log |
awk '{
split($3, time, ":")
hours[time[1]]++
}
END {
for (h in hours) {
printf "%s:00 -> %d denemen", h, hours[h]
}
}' | sort
# Aynı anda hem başarısız hem başarılı girişi olan IP'leri bul
# (Bu, credential stuffing saldırısının işareti olabilir)
grep "Failed password|Accepted password" /var/log/auth.log |
awk '{
if ($6 == "Failed") failed[$(NF-3)]++
if ($6 == "Accepted") success[$(NF-3)]++
}
END {
for (ip in success) {
if (failed[ip] > 10) {
printf "DIKKAT - IP: %s, Basarisiz: %d, Basarili: %dn", ip, failed[ip], success[ip]
}
}
}'
İkinci komut özellikle ilginçtir. Hem başarısız hem de başarılı girişi olan IP’ler, credential stuffing saldırısının işareti olabilir. Saldırgan çalıntı şifre listesini denemiş ve bir veya birkaç hesabı ele geçirmeyi başarmış olabilir.
Güvenlik Olayı Tespitinde Dikkat Edilmesi Gereken Desenler
Auth loglarında aşağıdaki desenleri görürseniz hemen harekete geçmelisiniz:
- Kısa sürede çok sayıda farklı kullanıcı adı denemesi: Bu brute force değil, credential stuffing veya user enumeration saldırısıdır
- Başarılı girişin hemen ardından gelen sudo denemeleri: Hesap ele geçirilmiş ve saldırgan yetki yükseltmeye çalışıyor
- Daha önce hiç giriş yapılmamış bir hesaptan gece yarısı giriş: Dormant account takeover senaryosu
- Aynı kullanıcının farklı IP’lerden eş zamanlı girişleri: Paylaşılan hesap kullanımı veya hesap ele geçirme
- Root kullanıcısına şifre ile başarılı giriş: Eğer
PermitRootLogin yesvarsa ve root girişine izin veriyorsanız, bu ciddi bir konfigürasyon hatasıdır
SIEM ile Entegrasyon
Tek bir sunucu için manuel analiz yönetilebilir, ama 20-30 sunucunuz olduğunda bu iş imkansız hale gelir. Bu noktada SIEM (Security Information and Event Management) çözümleri devreye girer.
Açık kaynak alternatifleri arasında ELK Stack (Elasticsearch, Logstash, Kibana) veya Graylog öne çıkar. Temel entegrasyon için Filebeat kurarak logları merkezi sisteme gönderebilirsiniz:
# Filebeat konfigürasyonu (/etc/filebeat/filebeat.yml)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/auth.log
fields:
log_type: auth
server: webserver01
output.elasticsearch:
hosts: ["elasticsearch-server:9200"]
index: "auth-logs-%{+yyyy.MM.dd}"
Bu yapıyla tüm sunucularınızın auth logları merkezi bir sistemde toplanır ve Kibana üzerinden görsel dashboardlar oluşturabilirsiniz.
Sonuç
Auth log analizi, sistem güvenliğinin temel taşlarından biridir. Günde bir kez bile olsa auth loglarınıza bakmak, size sunucunuzun sağlık durumu hakkında kritik bilgiler verir. Brute force saldırıları, hesap ele geçirme girişimleri, iç tehditler ve yetki yükseltme denemeleri, hepsi bu loglarda iz bırakır.
Başlangıç olarak şu adımları izlemenizi öneririm: Önce temel grep komutlarıyla mevcut log durumunuzu değerlendirin. Ardından fail2ban kurarak otomatik korumayı devreye alın. Haftalık analiz raporu oluşturan bir script yazın ve bunu mail ile alın. Loglarınızın düzgün arşivlendiğinden emin olun. Son adım olarak, büyüyen altyapınız için merkezi log yönetim sistemi kurmayı düşünün.
Güvenlik reaktif değil, proaktif bir süreçtir. Saldırı olduğunda değil, olmadan önce tehditleri tespit etmek, bir sistem yöneticisinin en önemli görevidir. Auth loglarınız size bu fırsatı sunuyor, sadece okumayı öğrenmeniz gerekiyor.
