Linux Sunucu Güvenliği: Kapsamlı Sıkılaştırma Rehberi

Linux sunucunuzu SSH anahtarları, ufw güvenlik duvarı, fail2ban ve otomatik yamalarla adım adım sıkılaştırın; gerçek komutlarla saldırı yüzeyini daraltın.

Güvenlik
Linux Sunucu Güvenliği: Kapsamlı Sıkılaştırma Rehberi

İnternete açık bir Linux sunucu, kurulduğu andan itibaren tarama botlarının hedefi olur. SSH portu 22 numarada açık kalan bir sunucuda, ilk gece log dosyasına yüzlerce başarısız giriş denemesi düşer. Bunun nedeni sizi özel olarak hedef alan biri değil, interneti sürekli tarayan otomatik botlardır. Sunucu sıkılaştırma (hardening), bu saldırı yüzeyini adım adım daraltma işidir. Aşağıda gerçek komutlarla, tek tek uygulanabilecek bir sıkılaştırma rehberi var.

Tek bir önlem sunucunuzu güvende tutmaz. Güvenlik duvarından SSH yapılandırmasına, otomatik güncellemelerden log izlemeye kadar her katman, bir saldırganın işini biraz daha zorlaştırır. Bu yazıda önce en çok etki yaratan adımları, sonra ince ayarları ele alıyoruz.

Saldırı Yüzeyini Küçültmek

İlk adım, sunucuda gerçekte neyin çalıştığını görmektir. Kullanılmayan her servis ve kapalı olmayan her port bir risktir; kimse kullanmıyorsa, o kapıyı saldırgana açık bırakmanın hiçbir faydası yoktur. Yeni kurulmuş bir sunucuda bile, dağıtımın varsayılan kurulumu ihtiyaç duymayacağınız onlarca servisi çalışır durumda bırakabilir.

# Çalışan servisleri listele
systemctl list-units --type=service --state=running

# Açık portları kontrol et
ss -tulpn

İhtiyaç duyulmayan bir servisi devre dışı bırakmak için tek satır komut yeterlidir:

sudo systemctl disable --now bluetooth.service

Aynı mantık paketler için de geçerli. apt list --installed (Debian/Ubuntu) ya da dnf list installed (RHEL/Fedora) komutuyla kurulu paketleri gözden geçirip kullanılmayan yazılımı kaldırmak, saldırı yüzeyini gerçek anlamda küçültür. Örneğin bir web sunucusunda grafik arayüz paketlerine, bir veritabanı sunucusunda geliştirme araçlarına genellikle ihtiyaç yoktur. Bu paket temizliği, daha geniş bir ağ güvenliği yaklaşımının da doğal bir parçasıdır.

Saldırı yüzeyini küçültmek tek seferlik bir işlem değildir. Yeni bir uygulama kurduğunuzda, onunla birlikte gelen bağımlılıkların hangi portları açtığını kontrol etmek gerekir. Aksi hâlde zamanla fark edilmeyen yeni kapılar birikir. Bu kontrolü düzenli yaparsanız sunucu yıllar geçse de temiz kalır.

Kimlik Doğrulama, Yetki ve SSH Sıkılaştırma

Sunucuya kimin hangi yetkiyle erişeceğini kontrol etmek, güvenliğin ikinci temel katmanıdır. Parola tabanlı girişler ne kadar karmaşık seçilirse seçilsin, kaba kuvvet saldırılarına karşı SSH anahtarları kadar dayanıklı değildir. En az ayrıcalık ilkesi tam burada devreye girer: her kullanıcıya yalnızca işini yapmak için gerekli olan minimum yetki verilir.

SSH yapılandırma dosyasında parola girişini kapatan ve root girişini engelleyen komut satırları

Bir kullanıcıyı doğrudan sudo grubuna eklemek yerine, yalnızca ihtiyaç duyduğu komutlara izin vermek daha güvenli bir yaklaşımdır:

# Kullanıcıyı sudo grubuna ekle
sudo usermod -aG sudo yeni_kullanici

# Belirli komutlarla sınırlı sudo yetkisi için /etc/sudoers.d/ altına dosya ekle
echo "yeni_kullanici ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx" | sudo tee /etc/sudoers.d/yeni_kullanici

Kullanılmayan hesapları da düzenli aralıklarla temizlemek gerekir. lastlog komutu hangi kullanıcının en son ne zaman giriş yaptığını gösterir. Aylardır giriş yapmamış bir hesap, büyük olasılıkla kilitlenmesi gereken bir hesaptır.

SSH, sunucuya açılan ana giriş noktası olduğu için önceliği en yüksek olan katman burasıdır. /etc/ssh/sshd_config dosyasında değiştirmeniz gereken üç satır şöyledir:

PasswordAuthentication no
PermitRootLogin no
Port 2222

Parola girişini kapatmadan önce SSH anahtarınızın sunucuda kayıtlı olduğundan emin olun; aksi hâlde kendinizi dışarıda bırakabilirsiniz. Anahtar oluşturmak ve sunucuya kopyalamak için:

