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: journalctl komutuyla 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 password gö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 yes varsa 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.

Similar Posts

Bir yanıt yazın

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