Linux sunucu güvenliği yazı dizimize kaldığımız yerden kernel hardening ile devam ediyoruz. Sistemde fonksiyonel olarak hiç bir değişiklik yapmayacağız. Kernel üzerindeki parametreleri kullanarak gerekli sıkılaştırma işlemlerini gerçekleştireceğiz.
Aşağıda uygulanacak işlemlerin kullanımdan kalkmış(deprecated) kernel sürümlerinde geçerli olmayacaktır. Minimum kernel sürümünüz 4.19.x olmalıdır.
- Linux Sunucu Güvenliği Bölüm 1: SSH Hardening
- Linux Sunucu Güvenliği Bölüm 2: Kernel Hardening
Kernel, işletim sisteminin bel kemiğidir ve maalesef ki bütün saldırılara karşı en savunmasız halkalardan biridir. Bu sebeple *nix bir işletim sisteminde kernel dimdik ayakta durmalı ve mümkün olduğu kadar sıkılaştırılmalıdır.
Linux Kernel Seçimi
Linux kernel iki şekilde piyasaya sürülmektedir;
- Kararlı Sürüm
- Uzun Vadeli Sürüm (LTS)
Linux çekirdeği güvenlik açıklarını doğru bir şekilde tanımlayabilmek için kullanılan CVE veritabanı çoğu zaman kullanılmaz. Bunun yerine genellikle kendi duyurularını yayınlarlar. Örnek vermemiz gerekirse Debian çekirdeğini bu adresten kontrol edebilirsiniz, aynı sayfa içerisinde güvenlik yamaları ile ilgilide bilgileri görebilirsiniz.
Güncel linux çekirdeğini kullanmak size faydadan çok zarar verecektir. Eklenen yeni özellikler sebebiyle saldırı yüzeyiniz fazlaca artacak ve güvenlik zafiyetlerine maruz kalma olasılığınız da artacaktır. Aksine LTS çekirdek yeni özellikleri uzun süre içermez bu yüzden de yüzey alanı düşüktür.
Ek olarak, kararlı çekirdek sürümleri LTS çekirdeklerinin yapamadığı belirli açıkların kullanılmasının önüne geçmek için daha yeni sıkılaştırma özelliklerini de içerir. Bu sebeple mümkün olduğunca LTS sürümlerini seçmenizde fayda var.
Sysctl ile Kernel Hardening
Bu bizim kernel üzerinde hüküm sürmemize imkan sağlar, belirli parametreleri değiştirerek sistem üzerinde her türlü değişikliği yapabiliriz. Özellikleri aktif edebilir, gerekirse aktif olan herhangi bir özelliği kapatabiliriz.
Sysctl’leri kalıcı olarak değiştirmek için /etc/sysctl.conf
değiştirmek istediğiniz parametreleri vermeniz veya Linux dağıtımınıza bağlı olarak /etc/sysctl.d
içindeki karşılık gelen dosyaları ekleyebilir, düzenleyebilirsiniz.
Aşağıda sırasıyla değiştirmesi önerilen kernel parametreleri verilmiştir.
# ptrace çalışan süreç değiştirmesini engelle
kernel.yama.ptrace_scope=3
# kexec kapat
kernel.kexec_load_disabled=1
# sysrq kapat
kernel.sysrq=0
# Kernel pointer sınırla
kernel.kptr_restrict=2
# Kernel mesajlarında hassas verileri kaldir
kernel.dmesg_restrict=1
# Boot sırasında dmesg gizle
kernel.printk=3 3 3 3
# TTY ile yetki yükseltilmesini kısıtlar
dev.tty.ldisc_autoload=0
# Ayrıcalık yükseltme potansiyelini en aza indir
kernel.unprivileged_userns_clone=0
# performans eventlerini kısıtla
kernel.perf_event_paranoid=3
# eBPF özelliğini kapat
kernel.unprivileged_bpf_disabled=1
# eBPF jit sıkılaştırma
net.core.bpf_jit_harden=2
# SYNFlood koruma
net.ipv4.tcp_syncookies=1
# RST Paket drop
net.ipv4.tcp_rfc1337=1
# Kritik bellek alanlarını rastgele yaymak için entropy arttır
vm.mmap_rnd_bits=32
vm.mmap_rnd_compat_bits=16
# Alınan paketlerde kaynak doğrula
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
# ICMP yönlendirme kapat
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.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
# Smurf attack engelle, ICMP kısıtla
net.ipv4.icmp_echo_ignore_all=1
# Veri sahtekarlığını kısıtla
fs.protected_fifos=2
fs.protected_regular=2
# Yönlendirmeleri kapat
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.ipv6.conf.default.accept_source_route=0
# TCP SACK kapat
net.ipv4.tcp_sack=0
net.ipv4.tcp_dsack=0
net.ipv4.tcp_fack=0
# IPv6 kısıtla Mitm engelle
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.router_solicitations=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.dad_transmits=0
net.ipv6.conf.default.max_addresses=1
# Sembolik bağ kısıtla(sadece okuma/yazma yetkisi olanlar erişir)
fs.protected_symlinks=1
fs.protected_hardlinks=1
# Sistem zamanının sızmasını engelleme
net.ipv4.tcp_timestamps=0
Boot(Ön yükleyici) Parametre Güvenliği
boot parametreleri, önyükleme sırasında ayarları parametreler aracılığı ile çekirdeğe aktarır. Bazı ayarlar, sysctl’de yaptığımız ile benzer şekilde güvenliği artırmak için kullanılabilir.
Ön yükleyici olarak grub kullanıyorsanız, /etc/default/grub
içerisinde geçen GRUB_CMDLINE_LINUX_DEFAULT
satırını aşağıdaki gibi değiştirin. Güvenliği artırmak için aşağıdaki ayarları yapmanızı şiddetle öneririm. (parametrelerin ne işe yaradığını google kullanarak öğrenebilirsiniz.)
GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=0 systemd.show_status=true elevator=noop console=tty1 console=ttyS0 slab_nomerge slub_debug=FZ init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic module.sig_enforce=1 lockdown=confidentiality mce=0 quiet loglevel=0"
Yaptığınız bu değişikliklerin geçerli olabilmesi için update-grub
komutunu verin.
Casusluk Engelleme
Varsayılan olarak sisteme erişmiş bir saldırganın diğer işlemler hakkında casusluk yapmasına izin verir ve tüm kullanıcılar tarafından erişilebilir /proc üzerinde gerekli değişiklikleri yapmak sistemimizin güvenliğini arttırabilir.
Kullanıcıların yalnızca kendi işlemlerini görebilmesi ve diğer kullanıcıların işlemlerini görememesine izin vermek için aşağıdaki değişikliği /etc/fstab
üzerinde yapınız.
proc /proc proc nosuid, relatime, nodev, noexec, hidepid=2, gid=proc 0 0
systemd-logind hala diğer kullanıcıların işlemlerini görmeye yapısı gereği ihtiyaç duyar, bu nedenle kullanıcı oturumlarının systemd üzerinde düzgün çalışması için /etc/systemd/system/systemd-logind.service.d/hpid.conf
dosyasını oluşturmalı ve içerisine aşağıdaki satırları eklemelisiniz.
[Service]
SupplementaryGroups=proc
Kullandığınız işletim sistemine göre değişiklik gösterebilir.
Kernel Modüllerinin Kısıtlanması
Belirli çekirdek modüllerinin aktif olması ve/veya hangi çekirdek modüllerinin kara listeye alınacağına ilişkin bütün ayarlar /etc/modprobe.d
içerisine eklenebilecek ayar dosyalar ile belirlenir.
İnstall parametresi modprobe’a kernel modülünün normal şekilde yüklemesini söyler. /bin/false
ile birlikte kullanılırsa kernele modülü yüklemek yerine /bin/false
komutunu direk olarak çalıştırarak modülü kullanıma kapatır.
# Kullanılmayacak Network Protokollerinin kapatılması
install p8022 /bin/false
install can /bin/false
install atm /bin/false
install dccp /bin/false
install sctp /bin/false
install rds /bin/false
install tipc /bin/false
install n-hdlc /bin/false
install rose /bin/false
install decnet /bin/false
install econet /bin/false
install af_802154 /bin/false
install ipx /bin/false
install appletalk /bin/false
install psnap /bin/false
install p8023 /bin/false
install ax25 /bin/false
install netrom /bin/false
install x25 /bin/false
# Kullanılmayan dosya sistemlerinin kapatılması
install cramfs /bin/false
install freevxfs /bin/false
install jffs2 /bin/false
install hfs /bin/false
install hfsplus /bin/false
install squashfs /bin/false
install udf /bin/false
# Kullanılmayan Network dosya sistemlerinin kapatılması
install cifs /bin/false
install nfs /bin/false
install nfsv3 /bin/false
install nfsv4 /bin/false
install gfs2 /bin/false
# Video test sürücüsünün kapatılması
install vivid /bin/false
# Bluetooth kapatılması
install bluetooth /bin/false
install btusb /bin/false
# webcam kapatılması
install uvcvideo /bin/false