reklam
Linux

Performanstan Ödün Vermeden Kurumsal Linux Güvenliği: PCI-DSS 4.0 & CIS Uyumlu Çekirdek Sertleştirmesi, Auditd Darboğazları ve SIEM/Wazuh Entegrasyonu

5 dk okuma
reklam

Kurumsal veri merkezlerinde ve ödeme sistemleri (PCI-DSS Level 1) altyapılarında güvenlik ekipleri ile sistem/altyapı mühendislerini karşı karşıya getiren klasik bir ikilem vardır: Denetim (Audit) standartlarını karşılamak için sunucuya uygulanan agresif bir CIS Benchmark betiği veya kontrolsüz yazılmış bir auditd kural seti, saniyede on binlerce işlem yapan bir veritabanı (PostgreSQL/Percona) veya sanallaştırma (KVM) sunucusunda %30’a varan sistem çağrısı (syscall) gecikmesine ve ağ/disk kilitlenmelerine yol açabilir.
Bugünkü yazımızda, yüksek performanslı üretim sunucularında IOPS ve ağ gecikmesinden tek bir mikrosaniye bile ödün vermeden Linux çekirdek sertleştirmesini (Hardening), sıfır kayıplı Auditd mimarisini ve Wazuh/OpenSearch tabanlı SIEM entegrasyonunu nasıl kurgulayacağımızı inceliyoruz.
1. Yüksek Trafikli Sunucularda auditd Tuzağı: Neden Sistem Kilitlenir?
PCI-DSS Madde 10 ve CIS standartları; yetki yükseltme (sudo, su), kimlik doğrulama, kritik dosya değişiklikleri (/etc/passwd, /etc/shadow, /etc/sudoers) ve yönetici eylemlerinin (execve) kayıt altına alınmasını zorunlu kılar. Ancak auditd doğrudan Linux çekirdeğinin sistem çağrısı (syscall) çıkışına kanca atar.
Eğer kurallarınızı yazarken iki temel hatayı yaparsanız, sunucunuz kendi ürettiği log fırtınasında boğulur:
Hata A: 32-bit/64-bit Mimari (arch) Belirtmemek ve Sistem Servislerini Filtrelememek
Bir execve veya dosya izleme kuralına auid>=1000 (sadece gerçek insan kullanıcıları izle, arka plan servislerini hariç tut) şartı eklemezseniz; veritabanı motorunun, izleme ajanlarının veya cron’ların yaptığı her saniyedeki binlerce işlem auditd tamponunu (backlog) taşırır.
Optimize Edilmiş /etc/audit/rules.d/99-vmninja-pci.rules Şablonu:

# Mevcut kuralları temizle ve tampon boyutunu yüksek yüke göre 8192'den 65536'ya çıkar
-D
-b 65536

# Tampon taşarsa sunucuyu kapatma (2=panic), sadece kernel loguna yaz (1=printk)
-f 1

# 1. Kritik Kimlik ve Yetki Dosyalarının İzlenmesi (Okuma hariç, sadece Yazma ve Nitelik Değişimi: wa)
-w /etc/passwd -p wa -k identity_changes
-w /etc/group -p wa -k identity_changes
-w /etc/shadow -p wa -k identity_changes
-w /etc/sudoers -p wa -k privilege_escalation
-w /etc/sudoers.d/ -p wa -k privilege_escalation
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes

# 2. Yöneticilerin Çalıştırdığı Tüm Komutların Yakalanması (Performans Dostu Filtre!)
# Sadece gerçek bir kullanıcı oturum açıp (auid>=1000) root yetkisine (euid=0) geçtiğinde kaydet:
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -F auid!=4294967295 -k admin_commands
-a always,exit -F arch=b32 -S execve -F euid=0 -F auid>=1000 -F auid!=4294967295 -k admin_commands

# 3. Çekirdek Modülü (Rootkit / Sürücü) Yükleme ve Kaldırma İşlemleri
-a always,exit -F arch=b64 -S init_module,finit_module,delete_module -k kernel_modules

# Kuralları kilitli (immutable) hale getir (Değiştirmek için reboot gerekir - CIS/PCI-DSS şartı)
# Not: Testleriniz bittikten sonra en alt satırda aktif edin!
# -e 2
  • auid!=4294967295 (unset) ve auid>=1000 Ne İşe Yarar? Linux’ta bir sistem yöneticisi kendi hesabıyla (Örn: UID 1005) SSH yapıp sudo su - ile root (EUID 0) olduğunda bile çekirdek onun orijinal Audit UID (auid) değerini 1005 olarak saklar! Böylece sistemin kendi iç servislerinin (systemd, postgres, haproxy – auid=-1) ürettiği milyonlarca çağrıyı tamamen yok sayıp, %0 performans kaybıyla sadece insan yöneticilerin root olarak çalıştırdığı her komutu yakalarsınız.

Hata B: Disk Senkronizasyonu (flush = INCREMENTAL_ASYNC)
/etc/audit/auditd.conf dosyasında flush parametresi DATA veya SYNC olarak bırakılırsa, auditd her log satırında diske fsync() gönderir ve NVMe/SAN kuyruğunuzu kilitler. Yüksek IOPS sunucularında şu ayarı kullanın:

