auditd ile Linux Sistem Olaylarını İzleme ve Denetleme

Sistem üzerinde neler döndüğünü bilmek, bir sysadmin için hem güvenlik hem de uyumluluk açısından hayati önem taşır. Sunucunuzda kim hangi dosyaya dokundu, hangi kullanıcı sudo yetkisiyle ne çalıştırdı, gece yarısı kim sisteme giriş yaptı? Bu soruların cevabını verebilmek için auditd tam olarak ihtiyacınız olan araçtır. Linux Audit Daemon, kernel düzeyinde sistem çağrılarını ve olayları izleyerek kayıt altına alan, RHEL/CentOS/Ubuntu gibi dağıtımların büyük çoğunluğunda varsayılan olarak kullanılabilen güçlü bir denetim çerçevesidir.

auditd Nedir ve Nasıl Çalışır?

auditd, Linux çekirdeğinin audit alt sistemiyle iletişim kurarak çalışır. Kernel, belirli sistem çağrıları gerçekleştiğinde veya dosyalara erişildiğinde audit subsystem’e mesaj gönderir. auditd bu mesajları alıp /var/log/audit/audit.log dosyasına yazar. Temel bileşenler şunlardır:

  • auditd: Arka planda çalışan ana daemon servisi
  • auditctl: Kernel audit kurallarını yönetmek için kullanılan komut satırı aracı
  • ausearch: Audit loglarını sorgulamak ve aramak için araç
  • aureport: Audit loglarından okunabilir raporlar üreten araç
  • audispd: Audit olaylarını başka uygulamalara iletmek için kullanılan dispatcher (yeni sürümlerde audisp-remote olarak geçer)

Sistem çağrısı akışı şu şekilde işler: Kullanıcı alanındaki bir uygulama bir sistem çağrısı yapar, kernel bu çağrıyı audit sistemine bildirir, audit sistemi kaydı oluşturur ve auditd bunu diske yazar. Bu akış kernel düzeyinde gerçekleştiği için kullanıcı tarafından kolayca atlatılamaz.

Kurulum ve Temel Yapılandırma

RHEL/CentOS tabanlı sistemlerde auditd genellikle önceden yüklü gelir. Ubuntu/Debian sistemlerde kurulum gerekebilir:

# RHEL/CentOS/Rocky Linux
sudo dnf install audit audit-libs

# Ubuntu/Debian
sudo apt-get install auditd audispd-plugins

# Servisi başlatmak ve otomatik başlatmayı etkinleştirmek
sudo systemctl enable auditd
sudo systemctl start auditd
sudo systemctl status auditd

Ana yapılandırma dosyası /etc/audit/auditd.conf içindedir. Kritik parametreleri inceleyelim:

sudo cat /etc/audit/auditd.conf

Önemli parametreler:

  • log_file: Log dosyasının yolu, varsayılan /var/log/audit/audit.log
  • max_log_file: MB cinsinden maksimum log dosyası boyutu
  • max_log_file_action: Log dolduğunda yapılacak işlem (rotate, keep_logs, suspend)
  • num_logs: Tutulacak rotasyon dosyası sayısı
  • space_left: Disk alanı bu değerin altına düşünce uyarı ver (MB)
  • space_left_action: Disk dolunca yapılacak işlem (email, halt, syslog)
  • admin_space_left_action: Kritik disk alanı durumunda eylem
  • flush: Log yazma yöntemi (incremental_async performans için önerilir)

Üretim ortamı için makul bir yapılandırma örneği:

sudo tee /etc/audit/auditd.conf << 'EOF'
log_file = /var/log/audit/audit.log
log_format = ENRICHED
log_group = root
priority_boost = 4
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 100
num_logs = 10
name_format = HOSTNAME
max_log_file_action = ROTATE
space_left = 500
space_left_action = EMAIL
action_mail_acct = root
admin_space_left = 100
admin_space_left_action = HALT
disk_full_action = SUSPEND
disk_error_action = SUSPEND
EOF

HALT eylemini üretim ortamında dikkatli kullanın. Disk dolduğunda sistemi durdurmak yerine SYSLOG veya EMAIL tercih etmek daha güvenli olabilir, duruma göre karar verin.

Audit Kuralları Yazmak

Kurallar /etc/audit/rules.d/ dizinindeki .rules uzantılı dosyalarda tutulur. Bu dosyalar augenrules komutuyla derlenerek /etc/audit/audit.rules dosyasına aktarılır.

Temel Kural Sözdizimi

# Sistem çağrısını izleme
-a action,filter -S syscall -F field=value -k key

