Güvenlik Logları: Saldırı İzlerini Tespit Etme

Bir sabah işe gelip sunuculardan gelen alarm e-postalarını okumak yerine, log dosyalarına bakarak “buraya biri girmiş mi?” sorusunu sormak zorunda kalmak, sysadmin hayatının en heyecanlı ve bir o kadar da stresli anlarından biridir. Güvenlik logları, tam da bu anda seni kurtaracak en değerli kaynaktır. Ama ham haliyle loglar, içinden çıkılması güç bir gürültü yığınıdır. Bu yazıda, gerçek saldırı izlerini bu gürültünün arasından nasıl çekeceğini, hangi araçları kullanacağını ve olayları nasıl yorumlayacağını adım adım anlatacağım.

Güvenlik Loglarına Neden Bu Kadar Önem Verilmeli?

Çoğu sysadmin, bir şeyler bozulana kadar loglara bakmaz. Bu yaklaşım, yangın söndürücüyü ancak yangın çıkınca aramaya benzer. Oysa loglar, bir saldırının gerçekleşmeden önce, gerçekleşirken ve gerçekleştikten sonraki izlerini barındırır.

Bir saldırganın sisteme girmesi için genellikle birkaç aşamadan geçmesi gerekir: keşif (reconnaissance), erişim kazanma, yetki yükseltme ve kalıcılık sağlama. Bu aşamaların her biri log dosyalarına iz bırakır. Sen bu izleri okumayı öğrendiğinde, sadece olayı tespit etmekle kalmaz, saldırganın ne yaptığını, ne kadar süre sistemde kaldığını ve hangi verilere dokunduğunu da anlayabilirsin.

Linux’ta Kritik Log Dosyaları

Linux sistemlerde güvenlik açısından takip etmen gereken birkaç temel log kaynağı vardır.

/var/log/auth.log (Debian/Ubuntu) veya /var/log/secure (RHEL/CentOS): SSH girişleri, sudo kullanımları ve kimlik doğrulama olaylarının tamamı burada kayıtlıdır.

/var/log/syslog veya /var/log/messages: Genel sistem olayları. Beklenmedik servis başlatmaları veya kernel uyarıları burada görünür.

/var/log/apache2/access.log ve /var/log/nginx/access.log: Web sunucusu erişim logları. SQL injection ve LFI denemeleri burada iz bırakır.

/var/log/faillog: Başarısız giriş denemelerinin özeti.

/var/log/wtmp ve /var/log/btmp: Sırasıyla başarılı ve başarısız giriş geçmişi. last ve lastb komutlarıyla okunur.

SSH Brute Force Saldırılarını Tespit Etme

En yaygın saldırı türlerinden biri SSH brute force’tur. Saldırgan, yüzlerce hatta binlerce kullanıcı adı ve parola kombinasyonunu deneyerek sisteme girmeye çalışır. Bu denemelerin auth.log’da nasıl göründüğüne bakalım:

grep "Failed password" /var/log/auth.log | head -20

Tipik bir brute force çıktısı şöyle görünür:

Jan 15 03:42:11 webserver sshd[12453]: Failed password for root from 185.220.101.45 port 52341 ssh2
Jan 15 03:42:13 webserver sshd[12454]: Failed password for root from 185.220.101.45 port 52342 ssh2
Jan 15 03:42:15 webserver sshd[12455]: Failed password for admin from 185.220.101.45 port 52343 ssh2

Aynı IP’den çok sayıda başarısız deneme geliyorsa, bu klasik bir brute force göstergesidir. IP başına kaç başarısız deneme geldiğini görmek için:

grep "Failed password" /var/log/auth.log | 
awk '{print $(NF-3)}' | 
sort | uniq -c | sort -rn | head -20

Bu komut, en fazla başarısız deneme yapan IP adreslerini sıralı şekilde verir. Eğer bir IP’den 1000’den fazla deneme görüyorsan, o IP’yi acilen bloklaman gerekiyor demektir.

Peki ya başarılı bir giriş olduysa? Bunu tespit etmek için:

grep "Accepted password|Accepted publickey" /var/log/auth.log | tail -50

Burada dikkat etmen gereken şey, bilmediğin kullanıcı adlarından veya olağandışı saatlerden gelen başarılı girişlerdir. Mesela gece 3’te “postgres” kullanıcısıyla SSH girişi varsa, bu ciddi bir uyarı işaretidir.