# /etc/audit/auditd.conf
flush = INCREMENTAL_ASYNC
freq = 100
num_logs = 10
max_log_file = 50
max_log_file_action = ROTATE

2. Performans Dostu Çekirdek Sertleştirmesi (sysctl)
Ağ ve bellek performansını bozmadan sahte paketleri (Spoofing), ICMP yönlendirmelerini (MITM) ve çekirdek bellek sızıntılarını engelleyen /etc/sysctl.d/99-vmninja-hardening.conf profili:

reklam
# --- 1. Ağ Katmanı Güvenliği (Bant Genişliğini Etkilemez) ---
# SYN Flood saldırılarına karşı SYN Cookies korumasını aktif et
net.ipv4.tcp_syncookies = 1

# Sahte kaynak IP'li (Spoofed) paketleri engelle (Reverse Path Filtering)
# Uyarı: Asimetrik routing veya çoklu SAN/Multi-homed NIC olan sunucularda '1' (Strict) yerine '2' (Loose) kullanın!
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2

# Sahte ICMP Redirect paketleriyle sunucu routing tablosunun değiştirilmesini engelle
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# Kaynak yönlendirmeli (Source Routed) paketleri reddet
net.ipv4.conf.all.accept_source_route = 0

# --- 2. Çekirdek ve Bellek Koruması (Exploit Mitigation) ---
# Çekirdek işaretçilerinin (Kernel Pointers - /proc/kallsyms) normal kullanıcılardan gizlenmesi
kernel.kptr_restrict = 2

# dmesg çıktısının sadece yetkili (root) kullanıcılar tarafından okunabilmesi
kernel.dmesg_restrict = 1

# SUID çalışan süreçlerin Core Dump oluşturarak bellekteki şifreleri/anahtarları diske dökmesini engelle
fs.suid_dumpable = 0

# ASLR (Adres Alanı Düzeni Rastgeleleştirme) seviyesini maksimuma çıkar
kernel.randomize_va_space = 2

# ptrace kapsamını daralt (Bir sürecin belleğine başka bir sürecin sızmasını engeller)
kernel.yama.ptrace_scope = 1

Kritik Saha Notu (rp_filter Tuzağı): CIS Benchmark tarama araçları net.ipv4.conf.all.rp_filter = 1 (Strict Mode) ister. Ancak sunucunuzda yönetim ağı, yedekleme ağı ve iSCSI/NVMe-TCP depolama ağı gibi farklı alt ağlarda birden fazla NIC/VLAN varsa, rp_filter = 1 asimetrik paketleri sessizce çöpe atar (martian source) ve depolama/yedekleme bağlantılarınız kopar. Çoklu arayüze sahip kurumsal sunucularda bu değeri 2 (Loose Mode) olarak ayarlamak hem güvenliği korur hem de çoklu NIC trafiğinin kesilmesini önler.
3. Nadir Kullanılan ve Zafiyet Üreten Çekirdek Modüllerini Kara Listeye Almak
Linux çekirdeğinde çıkan kritik yetki yükseltme (Local Privilege Escalation) ve ağ zafiyetlerinin (örneğin dccp, sctp, rds, tipc, rxrpc veya eski IPSec/ESP modülleri) büyük çoğunluğu, veri merkezinde hiç kullanmadığınız ama varsayılan olarak yüklenebilir durumda bekleyen protokol modüllerinden kaynaklanır.
Bu modüllerin belleğe yüklenmesini tamamen imkansız hale getirmek için (install /bin/true yöntemiyle):

cat << 'EOF' | sudo tee /etc/modprobe.d/99-vmninja-blacklist.conf
install cramfs /bin/true
install freevxfs /bin/true
install hfs /bin/true
install hfsplus /bin/true
install udf /bin/true
install dccp /bin/true
install sctp /bin/true
install rds /bin/true
install tipc /bin/true
install rxrpc /bin/true
EOF

4. Wazuh / SIEM Tarafında Gürültüyü Kesip Gerçek Tehdidi Yakalamak
Yukarıdaki auditd kurallarında tanımladığımız -k admin_commands ve -k identity_changes anahtarları (keys), /var/log/audit/audit.log dosyasına key="admin_commands" etiketiyle düşer.
Wazuh Agent (/var/ossec/etc/ossec.conf) üzerinde tüm disk I/O’sunu tüketen tam zamanlı (Real-Time) whodata FIM taramasını /var/lib/mysql veya /var/lib/postgresql gibi veri dizinlerine asla açmayın! Bunun yerine FIM’i sadece /etc, /bin, /sbin, /usr/bin ve /usr/sbin ile sınırlandırın ve audit.log dosyasını doğrudan okuyacak şekilde yapılandırın:

<!-- /var/ossec/etc/ossec.conf -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>

Bu yapılandırma sayesinde bir mühendis SSH ile bağlanıp sudo su - yaptıktan sonra çalıştırdığı her komut (dosya adı, argümanları, hangi IP’den bağlandığı ve gerçek kullanıcı adı ile birlikte) Wazuh/OpenSearch indekslerinize data.audit.key: "admin_commands" olarak anında düşer ve PCI-DSS 10.2.2 maddesini sıfır ek yazılımla karşılar.

reklam