auditd ile Kural Yazma ve Log Analizi

Linux sistemlerde güvenlik denetimi söz konusu olduğunda, auditd daemon’ı adeta sineğin yağını çıkaran bir araç gibi çalışır. Sistem üzerinde kimin ne yaptığını, hangi dosyalara dokunulduğunu, hangi sistem çağrılarının yapıldığını kayıt altına alan bu araç, bir güvenlik olayı sonrasında adli analiz yaparken ya da uyumluluk gereksinimlerini karşılarken vazgeçilmez hale gelir. Bu yazıda auditd kural yazımını, log analizini ve gerçek dünya senaryolarında nasıl kullanılacağını detaylıca ele alacağız.

auditd Nedir ve Neden Önemlidir?

auditd, Linux çekirdeğinin audit alt sistemiyle doğrudan konuşan bir kullanıcı alanı daemon’ıdır. Çekirdek seviyesinde çalıştığı için kullanıcı süreçlerinden çok daha güvenilir bir şekilde olayları yakalar. Bir root kullanıcısı bile log dosyalarını temizlemeye çalışsa, bu eylem audit tarafından kayıt altına alınır.

PCI-DSS, HIPAA, SOC 2 gibi uyumluluk standartları “kimler sisteme erişti, hangi kritik dosyalar değiştirildi” gibi soruların yanıtlanmasını zorunlu kılar. auditd tam da bu noktada devreye girer.

Kurulum oldukça basittir:

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

# Debian/Ubuntu
sudo apt install auditd audispd-plugins

# Servisi başlatmak ve etkinleştirmek
sudo systemctl enable auditd
sudo systemctl start auditd

# Servis durumunu kontrol et
sudo systemctl status auditd

Temel Kavramlar

auditd dünyasına girmeden önce birkaç temel kavramı anlamak gerekiyor.

Kural türleri:

  • Kontrol kuralları (-e, -b, -f): Audit sisteminin kendisini yapılandırır
  • Dosya izleme kuralları (-w): Belirli dosya veya dizinleri izler
  • Sistem çağrısı kuralları (-a): Belirli sistem çağrılarını izler