Sudo Kullanımı ve Yetki Yükseltme İzleri

Bir saldırgan sisteme normal bir kullanıcı hesabıyla girdikten sonra genellikle root yetkisi kazanmaya çalışır. Bu girişimler de auth.log’da kayıt altına alınır:

grep "sudo" /var/log/auth.log | grep -v "COMMAND|session" | tail -30

Yetkisiz sudo denemeleri şöyle görünür:

Jan 15 04:15:22 webserver sudo: john : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/john ; USER=root ; COMMAND=/bin/bash

Bu satır, “john” adlı kullanıcının sudoers dosyasında olmamasına rağmen sudo ile bash açmaya çalıştığını gösterir. Eğer “john”un bu sistemde hesabı olması gerekmiyor ya da bu saatte çevrimiçi olmaması gerekiyorsa, bu bir kompromize göstergesi olabilir.

Başarılı sudo kullanımlarını da takip et:

grep "COMMAND" /var/log/auth.log | grep "sudo" | 
awk '{print $1,$2,$3,$NF}' | tail -20

Burada dikkat etmen gereken şeyler şunlardır:

  • Normal çalışma saatleri dışında yapılan sudo kullanımları
  • passwd, useradd, visudo gibi kullanıcı yönetimi komutları
  • crontab, at gibi zamanlayıcı komutları (kalıcılık mekanizması olabilir)
  • wget, curl, nc (netcat) gibi ağ araçlarının root ile kullanımı

Web Sunucusu Loglarında Saldırı İzleri

Web uygulamaları, saldırganların en sevdiği hedeflerden biridir. Apache veya Nginx access loglarında SQL injection, XSS ve directory traversal denemelerini tespit etmek için:

grep -E "(union.*select|select.*from|insert.*into|drop.*table)" 
/var/log/nginx/access.log -i | head -20

Directory traversal (dizin geçişi) denemelerini aramak için:

grep -E "(../|..%2F|%2e%2e)" /var/log/nginx/access.log | 
awk '{print $1, $7}' | sort | uniq -c | sort -rn | head -10

Özellikle dikkat etmen gereken HTTP yanıt kodları şunlardır:

  • 400 (Bad Request): Kötü biçimlendirilmiş istekler, bazen fuzzing göstergesi
  • 401/403 (Unauthorized/Forbidden): Yetkisiz erişim denemeleri
  • 404 (Not Found): Çok sayıda 404, dizin taraması (directory scanning) işareti olabilir
  • 500 (Internal Server Error): Yanlış giden bir injection denemesi

Kısa sürede çok sayıda 404 üreten IP’leri bulmak için:

awk '$9 == 404 {print $1}' /var/log/nginx/access.log | 
sort | uniq -c | sort -rn | head -10

Gerçek Dünya Senaryosu: Bir Intrusion’ı Adım Adım Takip Etme

Diyelim ki bir müşterinin sunucusunda anormal aktivite şüphesi var. İşte böyle bir durumda izleyeceğin adımlar:

Adım 1: Son giriş yapan kullanıcıları kontrol et

last -n 20
lastb -n 20  # Başarısız girişler
who          # Şu an bağlı kullanıcılar
w            # Bağlı kullanıcıların ne yaptığı

Adım 2: Şüpheli saatlerde yapılan girişleri bul

grep "Accepted" /var/log/auth.log | 
awk '{print $1, $2, $3, $9, $11}' | 
grep -E "0[0-6]:[0-9]{2}:[0-9]{2}"

Bu komut, gece 00:00 ile 06:00 arasında yapılan başarılı SSH girişlerini listeler.

Adım 3: Giriş sonrası aktiviteyi incele

Eğer şüpheli bir giriş tespit ettiysen, o oturumda ne yapıldığını anlamak için bash history dosyasına bak:

cat /home/supheli_kullanici/.bash_history
cat /root/.bash_history

Ama dikkat: Akıllı saldırganlar history -c komutuyla geçmişi temizler ya da başlangıçta unset HISTFILE diyerek geçmişin hiç kaydedilmemesini sağlar. Bu durumda log dosyaları tek kaynağın olur.

Adım 4: Yeni oluşturulan kullanıcı hesaplarını kontrol et

