sysctl ile Güvenlik Odaklı Kernel Ayarları
Linux sistemleri kutudan çıktığı haliyle üretim ortamları için yeterince sertleştirilmiş değildir. Kernel parametreleri varsayılan olarak maksimum uyumluluk ve işlevsellik için ayarlanmıştır, güvenlik için değil. İşte tam bu noktada sysctl devreye giriyor. Doğru kernel parametreleri ile ağ saldırılarının büyük bir kısmını, bilgi sızdırma girişimlerini ve çeşitli exploit tekniklerini kernel seviyesinde engelliyebilirsiniz. Bu yazıda gerçek dünya saldırı senaryolarından yola çıkarak sysctl ile nasıl kapsamlı bir güvenlik profili oluşturacağınızı ele alacağız.
sysctl Nedir ve Neden Önemlidir?
sysctl, Linux kernel’inin çalışma zamanında parametrelerini okuyup değiştirmenizi sağlayan bir arayüzdür. Bu parametreler /proc/sys/ dizini altında sanal dosyalar olarak temsil edilir. Ağdan belleğe, güvenlikten dosya sistemi davranışına kadar yüzlerce parametre bu şekilde yönetilebilir.
Bir parametre değiştirmek için iki yol var. Birincisi geçici değişiklik, yani sistem yeniden başladığında sıfırlanır:
sysctl -w net.ipv4.ip_forward=0
İkincisi kalıcı değişiklik, /etc/sysctl.conf veya /etc/sysctl.d/ altına bir dosya yazarak:
echo "net.ipv4.ip_forward = 0" >> /etc/sysctl.d/99-security.conf
sysctl -p /etc/sysctl.d/99-security.conf
Ben her zaman /etc/sysctl.d/ dizinini tercih ederim. Parametreleri mantıksal gruplara ayırabilirsiniz, ana konfig dosyasını şişirmezsiniz ve configuration management araçlarıyla yönetmek çok daha kolay olur.
Mevcut bir parametrenin değerini kontrol etmek için:
sysctl net.ipv4.tcp_syncookies
# veya
cat /proc/sys/net/ipv4/tcp_syncookies
Tüm aktif parametreleri listelemek için:
sysctl -a
sysctl -a 2>/dev/null | grep "net.ipv4"
Ağ Katmanı Güvenliği
SYN Flood Koruması
SYN flood saldırıları, TCP üç yönlü el sıkışmasının ilk adımını (SYN paketi) kullanarak sunucunun kaynaklarını tüketmeyi hedefler. Saldırgan binlerce SYN paketi gönderir, sunucu her biri için yarım açık bağlantı oluşturur ve bellek/bağlantı tablosu dolar.
SYN cookie mekanizması bu sorunu çözer. SYN queue dolduğunda sunucu, bağlantı durumunu bellekte saklamak yerine, bağlantı bilgilerini kriptografik olarak encode edilmiş bir cookie içinde geri gönderir:
# SYN Cookie'leri aktifleştir
net.ipv4.tcp_syncookies = 1
# SYN-ACK için yeniden deneme sayısını azalt
net.ipv4.tcp_synack_retries = 2
# SYN için yeniden deneme sayısını azalt
net.ipv4.tcp_syn_retries = 2
# SYN queue boyutunu artır
net.ipv4.tcp_max_syn_backlog = 2048
Gerçek dünya örneği: E-ticaret müşterimizde Kasım ayında (yani yoğun sezon öncesi) tam da bu saldırıyla karşılaştık. netstat -s | grep "SYNs to LISTEN" çıktısı binleri gösteriyordu. SYN cookie’leri zaten aktifti ama tcp_max_syn_backlog değeri varsayılan 128’de kalmıştı. 2048’e çıkardıktan sonra sorun büyük ölçüde hafifledi.
IP Spoofing ve Kaynak Doğrulama
Saldırganlar sahte IP adresleriyle paket göndererek saldırının kaynağını gizlemeye çalışır. Reverse Path Filtering (RPF) bu tekniği engeller. Kernel, gelen paketin kaynak IP adresinden gelen trafiğin hangi arayüzden geçmesi gerektiğini routing tablosuna bakarak kontrol eder:
# Strict mode RPF - tüm arayüzler için
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ICMP redirect kabul etme (MITM saldırılarına karşı)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Source routing'i devre dışı bırak
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1: Strict mode, her gelen paket için kaynak adresi doğrulaması yapar. net.ipv4.conf.all.rp_filter = 2 ise loose mode olup asimetrik routing kullanan ortamlar için uygundur.
ICMP Saldırılarına Karşı Önlemler
ICMP protokolü ağ keşfi ve hata bildirimi için tasarlanmış olsa da kötüye kullanım alanı oldukça geniştir. Smurf saldırıları, ping flood, ve bilgi keşfi için sıklıkla kullanılır:
# Broadcast ICMP isteklerini yoksay (Smurf saldırısı koruması)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Bozuk hata mesajlarını yoksay
net.ipv4.icmp_ignore_bogus_error_responses = 1
# ICMP redirect gönderme (router olmayan sistemlerde)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
Burada dikkat edilmesi gereken nokta şu: ICMP’yi tamamen kapatmak bazı ağ sorunlarını teşhis etmeyi zorlaştırır ve MTU keşfini (Path MTU Discovery) bozabilir. Yukarıdaki ayarlar dengeyi korur, yani gereksiz ICMP davranışlarını kapatır ama tüm ICMP’yi engellemez.
IPv4 Forwarding Kontrolü
Sunucunuz bir router değilse, IP forwarding kesinlikle kapalı olmalıdır. Açık olması, potansiyel olarak sunucunuzun bir ağ geçidi gibi davranmasına yol açabilir:
# Router olmayan sistemlerde IP forwarding kapat
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
Eğer Docker, LXC veya benzeri container teknolojileri kullanıyorsanız, bu parametre container networking için açık olmalıdır. Bu durumda alternatif güvenlik önlemlerine (iptables/nftables kuralları) odaklanın.
Bellek ve Exploit Koruması
ASLR (Address Space Layout Randomization)
ASLR, süreçlerin bellek adreslerini rastgele düzenler. Bu sayede saldırganlar, belleğin belirli bir konumundaki kodu hedef alan return-to-libc veya ROP (Return Oriented Programming) saldırılarını uygulamakta zorlanır:
# ASLR maksimum randomizasyon (0=kapalı, 1=kısmen, 2=tam)
kernel.randomize_va_space = 2
Değer 2 olduğunda stack, VDSO, shared memory ve data segmentlerinin hepsi rastgele adreslendirilir. Bunu 1 ya da 0’a düşürmeniz için gerçekten çok özel bir nedeniniz olması gerekir.
Kernel Pointer Leaklerine Karşı
Saldırganlar kernel exploit geliştirirken kernel adreslerini bilmeleri gerekir. kptr_restrict ve dmesg_restrict bu bilgiye erişimi kısıtlar:
# Kernel pointer'larını gizle
kernel.kptr_restrict = 2
# dmesg erişimini root ile sınırla
kernel.dmesg_restrict = 1
# Kernel log erişimini kısıtla
kernel.printk = 3 4 1 3
kernel.kptr_restrict = 1: Kernel pointer’larını sadece root görebilir. kernel.kptr_restrict = 2 ise CAP_SYSLOG capability’sine sahip olmayan herkesten gizler, root dahil. Üretim sistemlerinde 2 tercih edin.
Core Dump Güvenliği
Core dump’lar hassas bilgiler içerebilir, parolalar, şifreleme anahtarları, oturum token’ları. SUID bit’li programların core dump üretmesini engellemek iyi bir pratiktir:
# SUID programların core dump üretmesini engelle
fs.suid_dumpable = 0
# Core dump boyutunu sınırla (ulimit ile birlikte kullanın)
kernel.core_uses_pid = 1
Kullanıcı Namespace ve Privilege Escalation
Kullanıcı Namespace Kısıtlaması
Kullanıcı namespace’leri container güvenliği için önemli bir özellik olsa da saldırganlar tarafından privilege escalation için de kullanılabilmektedir. Eğer container çalıştırmıyorsanız:
# Unprivileged kullanıcıların user namespace oluşturmasını engelle
kernel.unprivileged_userns_clone = 0
# BPF erişimini kısıtla (eBPF exploitlerine karşı)
kernel.unprivileged_bpf_disabled = 1
# perf_event erişimini kısıtla
kernel.perf_event_paranoid = 3
kernel.perf_event_paranoid = 3: Perf event’lere erişimi tamamen root ile sınırlar. Geliştirme ortamlarında bu değeri düşürmeniz gerekebilir ama üretimde 3’te bırakın.
TCP/IP Güçlendirme Parametreleri
TCP zaman damgaları, sequence number tahminleri ve diğer düşük seviyeli TCP davranışları da güvenlik açığı oluşturabilir:
# TCP timestamp'leri kapat (uptime bilgisi sızmasını önler)
net.ipv4.tcp_timestamps = 0
# TCP zaman damgası ile birlikte sequence number prediction'ı zorlaştır
net.ipv4.tcp_rfc1337 = 1
# TIME-WAIT durumundaki soket yeniden kullanımını kontrol et
net.ipv4.tcp_tw_reuse = 1
# Bekleyen bağlantılar için daha agresif zaman aşımı
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 54000
# Orphan socket temizleme
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 15
TCP timestamp’leri hakkında bir not: Bu parametre HTTP başlıkları ile birlikte değerlendirilmelidir. Apache/Nginx’te de Server: header’ını ve versiyon bilgisini gizlemeniz gerekir. Kernel seviyesinde timestamp’leri kapatmak sistemin ne zamandır çalıştığına dair bilgiyi gizler, saldırganlar bu bilgiyi unpatched sistemleri hedeflemek için kullanır.
Kapsamlı Güvenlik Konfigurasyon Dosyası
Yukarıdaki tüm parametreleri tek bir yönetilebilir dosyada toplamak için:
cat > /etc/sysctl.d/99-security-hardening.conf << 'EOF'
# ============================================
# Kernel Güvenlik Sertleştirme Parametreleri
# Son güncelleme: Üretim ortamı için optimize edilmiş
# ============================================
## NETWORK - IP Spoofing ve Routing Güvenliği
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
## NETWORK - ICMP Güvenliği
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
## NETWORK - SYN Flood Koruması
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 2048
## NETWORK - TCP Sertleştirme
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_orphan_retries = 1
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
## KERNEL - Bellek Güvenliği
kernel.randomize_va_space = 2
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
fs.suid_dumpable = 0
## KERNEL - Privilege Escalation Koruması
kernel.unprivileged_bpf_disabled = 1
kernel.perf_event_paranoid = 3
## KERNEL - Core Dump
kernel.core_uses_pid = 1
EOF
# Değişiklikleri uygula
sysctl -p /etc/sysctl.d/99-security-hardening.conf
Ayarları Doğrulama ve Test Etme
Ayarları uyguladıktan sonra her şeyin doğru çalıştığını teyit edin:
#!/bin/bash
# sysctl-audit.sh - Güvenlik parametrelerini doğrulama scripti
echo "=== Kernel Güvenlik Parametreleri Audit ==="
PARAMS=(
"net.ipv4.tcp_syncookies:1"
"net.ipv4.conf.all.rp_filter:1"
"net.ipv4.conf.all.accept_redirects:0"
"net.ipv4.conf.all.send_redirects:0"
"net.ipv4.icmp_echo_ignore_broadcasts:1"
"kernel.randomize_va_space:2"
"kernel.kptr_restrict:2"
"kernel.dmesg_restrict:1"
"fs.suid_dumpable:0"
"kernel.unprivileged_bpf_disabled:1"
)
PASS=0
FAIL=0
for param_check in "${PARAMS[@]}"; do
param="${param_check%%:*}"
expected="${param_check##*:}"
actual=$(sysctl -n "$param" 2>/dev/null)
if [ "$actual" = "$expected" ]; then
echo "[OK] $param = $actual"
((PASS++))
else
echo "[FAIL] $param = $actual (beklenen: $expected)"
((FAIL++))
fi
done
echo ""
echo "Sonuç: $PASS başarılı, $FAIL başarısız"
[ $FAIL -gt 0 ] && exit 1 || exit 0
Bu scripti cron’a ekleyerek düzenli audit yapabilirsiniz:
chmod +x /usr/local/bin/sysctl-audit.sh
echo "0 6 * * * root /usr/local/bin/sysctl-audit.sh >> /var/log/sysctl-audit.log 2>&1" >> /etc/cron.d/sysctl-audit
Dağıtıma Özgü Dikkat Noktaları
RHEL/CentOS/AlmaLinux
Red Hat tabanlı sistemlerde kernel.unprivileged_userns_clone parametresi varsayılan olarak bulunmayabilir; bu parametre genellikle Debian/Ubuntu kernel’larına özgüdür. RHEL’de user namespace’leri farklı şekilde kontrol edilir:
# RHEL 8+ için user namespace kısıtlaması
echo "user.max_user_namespaces = 0" >> /etc/sysctl.d/99-security-hardening.conf
# Doğrula
sysctl user.max_user_namespaces
Ubuntu/Debian
Bu sistemlerde apparmor ile sysctl parametrelerini birlikte kullanmak katmanlı güvenlik sağlar. Ayrıca Ubuntu 22.04 ile birlikte gelen kernel’da bazı parametrelerin varsayılan değerleri daha güvenli hale getirilmiştir; sysctl -a ile kontrol etmeyi ihmal etmeyin.
Üretim Ortamına Geçiş Stratejisi
Güvenlik sertleştirme değişikliklerini mevcut üretim sistemine uygulamadan önce dikkatli bir planlama yapın. Yanlış yapılandırılmış RPF ayarı asimetrik routing kullanan bir ortamda trafiği kesebilir. ICMP kısıtlamaları bazı izleme araçlarını etkileyebilir.
Önerilen yaklaşım şu şekilde olmalıdır:
- Önce staging ortamında test edin ve en az 48 saat izleyin
- Değişiklikleri tek tek uygulayın, hepsini aynı anda değil
- Her değişiklik öncesinde mevcut değeri kayıt altına alın
- Geri dönüş planınız olsun; sorunlu parametre için
sysctl -w parametre=eski_değerile anında geri alabilirsiniz - Ağ izleme araçlarınızı (Zabbix, Prometheus node_exporter) değişiklik öncesi ve sonrası kontrol edin
- Değişiklikleri maintenance window’a alın
Sonuç
sysctl parametreleri, Linux güvenliğinin en hafife alınan ama en etkili katmanlarından biridir. Firewall kuralları, SELinux/AppArmor politikaları ve uygulama seviyesi güvenlik önlemleriyle birlikte kullanıldığında derinlemesine savunma (defense in depth) stratejisinin kritik bir parçasını oluştururlar.
Bu yazıda ele aldığımız parametreler birbiriyle ilişkilidir ve hepsi birden uygulandığında sinerjik bir etki yaratır. SYN flood koruması, IP spoofing önlemi, ASLR ve kernel bilgi sızıntısı koruması bir arada çalışarak saldırganın işini önemli ölçüde zorlaştırır.
Son olarak şunu vurgulamak istiyorum: Bu parametreler bir kez ayarlayıp unutulacak şeyler değildir. Yeni CVE’ler, kernel güncellemeleri ve değişen ağ topolojileri bu değerleri gözden geçirmenizi gerektirebilir. Yazdığımız audit scriptini düzenli çalıştırın, CIS Benchmark ve DISA STIG gibi güvenlik standartlarını takip edin ve kernel güvenlik gelişmelerini yakından izleyin.