# Dosya/dizin izleme (watch)
-w path -p permissions -k key

Parametre açıklamaları:

  • -a: Kural ekleme, always,exit en yaygın kombinasyon
  • -w: İzlenecek dosya veya dizin yolu
  • -p: İzin türleri: r (okuma), w (yazma), x (çalıştırma), a (attribute değişimi)
  • -S: Sistem çağrısı adı veya numarası
  • -F: Filtre alanı, uid, auid, key gibi değerler alır
  • -k: Arama ve raporlama için anahtar kelime etiketi

Pratik Kural Seti Oluşturma

Gerçek dünyada kullandığım temel kural setini paylaşayım:

sudo tee /etc/audit/rules.d/99-custom-rules.rules << 'EOF'
## Kural tampon boyutunu ayarla
-b 8192

## Başarısız yetki yükseltme girişimlerini izle
-a always,exit -F arch=b64 -S setuid -S setgid -F success=0 -k privilege_escalation_fail

## Kullanıcı ve grup değişikliklerini izle
-w /etc/passwd -p wa -k user_modification
-w /etc/shadow -p wa -k user_modification
-w /etc/group -p wa -k group_modification
-w /etc/gshadow -p wa -k group_modification
-w /etc/sudoers -p wa -k sudoers_change
-w /etc/sudoers.d/ -p wa -k sudoers_change

## Kimlik doğrulama yapılandırmalarını izle
-w /etc/pam.d/ -p wa -k pam_config
-w /etc/nsswitch.conf -p wa -k nsswitch
-w /etc/ssh/sshd_config -p wa -k ssh_config

## Ağ yapılandırması değişikliklerini izle
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k network_change
-w /etc/hosts -p wa -k hosts_file
-w /etc/network/ -p wa -k network_config
-w /etc/sysconfig/network -p wa -k network_config

## Kritik ikili dosyaların çalıştırılmasını izle
-w /usr/bin/sudo -p x -k sudo_exec
-w /usr/bin/su -p x -k su_exec
-w /bin/chmod -p x -k chmod_exec
-w /bin/chown -p x -k chown_exec
-w /usr/bin/passwd -p x -k passwd_exec

## Sistem çağrısı izleme (64-bit)
-a always,exit -F arch=b64 -S execve -k exec_commands
-a always,exit -F arch=b32 -S execve -k exec_commands

## Oturum açma olaylarını izle
-w /var/log/wtmp -p wa -k session_log
-w /var/log/btmp -p wa -k failed_login
-w /var/run/utmp -p wa -k session_log

## Cron değişikliklerini izle
-w /etc/cron.d/ -p wa -k cron_change
-w /etc/crontab -p wa -k cron_change
-w /var/spool/cron/ -p wa -k cron_change

## Kernel modülü yükleme/kaldırmayı izle
-w /sbin/insmod -p x -k kernel_module
-w /sbin/rmmod -p x -k kernel_module
-w /sbin/modprobe -p x -k kernel_module
-a always,exit -F arch=b64 -S init_module -S delete_module -k kernel_module

## Audit kurallarının değiştirilmesini engelle (immutable mod)
## Bu satırı aktifleştirirseniz reboot olmadan kurallar değiştirilemez
## -e 2
EOF

Kuralları aktif hale getirin:

sudo augenrules --load
sudo auditctl -l  # Aktif kuralları listele

Gerçek Dünya Senaryoları

Senaryo 1: Yetkisiz /etc/passwd Erişimini Tespit Etme

Bir sabah ofise geldiniz ve birinin gece /etc/passwd dosyasını değiştirip değiştirmediğini kontrol etmek istiyorsunuz. Kural zaten tanımlıysa:

# Belirli bir dosyaya erişim olaylarını ara
sudo ausearch -k user_modification --start yesterday --end now -i

# Sonucu daha okunabilir formatta göster
sudo ausearch -k user_modification -i | grep -E "type|name|uid|cmd"

Çıktıda şunları göreceksiniz: hangi kullanıcı (auid), hangi süreç (comm), hangi IP’den bağlandığı (terminal/addr) ve tam timestamp. Eğer gece 03:00’te bir erişim görürseniz ve bu erişim normal bakım pencerenizde değilse, alarm vermeniz gereken bir durum var demektir.

Senaryo 2: Sudo Komutlarını Takip Etme

Büyük bir ekipte çalışıyorsunuz ve hangi sysadmin’in ne yaptığını kayıt altında tutmanız gerekiyor:

# Sudo kullanımlarını raporla
sudo aureport --auth --start this-week