ssh-keygen -t ed25519 -C "sunucu-erisim"
ssh-copy-id -i ~/.ssh/id_ed25519.pub kullanici@sunucu-ip

Değişiklikleri kaydettikten sonra servisi yeniden başlatın; yeni ayarlar ancak bundan sonra devreye girer:

sudo systemctl restart sshd

Port değiştirmek tek başına güvenlik sağlamaz ama botların yaptığı otomatik taramaların büyük kısmını eler. Kaba kuvvet saldırılarını gerçek anlamda durdurmak için fail2ban gibi bir araç gerekir. Root hesabıyla doğrudan giriş engellendiğinde saldırgan önce sıradan bir kullanıcı adı tahmin etmek, ardından yetki yükseltmek zorunda kalır. Bu tek değişiklik, en yaygın otomatik saldırı senaryolarının çoğunu devre dışı bırakır.

Güvenlik Duvarı ve Fail2ban

"Varsayılan olarak reddet" ilkesi, güvenlik duvarı yapılandırmasının temelini oluşturur: açıkça izin verilmeyen her port kapalı kalır. Ubuntu ve Debian tabanlı sistemlerde bu kural ufw ile birkaç dakika içinde kurulabilir:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable

Fail2ban, tekrarlanan başarısız giriş denemelerini tespit edip ilgili IP adresini otomatik olarak engelleyen bir araçtır. Kurulumu ve SSH koruması için temel adımlar şöyledir:

sudo apt install fail2ban
sudo systemctl enable --now fail2ban

/etc/fail2ban/jail.local dosyasında maxretry = 3 ve bantime = 3600 gibi değerler tanımlayarak üç başarısız denemeden sonra bir IP'yi bir saatliğine banlayabilirsiniz. Bir IP'nin gerçekten banlanıp banlanmadığını görmek için fail2ban-client status sshd komutu yeterlidir. Güvenlik duvarı ve fail2ban birlikte çalıştığında, biri ağ seviyesinde biri davranış seviyesinde olmak üzere iki ayrı savunma katmanı oluşur.

Güncellemeler ve Otomatik Yamalar

Yaması çoktan yayınlanmış bir açığın hâlâ istismar edilebilir olmasının nedeni, çoğu zaman ihmal edilmiş güncellemelerdir. Saldırganlar sıfırıncı gün açıklarından çok, aylar önce yaması çıkmış ama sunucuya uygulanmamış açıkları hedef alır. Düzenli güncelleme, uygulanması en ucuz ve etkisi en yüksek güvenlik önlemlerinden biridir. Sunucu sıkılaştırması için sektörde yaygın kabul gören CIS güvenlik ölçütleri, adım adım yapılandırma önerileri sunar.

Sunucu güvenlik katmanlarını gösteren akış: güvenlik duvarı, fail2ban, yama yönetimi ve izleme

Debian/Ubuntu sistemlerinde güvenlik güncellemelerini otomatikleştirmek için unattended-upgrades paketi kullanılır:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

RHEL tabanlı sistemlerde aynı işlevi dnf-automatic üstlenir:

sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

Otomatik güncellemeleri açmadan önce, kritik üretim sunucularında önce bir test ortamında deneyip servisin sorunsuz ayakta kaldığını doğrulamak akıllıca olur. Bazı paket güncellemeleri servisin yeniden başlatılmasını gerektirir ve bu beklenmedik bir kesintiye yol açabilir. Çekirdek güncellemeleri bu açıdan özellikle dikkat ister, çünkü sunucunun yeniden başlatılmasını gerektirebilir.

Hangi paketlerin güncellenmeyi beklediğini elle kontrol etmek isterseniz tek komut yeterlidir:

sudo apt update && sudo apt list --upgradable

Kritik güvenlik yamalarını diğer güncellemelerden ayırmak isterseniz, unattended-upgrades yapılandırmasında yalnızca güvenlik deposunu hedefleyebilirsiniz. Bu, sistemin kararlılığını riske atmadan en acil açıkları kapatmanın makul bir yoludur. needrestart gibi araçlar, yeniden başlatma gerektiren bir güncelleme uygulandığında bunu size bildirerek sürece ek görünürlük katar.

Log İzleme ve Bütünlük Kontrolü

Bir saldırı girişimi genellikle sessiz başlar. Tekrarlayan SSH denemeleri, olağandışı giden bağlantılar ve beklenmeyen cron görevleri, bu sessiz başlangıcın tipik izleridir. Bu izler log dosyalarında birikir ama kimse düzenli bakmazsa hiçbir işe yaramaz. journalctl ile SSH giriş denemelerini hızlıca süzebilirsiniz:

Uzak sunucuya günlük yedekleme almak için kullanılan rsync komutunun terminalde görünümü
sudo journalctl -u sshd --since "1 hour ago" | grep "Failed"

