Linux Sunucu Güvenliği: Hardening Kontrol Listesi
Linux sunucular, web uygulamalarından veritabanlarına, e-posta servislerinden DNS hizmetlerine kadar kritik altyapıların temelini oluşturur. Ancak varsayılan yapılandırmalarıyla bırakılan bir sunucu, saldırganlar için açık bir davetiye niteliğindedir. Bu yazıda, bir Linux sunucuyu üretime almadan önce uygulamanız gereken kapsamlı bir güvenlik sıkılaştırma (hardening) kontrol listesini adım adım inceleyeceğiz.
1. Kullanıcı ve Erişim Yönetimi
Root Erişimini Kısıtlayın
Sunucunuza doğrudan root kullanıcısıyla giriş yapılması, güvenlik açısından en büyük risklerden biridir. Bunun yerine ayrıcalıklı olmayan bir kullanıcı oluşturup sudo yetkisi verin.
# Yeni kullanıcı oluşturun
adduser deploy
# Kullanıcıyı sudo grubuna ekleyin
usermod -aG sudo deploy
# Root girişini devre dışı bırakmak için /etc/ssh/sshd_config dosyasını düzenleyin
PermitRootLogin no
# SSH servisini yeniden başlatın
systemctl restart sshd
Güçlü Parola Politikası Uygulayın
Zayıf parolalar, brute-force saldırılarının en kolay hedefidir. libpam-pwquality modülünü kullanarak parola karmaşıklık kurallarını zorunlu hale getirin.
# PAM parola kalite modülünü kurun
apt install libpam-pwquality -y
# /etc/security/pwquality.conf dosyasını düzenleyin
minlen = 14
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
maxrepeat = 3
Bu yapılandırma ile parolaların en az 14 karakter uzunluğunda olması, büyük harf, küçük harf, rakam ve özel karakter içermesi zorunlu hale gelir.
Kullanılmayan Hesapları Temizleyin
Sistemdeki eski, kullanılmayan veya varsayılan hesapları düzenli olarak gözden geçirin ve devre dışı bırakın.
# Shell erişimi olan kullanıcıları listeleyin
awk -F: '$7 !~ /(nologin|false)/' /etc/passwd
# Kullanılmayan hesabı kilitleyin
usermod -L eski_kullanici
# Hesabı tamamen devre dışı bırakın
usermod -s /usr/sbin/nologin eski_kullanici
2. SSH Güvenliğini Sıkılaştırma
SSH, sunucunuza uzaktan erişimin temel yoludur ve en çok hedef alınan servislerden biridir. Aşağıdaki ayarları /etc/ssh/sshd_config dosyasında yapılandırın.
# Varsayılan portu değiştirin (security through obscurity değil, bot trafiğini azaltır)
Port 2222
# Sadece SSH protokol 2 kullanın
Protocol 2
# Root girişini kapatın
PermitRootLogin no
# Parola ile girişi devre dışı bırakın, sadece anahtar tabanlı kimlik doğrulama
PasswordAuthentication no
PubkeyAuthentication yes
# Boş parolalara izin vermeyin
PermitEmptyPasswords no
# X11 yönlendirmeyi kapatın
X11Forwarding no
# Maksimum giriş denemesi
MaxAuthTries 3
# Bağlantı zaman aşımı
ClientAliveInterval 300
ClientAliveCountMax 2
# Belirli kullanıcılara erişim izni verin
AllowUsers deploy admin
Değişikliklerden sonra SSH servisini yeniden başlatmayı unutmayın. Ancak önce mevcut oturumunuzu açık tutarak yeni bir oturumla bağlantıyı test edin; aksi halde kendinizi sunucudan kilitleyebilirsiniz.
SSH Anahtar Yönetimi
# İstemci tarafında güçlü bir anahtar çifti oluşturun
ssh-keygen -t ed25519 -C "deploy@sunucu"
# Genel anahtarı sunucuya kopyalayın
ssh-copy-id -p 2222 deploy@sunucu_ip
# Sunucuda authorized_keys dosyası izinlerini kontrol edin
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. Güvenlik Duvarı Yapılandırması
Güvenlik duvarı, sunucunuzun ilk savunma hattıdır. Ubuntu/Debian sistemlerde ufw, RHEL/CentOS sistemlerde firewalld kullanabilirsiniz.
# UFW ile temel yapılandırma
ufw default deny incoming
ufw default allow outgoing
# Sadece gerekli portları açın
ufw allow 2222/tcp comment 'SSH'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
# Güvenlik duvarını etkinleştirin
ufw enable
# Durumu kontrol edin
ufw status verbose
Iptables ile İleri Düzey Kurallar
# SYN flood koruması
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# Ping flood koruması
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Port tarama koruması
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
4. Sistem Güncellemeleri ve Yama Yönetimi
Güncel olmayan yazılımlar, bilinen güvenlik açıklarına karşı savunmasızdır. Otomatik güvenlik güncellemelerini etkinleştirin.
# Debian/Ubuntu için otomatik güvenlik güncellemeleri
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
# /etc/apt/apt.conf.d/50unattended-upgrades dosyasını düzenleyin
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Mail "admin@sirket.com";
Otomatik yeniden başlatmayı devre dışı bırakmanız önerilir; çekirdek güncellemelerinden sonra yeniden başlatma işlemini planlı bakım pencerelerinde manuel olarak gerçekleştirin.
5. Dosya Sistemi Güvenliği
Kritik Dosya İzinlerini Kontrol Edin
# Dünyaya yazılabilir dosyaları bulun
find / -xdev -type f -perm -o+w -print 2>/dev/null
# SUID/SGID bit ayarlı dosyaları bulun
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -print 2>/dev/null
# Kritik dosya izinlerini sıkılaştırın
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 600 /etc/gshadow
chmod 644 /etc/group
chmod 700 /root
/tmp Dizinini Güvenli Hale Getirin
/tmp dizini saldırganların sıklıkla kötü amaçlı yazılım çalıştırmak için kullandığı bir alandır. Ayrı bir bölüm olarak bağlayıp çalıştırma izinlerini kaldırın.
# /etc/fstab dosyasına ekleyin
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
# Değişikliği uygulayın
mount -o remount /tmp
6. Loglama ve İzleme
Etkili bir güvenlik stratejisi, olayları tespit edebilme yeteneğine dayanır. Merkezi loglama ve dosya bütünlüğü izleme araçlarını devreye alın.
Auditd ile Sistem Denetimi
# Auditd kurulumu
apt install auditd audispd-plugins -y
# Temel denetim kuralları (/etc/audit/rules.d/hardening.rules)
# Kullanıcı ve grup değişikliklerini izleyin
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
# Oturum açma olaylarını izleyin
-w /var/log/lastlog -p wa -k logins
-w /var/log/faillog -p wa -k logins
# Kuralları yükleyin
auditctl -R /etc/audit/rules.d/hardening.rules
Fail2Ban ile Brute-Force Koruması
# Fail2Ban kurulumu
apt install fail2ban -y
# /etc/fail2ban/jail.local dosyasını oluşturun
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
action = %(action_mwl)s
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
# Servisi başlatın
systemctl enable fail2ban
systemctl start fail2ban
# Yasaklı IP'leri kontrol edin
fail2ban-client status sshd
7. Ağ Güvenliği
Çekirdek Ağ Parametrelerini Sıkılaştırın
/etc/sysctl.conf dosyasına aşağıdaki parametreleri ekleyerek çekirdek seviyesinde ağ güvenliğini artırın.
# IP yönlendirmeyi devre dışı bırakın
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# ICMP yönlendirmelerini kabul etmeyin
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Kaynak yönlendirmeli paketleri reddedin
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# SYN cookie korumasını etkinleştirin
net.ipv4.tcp_syncookies = 1
# Sahte adres koruması
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Şüpheli paketleri logla
net.ipv4.conf.all.log_martians = 1
# Değişiklikleri uygulayın
sysctl -p
8. Gereksiz Servisleri Devre Dışı Bırakın
Çalışan her servis, potansiyel bir saldırı yüzeyidir. Yalnızca ihtiyacınız olan servisleri çalıştırın.
# Çalışan servisleri listeleyin
systemctl list-units --type=service --state=running
# Gereksiz servisleri durdurun ve devre dışı bırakın
systemctl stop cups
systemctl disable cups
systemctl stop avahi-daemon
systemctl disable avahi-daemon
systemctl stop rpcbind
systemctl disable rpcbind
# Dinleyen portları kontrol edin
ss -tulnp
9. AppArmor veya SELinux
Zorunlu erişim kontrolü (MAC) mekanizmaları, uygulamaların erişebileceği kaynakları sınırlayarak saldırı etkisini minimize eder.
# AppArmor durumunu kontrol edin (Ubuntu/Debian)
aa-status
# Tüm profilleri zorlama moduna alın
aa-enforce /etc/apparmor.d/*
# SELinux durumunu kontrol edin (RHEL/CentOS)
sestatus
# SELinux'u zorlama moduna alın
setenforce 1
# Kalıcı yapmak için /etc/selinux/config dosyasında:
SELINUX=enforcing
10. Yedekleme ve Felaket Kurtarma
Güvenlik sıkılaştırması, yedekleme olmadan eksik kalır. Düzenli yedekler alın ve geri yükleme sürecinizi test edin.
# Kritik yapılandırma dosyalarını yedekleyin
tar czf /backup/etc-$(date +%F).tar.gz /etc/
# Yedekleme dizini izinlerini sıkılaştırın
chmod 700 /backup
chown root:root /backup
Kontrol Listesi Özeti
- Root erişimini devre dışı bırakın ve sudo yapılandırması kullanın
- SSH sıkılaştırması: anahtar tabanlı kimlik doğrulama, port değişikliği, giriş kısıtlamaları
- Güvenlik duvarı: varsayılan olarak tüm gelen trafiği reddedin, sadece gereklileri açın
- Otomatik güvenlik güncellemelerini etkinleştirin
- Dosya izinlerini denetleyin, SUID/SGID dosyalarını kontrol edin
- Auditd ile sistem denetimi kurallarını yapılandırın
- Fail2Ban ile brute-force koruması sağlayın
- Çekirdek ağ parametrelerini sıkılaştırın
- Gereksiz servisleri durdurun ve devre dışı bırakın
- AppArmor/SELinux zorunlu erişim kontrolünü etkinleştirin
- Düzenli yedekleme alın ve geri yükleme testleri yapın
- Güçlü parola politikası uygulayın
Sonuç
Linux sunucu güvenliği, tek seferlik bir işlem değil; sürekli devam eden bir süreçtir. Bu kontrol listesini üretime alma öncesinde uygulamak, sunucunuzun güvenlik duruşunu önemli ölçüde güçlendirecektir. Ancak unutmayın: güvenlik katmanlı bir yaklaşım gerektirir. Düzenli güvenlik taramaları, log analizleri ve penetrasyon testleriyle sisteminizi sürekli gözden geçirin. Yeni çıkan güvenlik açıklarını takip etmek için dağıtımınızın güvenlik bültenlerine abone olun ve güvenlik yamalarını mümkün olan en kısa sürede uygulayın.
Güvenlik sıkılaştırması ne kadar kapsamlı olursa olsun, hiçbir sistem yüzde yüz güvenli değildir. Amaç, saldırı yüzeyini minimize etmek, tespit yeteneklerini artırmak ve olası bir ihlal durumunda etkiyi sınırlamaktır. Bu kontrol listesini kendi ortamınıza uyarlayarak düzenli olarak gözden geçirmeniz, sunucu güvenliğinizi sürdürülebilir kılacaktır.