# Belirli kullanıcının sudo aktivitelerini göster
sudo ausearch -ua 1001 -k sudo_exec -i

# Son 24 saatte çalıştırılan komutları özet halinde göster
sudo aureport -x --summary --start today

Bu çıktıyı düzenli olarak e-posta ile gönderen bir cron job oluşturmak, haftalık güvenlik raporlaması için son derece kullanışlıdır.

Senaryo 3: SSH Yapılandırma Değişikliğini Yakalamak

Bir geliştirici yanlışlıkla ya da kasıtlı olarak sshd_config dosyasını değiştirdi ve PortForwarding’i açtı. Bu değişikliği kim yaptı?

sudo ausearch -k ssh_config -i --start last-week

# Daha detaylı çıktı için
sudo ausearch -k ssh_config --format text

Çıktı size tam olarak hangi kullanıcının, hangi zamanda, hangi oturumdan bu değişikliği yaptığını gösterecektir. Eğer auid=0 görüyorsanız ve o saatte root olarak kimse çalışmıyordu ise, daha derin bir inceleme gerekiyor olabilir.

ausearch ve aureport ile Log Analizi

ausearch Kullanımı

# Zaman aralığına göre ara
sudo ausearch --start 10/01/2024 10:00:00 --end 10/01/2024 18:00:00

# Kullanıcı ID'sine göre ara
sudo ausearch -ua 1000 -i

# Başarısız olayları filtrele
sudo ausearch --success no -i

# Belirli executable'ı ara
sudo ausearch -x /usr/bin/sudo -i

# Son 1 saatin olayları
sudo ausearch --start recent -i

# JSON formatında çıktı al (SIEM entegrasyonu için)
sudo ausearch -k exec_commands --format json --start today

aureport ile Özet Raporlar

# Genel özet raporu
sudo aureport --summary

# Başarısız kimlik doğrulama raporu
sudo aureport --failed --auth

# Sistem çağrısı özeti
sudo aureport --syscall --summary

# Oturum açma olayları raporu
sudo aureport --login --start this-month

# Anomali raporu (en önemli raporlardan biri)
sudo aureport --anomaly

# Kullanıcı bazlı aktivite özeti
sudo aureport -u --summary

Özel Log Analiz Scripti

Günlük kontrol için kullandığım basit ama etkili bir script:

#!/bin/bash
# /usr/local/bin/daily-audit-report.sh

REPORT_DATE=$(date +%Y-%m-%d)
RECIPIENT="[email protected]"
SUBJECT="Günlük Audit Raporu - $REPORT_DATE"

{
    echo "=== GÜNLÜK AUDIT RAPORU - $REPORT_DATE ==="
    echo ""
    
    echo "--- BAŞARISIZ KİMLİK DOĞRULAMA ---"
    aureport --failed --auth --start today 2>/dev/null
    
    echo ""
    echo "--- SUDO KULLANIMI ---"
    ausearch -k sudo_exec --start today -i 2>/dev/null | 
        grep -E "^type=EXECVE|auid|comm" | head -50
    
    echo ""
    echo "--- KULLANICI DEĞİŞİKLİKLERİ ---"
    ausearch -k user_modification --start today -i 2>/dev/null
    
    echo ""
    echo "--- KRİTİK DOSYA ERİŞİMLERİ ---"
    ausearch -k sudoers_change --start today -i 2>/dev/null
    
    echo ""
    echo "--- ANOMALİLER ---"
    aureport --anomaly --start today 2>/dev/null
    
} | mail -s "$SUBJECT" "$RECIPIENT"

Bu scripti cron’a ekleyin:

sudo chmod +x /usr/local/bin/daily-audit-report.sh
echo "0 7 * * * root /usr/local/bin/daily-audit-report.sh" | sudo tee -a /etc/cron.d/audit-report

Performans ve Disk Yönetimi Dikkat Noktaları

auditd yanlış yapılandırıldığında ciddi performans sorunlarına yol açabilir. Özellikle -S execve kuralı her komut çalıştırıldığında kayıt üretir ve yoğun sunucularda disk I/O’yu patlatabilir.

Birkaç pratik öneri:

  • execve izlemeyi kısıtlayın: Tüm kullanıcılar yerine sadece belirli UID’ler için etkinleştirin (-F auid>=1000 -F auid!=unset)
  • Log rotasyonunu doğru ayarlayın: max_log_file ve num_logs değerlerini disk kapasitesine göre belirleyin
  • Gereksiz kuralları temizleyin: Her kural bir performans maliyeti taşır, sadece ihtiyacınız olanları ekleyin
  • flush = INCREMENTAL_ASYNC kullanın: Senkron yazma yerine asenkron tercih edin