Dosya bütünlüğü izleme, sisteme sızan birinin kritik dosyaları değiştirip değiştirmediğini ortaya çıkarır. AIDE (Advanced Intrusion Detection Environment), bu iş için klasik bir araçtır:

sudo apt install aide
sudo aideinit
sudo aide --check

İlk çalıştırmada AIDE, sistem dosyalarının bir referans veritabanını (baseline) oluşturur. Sonraki kontrollerde bu veritabanıyla karşılaştırma yaparak değişen dosyaları listeler. Bu kontrolü haftalık bir cron görevine bağlarsanız izinsiz değişiklikleri aynı hafta içinde fark edersiniz. Aksi hâlde bir saldırganın sisteme sızıp haftalarca fark edilmeden kalması hiç de nadir bir durum değildir.

Yedekleme ve Şifreleme

Sıkılaştırma ne kadar sağlam olursa olsun, bir fidye yazılımı saldırısı ya da donanım arızası her zaman ihtimal dahilindedir. Bu noktada tek gerçek güvence, düzenli alınan ve gerçekten test edilmiş yedeklemedir. Aşağıdaki gibi basit bir rsync tabanlı yedekleme, uzak bir sunucuya her gün kopya almak için yeterlidir:

rsync -avz --delete /var/www/ yedek-sunucu:/backup/www/

Bu komutu bir cron görevine bağlayıp her gece otomatik çalıştırmak, yedeklemeyi elle hatırlamaya bırakmaktan çok daha güvenilirdir. Aşağıdaki tablo, sunucu güvenliğinde en sık kullanılan katmanları ve her birinin hangi tehdide karşı koruma sağladığını özetliyor:

KatmanAraç örneğiKarşıladığı tehdit
Güvenlik duvarıufw / firewalldGereksiz port taramaları
Kaba kuvvet korumasıfail2banTekrarlayan giriş denemeleri
Bütünlük izlemeAIDEDosya değişikliği / sızma
Yama yönetimiunattended-upgradesBilinen güvenlik açıkları
Yedeklemersync, resticVeri kaybı, fidye yazılımı

Yedeklerin sunucudan fiziksel ya da en azından mantıksal olarak ayrı bir konumda durması şarttır. Aksi hâlde sunucuyu ele geçiren bir saldırgan yedeği de silebilir. Şifreli yedekleme için restic gibi araçlar, sıkıştırma ve şifrelemeyi tek komutta halleder. Yedeklerin gerçekten geri yüklenebilir olduğunu ayda bir test etmek, bir felaket anında sizi gerçekten kurtaracak tek şeydir.

Sıkılaştırmayı Sürdürülebilir Kılmak

Yukarıdaki adımların tamamını bir kerede uygulayıp sunucuyu tümüyle güvenli ilan etmek cazip gelebilir ama gerçekçi değildir. Yeni açıklar zamanla keşfedilir, paketler güncellenir, yapılandırmalar sessizce kayar. Açık portları gözden geçirmeyi, fail2ban loglarını incelemeyi ve yedek geri yükleme testini kapsayan aylık bir kontrol listesi, bu sürekliliği sağlamanın pratik yoludur.

Yeni kurulan bir sunucuda ilk gün uygulanması gereken en kritik beş adım sırasıyla şöyledir:

  • SSH anahtar tabanlı girişi aktive et, parola girişini kapat
  • Root ile doğrudan SSH girişini engelle
  • ufw veya firewalld ile varsayılan reddet kuralını kur
  • fail2ban kur ve SSH jail'ini aktive et
  • Otomatik güvenlik güncellemelerini aç

Bu beş adım, çoğu otomatik saldırının büyük kısmını daha ilk günden eler. Bütünlük izleme, yedekleme ve log analizi gibi kalan katmanlar ise sunucuyu zaman içinde daha dirençli hâle getirir. Sunucu yönetiminde asıl fark, bu listeyi bir kez uygulamakla değil, düzenli aralıklarla yeniden gözden geçirmekle ortaya çıkar. Bir sunucuyu tek seferde sıkılaştırıp sonra unutmak, hiç sıkılaştırmamaktan az da olsa daha güvenlidir.

Celil Uyanikoglu

Yazan Celil Uyanikoglu

Bilgisayar mühendisiyim; 25 yılı aşkın süredir bilgi işlem sektörünün içindeyim. Bu blogu 2020'de, işimde her gün karşılaştığım sorunların çözümlerini bir yere yazmak için açtım: Linux, güvenlik, tarayıcılar, yapay zeka araçları. Yazdığım her rehberi önce kendi bilgisayarımda ya da sunucumda deniyorum; çalıştığını görmediğim adımı yayınlamam. Hatalı ya da eskimiş bir şey görürsen iletişim sayfasından yaz — düzeltirim.

Yorum

Henüz yorum yok.

Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.

Yorum yap

E-posta adresin yayınlanmaz. Yorumlar moderasyondan sonra yayınlanır.

Sırada

İlgili notlar

jekcms 61602b0e6293b42004a1