Linux Çekirdeği Güvenlik Parametrelerini Sertleştirme
Üretim ortamındaki bir Linux sunucusunu ele geçirmenin en yaygın yollarından biri, çekirdek düzeyindeki varsayılan güvenlik ayarlarının ihmal edilmesidir. Kurulumdan sonra kutudan çıktığı haliyle gelen bir Linux sistemi, pek çok ağ parametresi açısından oldukça gevşek bir yapılandırmaya sahiptir. Bu durum, saldırganlar için gerçek anlamda bir davetiye niteliği taşır. Bugün sysctl parametrelerinden başlayarak, çekirdek düzeyinde uygulayabileceğiniz güvenlik sertleştirme adımlarını tek tek ele alacağız.
Temel Kavramlar ve Neden Önemli?
Linux çekirdeği, çalışma zamanında /proc/sys/ dizini üzerinden onlarca parametreyi dinamik olarak yönetir. Bu parametreler; ağ davranışını, bellek korumasını, süreç izolasyonunu ve sistem kaynaklarının kullanımını doğrudan etkiler. sysctl komutu bu parametreleri hem anlık olarak değiştirmenizi hem de kalıcı hale getirmenizi sağlar.
Varsayılan değerlerin tehlikeli olduğunu somut bir örnekle açıklayayım: Bir e-ticaret şirketinde çalışırken, DMZ’deki bir web sunucusunun IP forwarding özelliğinin açık geldiğini fark etmiştik. Sunucu yanlışlıkla hem iç ağa hem de dışa bakan bir arayüze sahipti. Eğer bu sunucu ele geçirilseydi, saldırgan iç ağa doğrudan trafik yönlendirebilirdi. Böyle bir açık, tek bir sysctl parametresiyle kapatılabilir.
sysctl ile Temel Ağ Güvenlik Parametreleri
IP Forwarding ve Kaynak Yönlendirme Kapatma
İlk ve en kritik adım, sunucunun bir yönlendirici gibi davranmasını engellemektir. Web sunucusu, uygulama sunucusu veya veritabanı sunucusu gibi rollerdeki makinelerde IP yönlendirmenin kesinlikle kapalı olması gerekir.
# Mevcut durumu kontrol et
sysctl net.ipv4.ip_forward
sysctl net.ipv6.conf.all.forwarding
# Anlık olarak kapat
sysctl -w net.ipv4.ip_forward=0
sysctl -w net.ipv6.conf.all.forwarding=0
# Kaynak tabanlı yönlendirmeyi kapat
sysctl -w net.ipv4.conf.all.accept_source_route=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv6.conf.all.accept_source_route=0
Kaynak yönlendirme (source routing), saldırganların paketlerin güzergahını manipüle etmesine imkan tanır. Neredeyse hiçbir meşru kullanım senaryosu bu özelliği gerektirmez.
SYN Flood Koruması
SYN flood saldırıları, TCP bağlantı kuyruğunu doldurmaya çalışan klasik bir DDoS yöntemidir. SYN cookies mekanizması bu saldırıya karşı etkili bir savunma sunar.
# SYN cookies etkinleştir
sysctl -w net.ipv4.tcp_syncookies=1
# SYN-ACK yeniden deneme sayısını azalt
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_syn_retries=5
# Yarım açık bağlantı kuyruğunu artır
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
# FIN_WAIT_2 durumunda bekleme süresini düşür
sysctl -w net.ipv4.tcp_fin_timeout=15
Bu parametrelerle birlikte, SYN flood sırasında sunucunuzun çökmesi yerine saldırıyı absorbe ederek hizmet vermeye devam etmesi çok daha mümkün hale gelir.
ICMP ve Ping Saldırılarına Karşı Önlemler
ICMP protokolü ağ tanılaması için vazgeçilmez olsa da kötüye kullanım açısından da zengin bir yüzey sunar. ICMP redirect mesajları, saldırganların trafik akışını değiştirmek için kullandığı bir tekniktir.
# ICMP redirect kabul etmeyi kapat
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv4.conf.all.secure_redirects=0
sysctl -w net.ipv4.conf.default.secure_redirects=0
# IPv6 redirect kapatma
sysctl -w net.ipv6.conf.all.accept_redirects=0
sysctl -w net.ipv6.conf.default.accept_redirects=0
# ICMP redirect göndermeyi kapat
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.default.send_redirects=0
# Broadcast ping'e yanit vermeyi kapat (Smurf saldirisi korumasi)
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# Yaniltici hata mesajlarindan koruma
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
Reverse Path Filtering (rp_filter)
Ters yol filtrelemesi, sahte kaynak IP adresi kullanan paketleri engellemek için son derece etkili bir mekanizmadır. Spoofing saldırılarına karşı çekirdek düzeyinde bir savunma hattı oluşturur.
# Strict mode ile rp_filter etkinleştir
sysctl -w net.ipv4.conf.all.rp_filter=1
sysctl -w net.ipv4.conf.default.rp_filter=1
# Belirli bir arayüz için kontrol et
cat /proc/sys/net/ipv4/conf/eth0/rp_filter
rp_filter değerleri:
- 0: Ters yol filtrelemesi kapalı
- 1: Katı mod – Paket gelen arayüzden çıkış yapabilmeli
- 2: Gevşek mod – Herhangi bir arayüzden çıkış yapabilmeli
Çok arayüzlü sistemler dışında değerin 1 olması önerilir.
Kalıcı Yapılandırma: /etc/sysctl.conf
Yukarıdaki tüm değişiklikler sistem yeniden başladığında sıfırlanır. Kalıcı hale getirmek için /etc/sysctl.d/ dizinini kullanmak en temiz yaklaşımdır.
# Guvenlik parametreleri icin ayri bir dosya olustur
cat > /etc/sysctl.d/99-security-hardening.conf << 'EOF'
# =============================================
# Network Security Hardening Parameters
# Son guncelleme: $(date +%Y-%m-%d)
# =============================================
# IP Forwarding - Yonlendirici degilsek kapali olmali
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# Kaynak yonlendirme
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# SYN Flood Korumasi
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_fin_timeout = 15
# ICMP Redirect
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# ICMP Broadcast / Bogus
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Ters Yol Filtrelemesi
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Log Spoofed / Martian Packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# IPv6 Router Advertisement
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
EOF
# Degisiklikleri uygula
sysctl -p /etc/sysctl.d/99-security-hardening.conf
Bellek ve Süreç Güvenliği Parametreleri
Ağ güvenliğinin ötesinde, çekirdek düzeyinde bellek ve süreç koruması da kritik öneme sahiptir.
ASLR (Address Space Layout Randomization)
ASLR, bellek adreslerini rastgele hale getirerek buffer overflow ve return-oriented programming saldırılarını zorlaştırır.
# Mevcut durumu kontrol et (2 olmali)
cat /proc/sys/kernel/randomize_va_space
# 2: Tam ASLR (yigin, heap, mmap, vstack randomizasyonu)
sysctl -w kernel.randomize_va_space=2
# /proc/sys/kernel/randomize_va_space degerlerinin anlami:
# 0: Kapalı
# 1: Kısmi rastgeleleştirme
# 2: Tam rastgeleleştirme (onerilen)
Core Dump ve ptrace Kisitlamalari
Core dump dosyaları hassas bellek içeriğini sızdırabilir. ptrace sistemi çağrısının kısıtlanması ise process injection saldırılarını engeller.
# Core dump'lari kisitla
sysctl -w fs.suid_dumpable=0
sysctl -w kernel.core_uses_pid=1
# ptrace kapsamini kisitla
# 0: Tum processler birbirini izleyebilir (tehlikeli)
# 1: Yalnizca parent process child'i izleyebilir
# 2: Yalnizca CAP_SYS_PTRACE yetkisiyle
# 3: Hic kimse ptrace yapamaz
sysctl -w kernel.yama.ptrace_scope=1
# /proc dizinine erisimi kisitla
sysctl -w kernel.dmesg_restrict=1
sysctl -w kernel.kptr_restrict=2
kernel.kptr_restrict değerleri:
- 0: Çekirdek pointer’ları /proc’ta görünür
- 1: Yalnızca root görebilir
- 2: Hiç kimse göremez (en güvenli)
Martian Paket Loglama ve Audit
Gerçek dünyada güvenlik olaylarını tespit edebilmek için sadece parametreleri ayarlamak yetmez. Şüpheli trafik hakkında log üretmek de bir o kadar önemlidir.
# Martian paketleri logla (sahte kaynak IP'li paketler)
sysctl -w net.ipv4.conf.all.log_martians=1
sysctl -w net.ipv4.conf.default.log_martians=1
# Mevcut loglari kontrol et
dmesg | grep "martian source"
grep "martian" /var/log/kern.log
# Belirli bir arayuz icin loglari filtrele
journalctl -k | grep "martian"
Bir pentest projesinde bu loglama özelliğinin açık olduğu bir sistemde, DMZ’deki sunucuya yönelik IP spoofing denemelerini gerçek zamanlı olarak tespit edebildik. Saldırganın hangi kaynak adreslerini denediğini bu loglar sayesinde görmek, saldırı vektörünü anlamlandırmayı çok kolaylaştırdı.
Otomatik Kontrol Script’i
Tüm bu parametreleri düzenli olarak kontrol etmek için bir script hazırlamak, hem ekip içi farkındalık hem de uyumluluk açısından faydalıdır.
#!/bin/bash
# kernel-security-audit.sh
# Cekirdek guvenlik parametrelerini denetler
RED='33[0;31m'
GREEN='33[0;32m'
YELLOW='33[1;33m'
NC='33[0m'
PASS=0
FAIL=0
check_param() {
local param=$1
local expected=$2
local description=$3
local current
current=$(sysctl -n "$param" 2>/dev/null)
if [ "$current" = "$expected" ]; then
echo -e "${GREEN}[PASS]${NC} $description ($param = $current)"
((PASS++))
else
echo -e "${RED}[FAIL]${NC} $description ($param = $current, beklenen: $expected)"
((FAIL++))
fi
}
echo "========================================="
echo " Linux Kernel Guvenlik Denetim Raporu"
echo " Tarih: $(date)"
echo "========================================="
echo ""
echo "--- Ag Guvenligi ---"
check_param "net.ipv4.ip_forward" "0" "IP Forwarding kapali"
check_param "net.ipv4.tcp_syncookies" "1" "SYN Cookies aktif"
check_param "net.ipv4.conf.all.rp_filter" "1" "Reverse Path Filtering aktif"
check_param "net.ipv4.conf.all.accept_redirects" "0" "ICMP Redirect kabul edilmiyor"
check_param "net.ipv4.conf.all.send_redirects" "0" "ICMP Redirect gonderilmiyor"
check_param "net.ipv4.icmp_echo_ignore_broadcasts" "1" "Broadcast ping yok sayiliyor"
check_param "net.ipv4.icmp_ignore_bogus_error_responses" "1" "Sahte hata mesajlari yok sayiliyor"
check_param "net.ipv4.conf.all.log_martians" "1" "Martian paket loglama aktif"
check_param "net.ipv4.conf.all.accept_source_route" "0" "Kaynak yonlendirme devre disi"
echo ""
echo "--- Bellek ve Surec Guvenligi ---"
check_param "kernel.randomize_va_space" "2" "ASLR tam aktif"
check_param "kernel.dmesg_restrict" "1" "dmesg erisimi kisitli"
check_param "kernel.kptr_restrict" "2" "Kernel pointer gizli"
check_param "fs.suid_dumpable" "0" "SUID core dump kapali"
check_param "kernel.yama.ptrace_scope" "1" "ptrace kisitli"
echo ""
echo "========================================="
echo " Sonuc: ${GREEN}$PASS PASS${NC} | ${RED}$FAIL FAIL${NC}"
echo "========================================="
if [ $FAIL -gt 0 ]; then
exit 1
fi
Bu script’i hem manuel çalıştırabilir hem de cron job olarak her gün sabah saatlerinde çalıştırıp sonuçları e-posta ile alacak şekilde yapılandırabilirsiniz.
Dağıtıma Özel Notlar
RHEL / CentOS / AlmaLinux
# sysctl.d dizinini kontrol et
ls /etc/sysctl.d/
# Guc kontrol
sysctl -a 2>/dev/null | grep -E "ip_forward|syncookies|rp_filter"
# Kalici uygula
sysctl --system
# SELinux ile birlikte kullanirken
sestatus
# SELinux aktifse bazi parametreler SELinux politikasi tarafindan
# zaten yonetiliyor olabilir
Ubuntu / Debian
# Ubuntu'da cloud-init bazi parametreleri override edebilir
ls /etc/sysctl.d/
# 10-console-messages.conf, 10-ipv6-privacy.conf gibi dosyalar olabilir
# Onceliklendirme: Buyuk numarali dosyalar daha sonra islenir
# 99-security-hardening.conf her seyi override eder
# Debian'da ek olarak
apt install libpam-tmpdir -y # /tmp izolasyonu
Gercek Dunya Senaryosu: Hardening Sonrasi Dogrulama
Bir finansal teknoloji firmasında yapılan sertleştirme çalışmasından sonra sistemin düzgün çalışıp çalışmadığını doğrulamak kritikti. Kullandığımız yaklaşım şöyle oldu:
# Yonlendirme testleri
# Ayni agdaki baska bir sunucudan
# 1. SYN flood simulasyonu (hping3 ile)
# Bu komutu yalnizca TEST ortaminda ve izinli sistemlerde calistirin
hping3 -S --flood -V -p 80 TARGET_IP
# 2. IP Spoofing testi
hping3 -S -a 192.0.2.1 -p 80 TARGET_IP
# Hedef sistemde: dmesg | grep martian komutu ile gorulmeli
# 3. ICMP broadcast testi
ping -b 192.168.1.255
# Sertlestirilen sistemin yanit vermemesi gerekir
# 4. Tum parametreleri toplu dogrula
sysctl -a 2>/dev/null | grep -v "^#" | sort > /tmp/current-params.txt
diff /tmp/baseline-params.txt /tmp/current-params.txt
Bu tür doğrulama testlerini değişiklik yönetim sürecinin bir parçası haline getirmek, sertleştirmenin gerçekten etkili olduğunu kanıtlamanın en güvenilir yoludur.
Eksik Kalmaması Gereken Ek Parametreler
Temel sertleştirmenin ötesinde, çoğunlukla gözden kaçan birkaç parametre daha var:
# TCP Time-Wait saldirilarindan koruma
sysctl -w net.ipv4.tcp_rfc1337=1
# Yeterli ephemeral port araligini sagla (port tukenmesi engeli)
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# IPv6 privacy extension (MAC adresinden uretilen IPv6 adresini gizle)
sysctl -w net.ipv6.conf.all.use_tempaddr=2
# Execshield benzeri koruma (x86_64 icin moot ama belirtmekte fayda var)
sysctl -w kernel.exec-shield=1 2>/dev/null || true
# Kprobes ve BPF kısıtlama
sysctl -w kernel.perf_event_paranoid=3
sysctl -w kernel.unprivileged_bpf_disabled=1
net.ipv4.tcp_rfc1337: TCP TIME-WAIT durumunu suiistimal eden saldırılara karşı RFC 1337 korumasını etkinleştirir.
kernel.unprivileged_bpf_disabled: Ayrıcalıksız kullanıcıların BPF programı yüklemesini engeller. Bu özellikle container ortamlarında kritik öneme sahiptir.
kernel.perf_event_paranoid: Performans sayaçlarına erişimi kısıtlar. Yan kanal saldırılarını zorlaştırır.
Sonuç
Çekirdek güvenlik parametrelerini sertleştirmek, bir sunucunun güvenlik duruşunu iyileştirmek için en düşük maliyetli ve en etkili adımlardan biridir. Hiçbir ek yazılım kurulumu gerektirmez, performans üzerindeki etkisi minimumdur ve uygulaması onlarca satır yapılandırma ile tamamlanır.
Önemli olan birkaç nokta var: Her ortam farklıdır. Yük dengeleyici veya VPN sunucusu gibi roller için bazı parametreler farklı değerler almalıdır. Değişiklikleri önce test ortamında uygulayın, uygulamalarınızın beklendiği gibi çalışıp çalışmadığını doğrulayın, ardından production’a taşıyın. Değişiklik kayıtlarını tutun ve denetim script’ini düzenli çalıştırın.
Bu parametreler bir güvenlik katmanıdır, tek başına yeterli değildir. Firewall kuralları, IDS/IPS sistemleri, düzenli yama yönetimi ve güvenli uygulama geliştirme pratikleriyle birlikte uygulandığında gerçek anlamda derinlemesine savunma sağlar. Sisteminizi sertleştirin, denetleyin, tekrarlayın.