Disk kullanımını kontrol etmek için:

# Audit log boyutunu kontrol et
du -sh /var/log/audit/

# Log dosyalarını listele
ls -lh /var/log/audit/

# Günlük log üretim hızını hesapla
sudo auditctl -s  # Kernel audit istatistikleri

SIEM ve Merkezi Log Yönetimi Entegrasyonu

Birden fazla sunucu yönetiyorsanız logları merkezi bir yere göndermek zorunlu hale gelir. audisp-remote eklentisi ile audit loglarını merkezi bir sunucaya iletebilirsiniz:

# audisp-remote kurulumu (RHEL/CentOS)
sudo dnf install audispd-plugins

# Uzak sunucu yapılandırması
sudo tee /etc/audisp/audisp-remote.conf << 'EOF'
remote_server = log-server.sirket.com
port = 60
transport = tcp
mode = immediate
queue_depth = 2048
EOF

# Plugin'i etkinleştir
sudo sed -i 's/active = no/active = yes/' /etc/audisp/plugins.d/au-remote.conf
sudo systemctl restart auditd

Elasticsearch/ELK Stack kullananlar için filebeat ile de audit loglarını merkeze taşıyabilirsiniz. filebeat.yml içinde /var/log/audit/audit.log yolunu input olarak tanımlamak yeterlidir.

CIS Benchmark Uyumluluğu

PCI-DSS, HIPAA veya CIS Benchmark uyumluluğu gerektiren ortamlarda auditd kural seti çok daha kapsamlı olmalıdır. CIS Level 2 için önerilen temel kural kategorileri:

  • Zaman değişikliklerini izleyin (adjtimex, settimeofday, clock_settime sistem çağrıları)
  • Zorunlu erişim kontrolü (SELinux/AppArmor) değişikliklerini kaydedin
  • Başarısız dosya erişim girişimlerini (EACCES, EPERM) izleyin
  • Ağ ortam değişikliklerini kaydedin
  • Yeni program yürütmelerini takip edin

Uyumluluk kontrol aracı olarak şunu kullanabilirsiniz:

# CIS uyumluluğunu kontrol eden araç
sudo dnf install openscap-scanner
sudo oscap xccdf eval 
    --profile xccdf_org.ssgproject.content_profile_cis 
    /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml

Audit Kurallarını Test Etme

Kural yazdınız ama çalışıyor mu? Test edin:

# Test için geçici kural ekle
sudo auditctl -w /tmp/test-dosya.txt -p warx -k test_kural

# Test dosyasını oluştur ve değiştir
touch /tmp/test-dosya.txt
echo "test" > /tmp/test-dosya.txt
cat /tmp/test-dosya.txt

# Kayıt üretildi mi kontrol et
sudo ausearch -k test_kural -i --start recent

# Geçici kuralı kaldır
sudo auditctl -W /tmp/test-dosya.txt -p warx -k test_kural
rm /tmp/test-dosya.txt

Bu adımları gerçekleştirdikten sonra ausearch çıktısında test_kural anahtarıyla kayıtları görmelisiniz. Göremiyorsanız kural sözdizimini veya servis durumunu kontrol edin.

Sonuç

auditd, Linux güvenlik altyapısının belki de en az ilgi gören ama en değerli bileşenlerinden biridir. Doğru yapılandırıldığında, bir güvenlik olayı sonrasında “ne oldu, kim yaptı, ne zaman oldu” sorularını dakikalar içinde yanıtlamanızı sağlar. Yanlış yapılandırıldığında ise ya disk dolup sistemi durma noktasına getirir ya da çok geniş kurallar yüzünden performansı etkiler.

Önerilerim şunlar: Önce standart bir kural seti ile başlayın, ortamınıza özgü kritik yolları ve komutları ekleyin, logları düzenli olarak analiz eden otomatik raporlar kurun ve merkezi log yönetimiyle entegre edin. auditd‘yi sadece incident response için değil, proaktif anomali tespiti için de kullanmaya alışın. Haftalık aureport --anomaly çıktısını inceleme alışkanlığı edinmek, ciddi bir güvenlik ihlalini gerçekleşmeden önce fark etmenizi sağlayabilir.

Son olarak, auditd kayıtlarının değeri ancak düzenli incelendiğinde ortaya çıkar. Tedbiri elde etmek kolaydır, ama tedbiri anlamlı kılmak için sürekli gözden geçirme kültürü oluşturmanız gerekir.

Bir yanıt yazın

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