grep "useradd|adduser|new user" /var/log/auth.log
# Ayrıca direkt dosyaya da bak
awk -F: '$3 >= 1000 && $3 != 65534 {print}' /etc/passwd

Saldırganlar çoğu zaman sisteme kalıcı erişim sağlamak için yeni kullanıcı oluştururlar. Tanımadığın bir kullanıcı görürsen, bu büyük bir uyarıdır.

journalctl ile Systemd Loglarını Analiz Etme

Modern Linux sistemlerin çoğunda artık systemd ve journald kullanılıyor. journalctl komutu, bu logları sorgulamak için güçlü bir araçtır:

# Son 1 saatin tüm auth olayları
journalctl -u ssh --since "1 hour ago" --no-pager

# Belirli bir IP'nin tüm logdaki izleri (grep ile birlikte)
journalctl --since "2024-01-15 00:00:00" --until "2024-01-15 23:59:59" | 
grep "185.220.101.45"

# Öncelik seviyesi "err" ve üzeri olaylar
journalctl -p err --since "yesterday" --no-pager

journalctl’nin en güçlü özelliği, birden fazla servisi aynı anda sorgulayabilmesi ve zaman aralığı filtrelemesinin çok esnek olmasıdır.

Windows Olay Loglarında Saldırı Tespiti

Linux tarafını kapattıktan sonra Windows’u da atlamamak gerekiyor. Windows Event Log, güvenlik analizinde hayati önem taşır. PowerShell ile kritik olayları sorgulamak için:

# Başarısız giriş denemelerini listele (Event ID 4625)
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = (Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Message | Format-List

# Başarılı girişleri listele (Event ID 4624)
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4624
    StartTime = (Get-Date).AddHours(-6)
} | Where-Object {$_.Message -match "Logon Type:s+3"} | 
Select-Object TimeCreated, Message

Windows’ta takip etmen gereken kritik Event ID’leri şunlardır:

  • 4625: Başarısız oturum açma
  • 4624: Başarılı oturum açma
  • 4720: Yeni kullanıcı hesabı oluşturuldu
  • 4728/4732: Güvenlik grubuna üye eklendi
  • 4648: Açık kimlik bilgileri ile giriş denemesi
  • 4697/7045: Yeni servis yüklendi (backdoor göstergesi olabilir)
  • 4698: Zamanlanmış görev oluşturuldu

fail2ban ile Proaktif Log Analizi

Sadece reaktif olmak yetmez, proaktif önlemler de almak gerekir. fail2ban, log dosyalarını gerçek zamanlı izleyen ve belirlenen kurallara göre otomatik banlama yapan harika bir araçtır.

fail2ban’ın durumunu kontrol etmek için:

# Genel durum
fail2ban-client status

# SSH jail'in durumu
fail2ban-client status sshd

# Ban edilen IP'leri listele
fail2ban-client status sshd | grep "Banned IP"

# Log dosyasını gerçek zamanlı izle
tail -f /var/log/fail2ban.log

fail2ban ile son 24 saatte yaşanan olayları özetlemek için:

grep "$(date '+%Y-%m-%d')" /var/log/fail2ban.log | 
grep "Ban|Unban" | 
awk '{print $NF, $7}' | 
sort | uniq -c | sort -rn | head -20

Log Analizi için Faydalı One-Liner’lar

Günlük rutin kontrollerde kullanabileceğin bazı pratik komutlar:

# En çok saldıran TOP 10 IP
grep "Failed password" /var/log/auth.log | 
grep -oP '(d{1,3}.){3}d{1,3}' | 
sort | uniq -c | sort -rn | head -10

# Bugün kaç benzersiz IP SSH denemesi yaptı?
grep "$(date '+%b %e')" /var/log/auth.log | 
grep "Failed password" | 
grep -oP '(d{1,3}.){3}d{1,3}' | 
sort -u | wc -l

# Gece yarısından sonra hangi komutlar sudo ile çalıştırıldı?
grep "COMMAND" /var/log/auth.log | 
awk '$3 ~ /^0[0-3]:/' | 
awk '{print $1,$2,$3,$6,$NF}'

Logları Manipüle Etme Girişimlerini Tespit Etme