Önemli dosya konumları:

  • /etc/audit/auditd.conf: Ana yapılandırma dosyası
  • /etc/audit/audit.rules: Kalıcı kurallar (eski format)
  • /etc/audit/rules.d/*.rules: Modüler kural dosyaları (önerilen)
  • /var/log/audit/audit.log: Ana log dosyası

Kural Yazımı

Basit Dosya İzleme Kuralları

En çok kullanılan kural türü dosya izleme kurallarıdır. -w parametresiyle bir dosya ya da dizin belirtilir, -p ile izlenecek izin türleri, -k ile de bu kurala ait bir anahtar kelime tanımlanır.

# /etc/passwd dosyasına yapılan okuma ve yazma işlemlerini izle
sudo auditctl -w /etc/passwd -p rwa -k passwd_changes

# /etc/sudoers dosyasındaki değişiklikleri izle
sudo auditctl -w /etc/sudoers -p rw -k sudoers_mod

# SSH yapılandırmasını izle
sudo auditctl -w /etc/ssh/sshd_config -p rwa -k sshd_config

# Tüm /etc/audit/ dizinini izle
sudo auditctl -w /etc/audit/ -p rwa -k audit_config_changes

İzin türleri şu şekilde çalışır:

  • r: Okuma (read)
  • w: Yazma (write)
  • x: Çalıştırma (execute)
  • a: Öznitelik değişikliği (attribute change)

Sistem Çağrısı Kuralları

Sistem çağrısı kuralları çok daha granüler kontrol sağlar. -a parametresiyle eylem ve liste, -S ile sistem çağrısı adı ya da numarası belirtilir.

# Tüm kullanıcılar için dosya silme işlemlerini izle
sudo auditctl -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k file_deletion

# Yetkisiz dosya erişim denemelerini izle (EACCES ve EPERM hataları)
sudo auditctl -a always,exit -F arch=b64 -S open -F exit=-EACCES -k unauthorized_access
sudo auditctl -a always,exit -F arch=b64 -S open -F exit=-EPERM -k unauthorized_access

# Kimlik değişikliklerini izle (su, sudo kullanımı)
sudo auditctl -a always,exit -F arch=b64 -S setuid -S setgid -k privilege_escalation

-F arch=b64 parametresi 64-bit sistem çağrılarını hedef aldığımızı belirtir. 32-bit uygulamalar da çalışıyorsa b32 için ayrı bir kural eklemeniz gerekir.

Gelişmiş Filtreler

Belirli kullanıcıları veya grupları kapsam dışında bırakmak ya da dahil etmek için filtreler kullanılır:

# UID 1000 ile çalışan kullanıcının /tmp dizininde yürüttüğü işlemleri izle
sudo auditctl -a always,exit -F arch=b64 -S execve -F uid=1000 -F dir=/tmp -k suspicious_exec

# Root olmayan kullanıcıların cron değişikliklerini izle
sudo auditctl -a always,exit -F arch=b64 -S write -F path=/etc/cron.d -F uid!=0 -k cron_tampering

# Belirli bir grubun hassas dizine erişimini izle
sudo auditctl -a always,exit -F arch=b64 -S open -F dir=/opt/finansal_veriler -F gid=1500 -k finans_erisim

Kalıcı Kurallar Yazmak

auditctl komutuyla yazılan kurallar yeniden başlatma sonrasında kaybolur. Kalıcı hale getirmek için /etc/audit/rules.d/ dizinine .rules uzantılı dosyalar oluşturmak gerekir:

# /etc/audit/rules.d/99-custom.rules dosyası oluştur
sudo tee /etc/audit/rules.d/99-custom.rules << 'EOF'
# Audit tampon boyutu
-b 8192

# Sistem kritik dosyalarını izle
-w /etc/passwd -p rwa -k user_accounts
-w /etc/shadow -p rwa -k shadow_changes
-w /etc/group -p rwa -k group_changes
-w /etc/sudoers -p rwa -k sudoers_mod
-w /etc/sudoers.d/ -p rwa -k sudoers_mod

# SSH yapılandırması
-w /etc/ssh/sshd_config -p rwa -k sshd_config

# Başlatma scriptleri
-w /etc/init.d/ -p rwa -k init_changes
-w /etc/systemd/ -p rwa -k systemd_changes

# Dosya silme işlemleri (64-bit)
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k file_deletion

# Yetki yükseltme girişimleri
-a always,exit -F arch=b64 -S setuid -S setgid -k privilege_escalation

# Yetkisiz erişim denemeleri
-a always,exit -F arch=b64 -S open -F exit=-EACCES -k unauthorized_access
-a always,exit -F arch=b64 -S open -F exit=-EPERM -k unauthorized_access

# Kuralları değiştirilemez yap (son satır olmalı)
-e 2
EOF

# Kuralları yeniden yükle
sudo augenrules --load

-e 2 parametresi audit kurallarını değiştirilemez (immutable) hale getirir. Bu durumda kuralları değiştirmek için sistem yeniden başlatılmalıdır; bu da bir saldırganın audit’i devre dışı bırakmasını önemli ölçüde zorlaştırır.

Log Analizi

Kuralları yazdıktan sonra asıl iş başlıyor: logları okumak ve anlamlandırmak. /var/log/audit/audit.log ham haliyle oldukça kalabalık ve okunması zordur. Bu yüzden ausearch ve aureport araçlarını iyi bilmek gerekir.

ausearch ile Log Arama

# Belirli bir anahtar kelimeyle arama yap
sudo ausearch -k passwd_changes

# Son 1 saatteki olayları getir
sudo ausearch -k unauthorized_access --start recent

# Belirli bir kullanıcının olaylarını bul
sudo ausearch -ua 1001 --start today

# Başarısız oturum açma girişimleri
sudo ausearch -m USER_AUTH -sv no --start today

# Belirli bir IP adresinden gelen olayları ara
sudo ausearch -tm LOGIN --start yesterday | grep "192.168.1.50"

# Okunabilir formatta çıktı
sudo ausearch -k sudoers_mod -i

-i parametresi UID ve GID gibi sayısal değerleri okunabilir isimlerle değiştirir. Bunu her zaman kullanmanızı tavsiye ederim, çünkü uid=1000 yerine ali gibi kullanıcı adlarını görmek analizi çok daha kolay hale getirir.

aureport ile Özet Raporlar

# Genel özet rapor
sudo aureport

# Giriş/çıkış olayları raporu
sudo aureport -l --start today

# Başarısız kimlik doğrulama raporu
sudo aureport -au -i --failed --start today

# Çalıştırılan komutlar raporu
sudo aureport -x --start today --end now -i

# Dosya erişim raporu
sudo aureport -f --start today

# Anormal olayların özeti
sudo aureport --anomaly

Ham Log Formatını Anlamak

Bir audit log kaydı şöyle görünür:

type=SYSCALL msg=audit(1699876543.123:4521): arch=c000003e syscall=2 success=no exit=-13 a0=7f8c4d2a1b60 a1=0 a2=1b6 a3=ffffff9c items=1 ppid=12345 pid=12346 auid=1001 uid=1001 gid=1001 euid=0 suid=0 fsuid=0 egid=1001 sgid=1001 fsgid=1001 tty=pts0 ses=5 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="unauthorized_access"

Bu kayıttaki önemli alanlar:

  • msg=audit(timestamp:seri): Olayın zaman damgası ve seri numarası
  • syscall=2: Sistem çağrı numarası (2 = open)
  • success=no: İşlem başarısız oldu
  • exit=-13: Hata kodu (-13 = EACCES, yetki yetersiz)
  • auid=1001: Gerçek kullanıcı ID (oturum açan kullanıcı)
  • uid=1001: Efektif kullanıcı ID
  • comm=”cat”: Komutu çalıştıran program
  • exe=”/bin/cat”: Tam yol
  • key=”unauthorized_access”: Kural anahtarı

Gerçek Dünya Senaryoları

Senaryo 1: Gece Yarısı Şüpheli Root Aktivitesi

Sabah geldiniz, e-posta kutunuzda bir IDS uyarısı var. Gece 02:30’da birisi root yetkisiyle /etc/passwd dosyasını değiştirmiş. Önce ne yaparsınız?

# Dünkü passwd değişikliklerini incele
sudo ausearch -k passwd_changes --start yesterday --end now -i | grep -A 10 "02:30"

# Hangi process tarafından değiştirildiğini bul
sudo ausearch -k user_accounts --start "02/01/2024 02:00:00" --end "02/01/2024 03:00:00" -i

# O saatte hangi kullanıcı oturum açmış?
sudo ausearch -m USER_LOGIN --start "02/01/2024 00:00:00" --end "02/01/2024 03:00:00" -i

# Şüpheli kullanıcının o gece yaptığı tüm işlemleri kronolojik sırayla getir
sudo ausearch -ua 1005 --start yesterday -i | sort -k3

Bu sorgu zinciriyle hangi kullanıcı hesabının kullanıldığını, bu hesabın nasıl edinildiğini ve neler yapıldığını adım adım takip edebilirsiniz.

Senaryo 2: Privilege Escalation Tespiti

Bir pentester veya saldırgan genellikle düşük yetkili bir hesaptan yüksek yetki almaya çalışır. Bu girişimleri tespit etmek için:

# setuid sistem çağrısı denemelerini kontrol et
sudo ausearch -k privilege_escalation --start today -i

# sudo kullanım loglarını incele
sudo ausearch -m USER_CMD --start today -i

# Başarısız sudo girişimleri
sudo ausearch -m USER_CMD --start today -sv no -i

# SUID bitli dosyaların çalıştırılmasını izlemek için özel kural ekle
sudo auditctl -a always,exit -F arch=b64 -S execve -F perm=4000 -k suid_execution

Senaryo 3: Web Sunucusu Saldırısı Sonrası Adli Analiz

Web sunucunuz compromise edildi ve saldırgan bir web shell yükledi. Hangi dosyaların değiştirildiğini bulmak için:

# Apache/Nginx sürecinin (genellikle www-data veya apache) yaptığı dosya işlemleri
sudo ausearch -ua 33 --start "2024-01-15" -i | grep -E "(write|create|unlink)"

# /var/www/ altında gerçekleşen anormal işlemler
sudo ausearch -k web_tampering --start last-week -i

# PHP veya script dosyalarının çalıştırılması
sudo ausearch -m EXECVE --start today -i | grep -E ".(php|py|sh|pl)"

# Bunun için önceden şu kuralı eklemiş olmak gerekir:
sudo auditctl -a always,exit -F arch=b64 -S execve -F uid=33 -k www_exec

Senaryo 4: İçeriden Tehdit Tespiti

Bir çalışan şirketten ayrılmak üzere ve kritik verileri dışarı sızdırıyor olabilir mi?

# Belirli bir kullanıcının büyük dosya kopyalama işlemleri
sudo ausearch -ua 1042 --start this-week -i | grep -E "(open|read)" | grep "/opt/musteriler"

# USB veya harici depolama bağlantılarını izle
sudo ausearch -m MEDIA_MOUNT --start this-week -i

# Ağa büyük veri transfer eden komutlar
sudo ausearch -m EXECVE -i --start today | grep -E "(scp|rsync|curl|wget|nc)"

Log Yönetimi ve Rotasyon

Audit logları hızla büyüyebilir. auditd.conf içinde bazı kritik ayarlar yapılmalıdır:

# /etc/audit/auditd.conf düzenleme
sudo vi /etc/audit/auditd.conf

Dikkat edilmesi gereken parametreler:

  • max_log_file: Megabyte cinsinden maksimum log dosya boyutu (örn: 100)
  • max_log_file_action: Dosya dolduğunda yapılacak işlem (ROTATE önerilen)
  • num_logs: Tutulacak rotasyon dosyası sayısı (örn: 10)
  • space_left: Disk doluyken uyarı eşiği (MB cinsinden)
  • space_left_action: Disk dolduğunda yapılacak işlem (SYSLOG veya EMAIL)
  • admin_space_left_action: Kritik disk doluluk eylemi (HALT önerilir üretim sistemlerinde)
# Mevcut aktif kuralları listele
sudo auditctl -l

# Kural istatistiklerini gör
sudo auditctl -s

# Log dosyasını rotate etmeyi zorla
sudo pkill -HUP auditd

Performans Optimizasyonu

Çok fazla kural eklemek sistem performansını olumsuz etkileyebilir. Özellikle yoğun I/O yapan sunucularda dikkatli olmak gerekir.

# Gereksiz kural varsa sil
sudo auditctl -W /etc/passwd -p rwa -k passwd_changes

# Belirli süreçleri kural dışında bırak (örn: antivirus scanner)
sudo auditctl -a never,exit -F exe=/opt/antivirus/scanner

# Audit istatistiklerini kontrol et (dropped events var mı?)
sudo auditctl -s | grep backlog

# Tampon boyutunu artır (drop oluyor ise)
sudo auditctl -b 16384

Dropped events güvenlik açısından kötüdür; bu, bazı olayların kayıt altına alınamadığı anlamına gelir. Bunu yaşıyorsanız tampon boyutunu artırın veya kural sayısını optimize edin.

Merkezi Log Yönetimi

Birden fazla sunucunuz varsa audit loglarını merkezi bir yerde toplamak şarttır. audisp-remote eklentisi bu iş için kullanılır:

# audisp-remote yapılandırması
sudo vi /etc/audisp/audisp-remote.conf

# Remote server ayarı
# remote_server = 192.168.1.100
# port = 60
# transport = tcp

# Merkezi sunucuda log almak için
sudo vi /etc/audit/auditd.conf
# tcp_listen_port = 60
# tcp_listen_queue = 5

# Firewall kuralı ekle (merkezi sunucuda)
sudo firewall-cmd --add-port=60/tcp --permanent
sudo firewall-cmd --reload

Elasticsearch, Splunk veya Graylog gibi SIEM sistemlerine aktarım için filebeat ya da rsyslog ile entegrasyon yapılabilir. Bu konuyu ayrı bir yazıda ele alacağım.

Hızlı Analiz İçin Yararlı Tek Satır Komutlar

# Bugün en çok başarısız erişim denemesi yapan kullanıcılar
sudo aureport -au --failed --start today -i | sort -k7 -rn | head -20

# Son 24 saatte çalıştırılan tüm komutların listesi
sudo aureport -x --start today -i | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

# Hangi dosyalar en çok dokunulmuş?
sudo aureport -f --start today -i | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

# Aktif oturumları kontrol et
sudo aureport -l --start today -i | grep "opened"

Sonuç

auditd, doğru yapılandırıldığında Linux sistemleriniz için son derece güçlü bir güvenlik net ağı oluşturur. Kural yazımında aşırıya kaçmadan kritik dosya ve sistem çağrılarına odaklanmak, log analizinde ise ausearch ve aureport araçlarını etkin kullanmak asıl hedefiniz olmalıdır.

Pratikte şu üç adımı takip etmenizi öneririm: önce sisteminiz için gerçekten önemli olan varlıkları (kritik config dosyaları, hassas dizinler, yetki yükseltme noktaları) belirleyin, ardından bu varlıklara odaklanan kurallar yazın ve son olarak düzenli log analizi için bir rutin oluşturun. Haftalık aureport özetleri bile pek çok anormal durumu erkenden yakalamanıza yardımcı olur.

Unutmayın, auditd sadece bir güvenlik olayı yaşandığında değil, olağan zamanlarda da düzenli inceleme gerektiren bir sistemdir. Logları kimse okumuyorsa yazmalarının pek bir anlamı olmaz.

Bir yanıt yazın

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