journalctl ile Güvenlik Loglarını Analiz Etme
Sistem güvenliğini sağlamanın yarısı, ne olduğunu bilmekten geçiyor. Loglar olmadan kör uçuyorsunuz demektir. Modern Linux sistemlerinde systemd’nin bize hediye ettiği journalctl aracı, güvenlik olaylarını analiz etmek için gerçekten güçlü bir silah. Ama çoğu sysadmin bu aracı yüzeysel kullanıyor, sadece “bir şeyler yanlış gittiğinde” servis loglarına bakıp geçiyor. Oysa journalctl ile SSH brute-force saldırılarını, yetkisiz erişim denemelerini, sudo kötüye kullanımlarını ve çok daha fazlasını gerçek zamanlı takip edebilirsiniz. Bu yazıda journalctl’yi güvenlik analizinde nasıl kullanacağınızı, hangi sorgularla ne tür tehditleri yakalayabileceğinizi ve bütün bunları otomatize etmenin yollarını ele alacağız.
journalctl Nedir ve Güvenlik İçin Neden Önemlidir?
systemd-journald, sistem genelindeki logları yapılandırılmış ve indekslenmiş bir formatta binary olarak saklar. Bu yapı, geleneksel metin tabanlı log dosyalarına kıyasla çok daha hızlı sorgu yapmanızı sağlar. /var/log/auth.log veya /var/log/secure dosyalarında grep ile arama yapmak yerine, journalctl size metadata bazlı filtreleme, zaman aralığı sorgulama ve çoklu alan filtreleme imkanı tanır.
Güvenlik açısından bakıldığında şu birimler kritik öneme sahiptir:
- sshd: SSH bağlantı denemeleri, başarılı/başarısız girişler
- sudo: Ayrıcalık yükseltme olayları
- PAM: Kimlik doğrulama olayları
- kernel: Sistem çağrısı anomalileri, donanım olayları
- firewalld / ufw: Güvenlik duvarı olayları
- cron: Zamanlı görev manipülasyonları
Journald’ın binary formatı sayesinde bir saldırgan echo "" > /var/log/auth.log yaparak logları temizleyemez. Log manipülasyonu çok daha zordur ve bu da forensic analizde ciddi avantaj sağlar.
Temel Güvenlik Sorguları
Önce temel parametreleri hatırlayalım:
- -u: Belirli bir systemd servisini filtreler
- -p: Log önceliğine göre filtreler (0=emerg, 7=debug)
- -S: Başlangıç zamanı belirler (–since)
- -U: Bitiş zamanı belirler (–until)
- -n: Son N satırı gösterir
- -f: Gerçek zamanlı takip (follow modu)
- -k: Sadece kernel mesajlarını gösterir
- –no-pager: Sayfalama olmadan çıktı verir
- -o: Çıktı formatını belirler (short, json, verbose)
Şimdi pratik kullanımlara geçelim.
SSH Giriş Denemelerini Analiz Etme
SSH, sunuculara yönelik saldırıların birinci hedefidir. Başarısız giriş denemelerini görmek için:
journalctl -u sshd -p warning --since "24 hours ago" | grep "Failed password"
Bu komut son 24 saatteki başarısız SSH denemelerini listeler. Ama daha fazlasına ihtiyacınız var. Hangi IP adreslerinden kaç deneme geldiğini görmek için:
journalctl -u sshd --since "24 hours ago" | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -rn | head -20
Bu çıktı size brute-force yapan IP’leri sıralı şekilde gösterir. Eğer bir IP’den 100+ deneme görüyorsanız, o IP derhal fail2ban veya firewall kuralına alınmalıdır.
Başarılı SSH girişlerini takip etmek de bir o kadar önemlidir:
journalctl -u sshd --since "7 days ago" | grep "Accepted" | awk '{print $9, $11}' | sort | uniq -c | sort -rn
Bu komut, hangi kullanıcının hangi IP’den başarıyla giriş yaptığını ve bu giriş kaç kez tekrarlandığını gösterir. Alışılmadık bir IP’den giriş görürseniz, alarm zillerini çalın.
Sudo Kullanımını İzleme
Ayrıcalık yükseltme olayları güvenlik açısından kritiktir. Bir kullanıcı sudo ile ne yaptı?
journalctl _COMM=sudo --since "today" | grep -E "COMMAND|user NOT in sudoers"
Sudoers dosyasında olmayan kullanıcıların sudo denemelerini yakalamak için:
journalctl _COMM=sudo --since "30 days ago" | grep "NOT in sudoers" | awk '{print $6}' | sort | uniq -c | sort -rn
Bu çok önemli bir güvenlik göstergesidir. Bir kullanıcı sudoers’ta yokken sudo kullanmaya çalışıyorsa, bu ya bir yanlış yapılandırma ya da birinin ayrıcalık kazanmaya çalıştığının işaretidir.
Belirli bir kullanıcının sudo geçmişini incelemek için:
journalctl _COMM=sudo _UID=1001 --since "7 days ago" -o verbose | grep -A5 "COMMAND"
Gerçek Dünya Senaryosu: Brute-Force Saldırısı Tespiti
Diyelim ki sabah işe geldiniz ve sunucunuzun yavaş çalıştığını fark ettiniz. İlk yapacağınız şey ne? Log kontrolü.
journalctl -u sshd --since "yesterday" --until "now" | grep "Invalid user" | wc -l
Eğer bu sayı binlerle ifade ediliyorsa, aktif bir brute-force saldırısı altındasınız demektir. Hangi kullanıcı adlarının denendiğini görmek için:
journalctl -u sshd --since "yesterday" | grep "Invalid user" | awk '{print $8}' | sort | uniq -c | sort -rn | head -20
Saldırganlar genellikle admin, root, test, ubuntu, pi gibi yaygın kullanıcı adlarını dener. Bu listeyi görmek saldırının ne kadar sofistike olduğunu anlamanıza yardımcı olur.
Saldırı zamanlamasını analiz etmek için şunu deneyin:
journalctl -u sshd --since "yesterday" | grep "Failed password" | awk '{print $1, $2, $3}' | cut -d: -f1 | sort | uniq -c
Bu komut saatlik dağılımı gösterir. Eğer saldırı 03:00-05:00 arasında yoğunlaşıyorsa, bu otomatize bir saldırıdır. Eğer iş saatlerinde geliyorsa, hedefli bir saldırı olabilir.
PAM ve Kimlik Doğrulama Olayları
PAM (Pluggable Authentication Modules) logları, SSH’ın ötesinde pek çok kimlik doğrulama olayını kapsar. Konsol girişleri, su komutları, grafik oturum açma işlemleri bunların hepsini PAM üzerinden geçer.
journalctl _SYSTEMD_UNIT=systemd-logind.service --since "24 hours ago" | grep -E "session opened|session closed|New session"
Bu komut tüm oturum açma/kapama olaylarını gösterir. Çalışma saatleri dışında oturum açılmışsa dikkat edin.
Başarısız kimlik doğrulama olaylarını tüm servislerde görmek için:
journalctl -p err..alert --since "24 hours ago" | grep -iE "authentication failure|auth failure|invalid password"
-p err..alert parametresi, hata seviyesinden alert seviyesine kadar olan tüm olayları kapsar. Bu filtreleme ile önemsiz mesajları eleyip kritik güvenlik olaylarına odaklanabilirsiniz.
Kernel Güvenlik Olayları
Kernel logları, genellikle göz ardı edilen ama son derece değerli güvenlik bilgileri içerir. Özellikle SELinux/AppArmor olayları, OOM (Out of Memory) killer aktivasyonları ve ağ bağlantı sorunları burada görünür.
SELinux ihlallerini görmek için:
journalctl -k --since "7 days ago" | grep -i "avc: denied" | head -50
SELinux redleri bir süreçin normalin dışında davrandığının habercisidir. Bir web sunucusu sürecinin /etc/passwd dosyasına erişmeye çalışması ciddi bir red flag’dir.
Ağ bağlantısı düşme ve firewall olaylarını incelemek için:
journalctl -k --since "today" | grep -iE "nf_conntrack|REJECT|DROP" | tail -30
Çok sayıda connection tracking doluluk mesajı, muhtemelen bir DDoS saldırısının ya da port taramasının işaretidir.
Zaman Bazlı Güvenlik Analizi
Belirli bir olayın ne zaman başladığını tespit etmek forensic analizin temelidir. journalctl’nin zaman filtreleme yetenekleri bu konuda çok güçlüdür.
journalctl --since "2024-01-15 02:00:00" --until "2024-01-15 04:00:00" -u sshd -u sudo -u systemd-logind
Bu komut birden fazla servisi aynı anda sorgular. Güvenlik olaylarını incelerken servisleri bağımsız değil, birlikte incelemek önemlidir. Bir SSH girişinin hemen ardından sudo kullanımı görüyorsanız, bu güvenlik olaylarının korelasyonunu yapabiliyorsunuz demektir.
Belirli bir IP adresinin sistem üzerindeki tüm izlerini aramak için daha geniş bir arama yapın:
journalctl --since "7 days ago" | grep "192.168.1.100" | sort -k1,2
Bu basit ama etkili bir korelasyon tekniğidir. Şüpheli bir IP’yi tüm log kaynaklarında takip edebilirsiniz.
JSON Çıktısı ile İleri Düzey Analiz
journalctl’nin JSON çıktısı, logları parse etmek ve başka araçlarla entegre etmek için mükemmeldir.
journalctl -u sshd --since "24 hours ago" -o json | jq '.[] | select(._MESSAGE | test("Failed password")) | {time: .__REALTIME_TIMESTAMP, message: ._MESSAGE}' 2>/dev/null | head -20
jq ile JSON çıktısını işleyerek sadece ihtiyacınız olan alanları çekebilirsiniz. Bu yaklaşım, log verisini bir SIEM sistemine ya da Elasticsearch’e göndermek için de kullanılabilir.
Güvenlik olaylarını bir dosyaya export etmek ve daha sonra analiz etmek için:
journalctl -u sshd -u sudo --since "30 days ago" -o json-pretty > /tmp/security_audit_$(date +%Y%m%d).json
Bu dosyayı daha sonra Python, awk veya başka araçlarla işleyebilirsiniz.
Otomatik Güvenlik Raporu Oluşturma
Günlük güvenlik raporu oluşturmak için basit bir bash scripti yazalım:
#!/bin/bash
# daily_security_report.sh
REPORT_FILE="/var/log/security_reports/report_$(date +%Y%m%d).txt"
SINCE="yesterday"
UNTIL="now"
ALERT_EMAIL="[email protected]"
mkdir -p /var/log/security_reports
{
echo "=== GUNLUK GUVENLIK RAPORU ==="
echo "Tarih: $(date)"
echo "Sunucu: $(hostname)"
echo ""
echo "--- BASARISIZ SSH GIRIS DENEMELERI (TOP 20 IP) ---"
journalctl -u sshd --since "$SINCE" --until "$UNTIL"
| grep "Failed password"
| awk '{print $11}'
| sort | uniq -c | sort -rn | head -20
echo ""
echo "--- GECERSIZ KULLANICI DENEMELERI ---"
journalctl -u sshd --since "$SINCE" --until "$UNTIL"
| grep "Invalid user"
| awk '{print $8}'
| sort | uniq -c | sort -rn | head -10
echo ""
echo "--- BASARILI SSH GIRISLERI ---"
journalctl -u sshd --since "$SINCE" --until "$UNTIL"
| grep "Accepted"
| awk '{print $9, $11}'
echo ""
echo "--- SUDO KULLANIMI ---"
journalctl _COMM=sudo --since "$SINCE" --until "$UNTIL"
| grep "COMMAND" | tail -20
echo ""
echo "--- SUDOERS HARICI DENEMELER ---"
journalctl _COMM=sudo --since "$SINCE" --until "$UNTIL"
| grep "NOT in sudoers"
echo ""
echo "--- KRITIK SISTEM OLAYLARI ---"
journalctl -p err..emerg --since "$SINCE" --until "$UNTIL"
| grep -iE "auth|security|intrusion|attack" | tail -20
} > "$REPORT_FILE"
# Raporu mail ile gonder (mailutils kurulu olmasi gerekir)
if command -v mail &> /dev/null; then
mail -s "Guvenlik Raporu - $(hostname) - $(date +%Y%m%d)"
"$ALERT_EMAIL" < "$REPORT_FILE"
fi
echo "Rapor olusturuldu: $REPORT_FILE"
Bu scripti cron’a ekleyerek her sabah otomatik rapor alabilirsiniz:
# /etc/cron.d/security-report dosyasina ekle
0 7 * * * root /usr/local/bin/daily_security_report.sh
Gerçek Zamanlı İzleme ve Alarm Kurulumu
Bir saldırı aktif olarak gerçekleşirken haberdar olmak için gerçek zamanlı izleme şarttır. Basit bir monitoring scripti:
#!/bin/bash
# realtime_ssh_monitor.sh
# Kullanim: bash realtime_ssh_monitor.sh
THRESHOLD=10
WINDOW=60 # saniye
declare -A ip_counts
declare -A ip_times
journalctl -u sshd -f -n 0 | while read line; do
if echo "$line" | grep -q "Failed password"; then
ip=$(echo "$line" | awk '{print $11}')
current_time=$(date +%s)
# Eski kayitlari temizle
if [[ -n "${ip_times[$ip]}" ]]; then
time_diff=$((current_time - ${ip_times[$ip]}))
if [ $time_diff -gt $WINDOW ]; then
ip_counts[$ip]=0
fi
fi
ip_counts[$ip]=$((${ip_counts[$ip]:-0} + 1))
ip_times[$ip]=$current_time
if [ "${ip_counts[$ip]}" -ge "$THRESHOLD" ]; then
echo "[ALARM] $(date): $ip adresinden ${ip_counts[$ip]} basarisiz giris denemesi!"
# Buraya firewall bloklama komutu eklenebilir:
# iptables -A INPUT -s $ip -j DROP
fi
fi
done
Bu script, belirli bir zaman penceresi içinde eşik değeri aşan IP’leri gerçek zamanlı olarak tespit eder.
journalctl ve fail2ban Entegrasyonu
fail2ban zaten kendi log analizini yapıyor, ama journalctl ile entegre çalışmasını sağlamak için /etc/fail2ban/jail.local dosyasını düzenlemeniz gerekir:
# fail2ban'in journald'i kullanmasini sagla
[DEFAULT]
backend = systemd
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 300
bantime = 3600
fail2ban’in şu anki ban listesini görmek ve journalctl loglarıyla karşılaştırmak için:
fail2ban-client status sshd
journalctl -u fail2ban --since "today" | grep "Ban|Unban" | tail -20
Log Kalıcılığı ve Arşivleme
Varsayılan olarak, bazı sistemlerde journald logları yeniden başlatma sonrası kaybolabilir. Güvenlik loglarının kalıcı olması kritiktir.
# /etc/systemd/journald.conf dosyasini duzenle
sudo sed -i 's/#Storage=auto/Storage=persistent/' /etc/systemd/journald.conf
sudo sed -i 's/#Compress=yes/Compress=yes/' /etc/systemd/journald.conf
sudo sed -i 's/#SystemMaxUse=/SystemMaxUse=2G/' /etc/systemd/journald.conf
sudo systemctl restart systemd-journald
Logların düzgün kaydedildiğini doğrulamak için:
journalctl --disk-usage
journalctl --verify
--verify komutu journal dosyalarının bütünlüğünü kontrol eder. Manipüle edilmiş veya bozulmuş dosyaları tespit etmenizi sağlar.
Sonuç
journalctl, doğru kullanıldığında kurumsal SIEM çözümlerine rakip olabilecek güçlü bir araçtır. SSH brute-force tespitinden sudo izlemeye, kernel anomalilerinden PAM olaylarına kadar geniş bir güvenlik perspektifi sunar. Önemli olan, bu aracı reaktif değil proaktif kullanmaktır. Bir saldırı gerçekleştikten sonra değil, günlük rutin kontroller ve otomatik alarmlarla tehditleri önceden yakalamak hedef olmalıdır.
Yazdığımız scriptleri kendi ortamınıza uyarlayın, eşik değerlerini production trafiğinize göre ayarlayın. Sahte alarm üretmeyen ama gerçek tehditleri kaçırmayan bir denge kurmak zaman alır, ama bu yatırımın karşılığını bir saldırıyı zamanında fark ettiğinizde görürsünüz. Log analizi sıkıcı görünebilir, ama sysadmin’likte “sıkıcı” çoğu zaman “güvenli” anlamına gelir. Loglarınızı okuyun, anomalileri tanıyın ve sisteminizi tanımlayın.