Deneyimli saldırganlar izlerini kapatmak için log dosyalarını silmeye veya değiştirmeye çalışır. Bu girişimleri tespit etmek için:

  • auditd servisini kullan ve log dosyalarına yazma işlemlerini izle
  • /var/log/auth.log veya /var/log/secure dosyasında beklenmedik boşlukları ara (timestamp sürekliliği kırılmış olabilir)
  • inotifywait ile kritik log dosyalarında değişiklikleri gerçek zamanlı izle
# auditd ile log dosyasına erişimi izle
auditctl -w /var/log/auth.log -p war -k log_tampering

# auditd kayıtlarını sorgula
ausearch -k log_tampering --start today

Ayrıca log sunucusunu ayrı bir sistemde tutmak (merkezi loglama), saldırganın izlerini silmesini çok daha zor hale getirir. rsyslog veya syslog-ng ile logları uzak bir sunucuya yönlendirmek bu açıdan kritik önem taşır.

Otomatik Uyarı Sistemi Kurma

Her gün manuel log analizi yapmak ne zaman zor, ne de pratiktir. Kritik olaylar için e-posta uyarısı kurmak büyük kolaylık sağlar. Basit bir bash betiği ile bunu yapabilirsin:

#!/bin/bash
# /usr/local/bin/security_check.sh

ALERT_EMAIL="[email protected]"
THRESHOLD=50
LOG_FILE="/var/log/auth.log"

FAILED_COUNT=$(grep "Failed password" "$LOG_FILE" | 
    grep "$(date '+%b %e')" | wc -l)

if [ "$FAILED_COUNT" -gt "$THRESHOLD" ]; then
    REPORT=$(grep "Failed password" "$LOG_FILE" | 
        grep "$(date '+%b %e')" | 
        grep -oP '(d{1,3}.){3}d{1,3}' | 
        sort | uniq -c | sort -rn | head -10)
    
    echo -e "UYARI: Bugun $FAILED_COUNT basarisiz SSH giris denemesi tespit edildi.nnTop 10 IP:n$REPORT" | 
        mail -s "[GUVENLIK ALARMI] SSH Brute Force Tespit Edildi - $(hostname)" 
        "$ALERT_EMAIL"
fi

Bu betiği cron’a ekleyerek her saat çalıştırabilirsin:

0 * * * * /usr/local/bin/security_check.sh

Hangi Araçları Kullanmalısın?

Log analizi için güçlü araçlar arasında şunlar öne çıkar:

  • GoAccess: Web sunucusu logları için gerçek zamanlı görsel analiz aracı. Terminalde çalışır, oldukça kullanışlıdır.
  • Logwatch: Günlük log özetleri e-posta ile gönderir. Kurulumu beş dakika sürer.
  • Graylog veya ELK Stack: Kurumsal ortamlar için merkezi log yönetimi. Elasticsearch, Logstash ve Kibana üçlüsü güçlü bir görsel analiz platformu sunar.
  • Wazuh: Açık kaynaklı SIEM çözümü. Hem agent tabanlı log toplama hem de kural tabanlı uyarı sistemi içerir.
  • Auditd: Linux çekirdeği seviyesinde olayları kayıt altına alır. Dosya erişimleri, sistem çağrıları ve kullanıcı aktiviteleri için vazgeçilmezdir.

Sonuç

Güvenlik logları, sisteminin geçmişini tutan bir karakutu gibidir. Saldırı olsun ya da olmasın, bu logları düzenli olarak okuma alışkanlığı edinmek bir sysadmin’in temel becerilerinden biri olmalıdır. Bir anomaliyi ne kadar erken tespit edersen, hasarı o kadar sınırlı tutma şansın artar.

Başlangıç için yapman gerekenler basittir: fail2ban kur, merkezi loglama ayarla, kritik Event ID’leri için uyarı kur ve haftada bir kez auth.log’a göz at. Zamanla hangi kalıpların normal, hangilerinin anormal olduğunu sezgisel olarak ayırt etmeye başlarsın.

Unutma, saldırganların çoğu otomatik araçlar kullanan fırsatçılardır. Temel güvenlik önlemlerini almış ve loglarını takip eden bir sistem, büyük çoğunluğu zaten caydırır. Asıl tehlikeli olanlar ise hedef odaklı saldırılardır ve bunlara karşı da loglar, seni uyaran ilk ve en güvenilir kaynaktır.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir