Yeni bir Linux sunucuda ilk 30 dakika: güvenlik kontrol listesi

Semih5 dk okuma

Yeni açılan bir Ubuntu veya Debian sunucuda ilk yarım saatte yapılacaklar. SSH anahtarı, güvenlik duvarı, fail2ban, otomatik güncelleme, swap ve yedek.

VPS’i aldın, root şifresi e-postana geldi, heyecanlısın. Kötü haber: sunucun internete çıktığı andan itibaren dünyanın dört bir yanındaki botlar SSH kapısını yoklamaya başlıyor. İnanmıyorsan birkaç saat sonra journalctl -u ssh çıktısına bak; root kullanıcısıyla giriş denemeleri tek tek değil, sayfa sayfa akıyor.

İyi haber: bu botların neredeyse hepsi kolay lokma arıyor. İlk yarım saatte birkaç kapıyı kapatırsan listelerinden düşersin. Bu yazıdaki komutlar Ubuntu ve Debian için; başka bir dağıtım kullanıyorsan mantık aynı, paket yöneticisi farklı.

Kısa cevap: sistemi güncelle, kendi kullanıcını aç, SSH’a yalnızca anahtarla gir, root ve şifreli girişi kapat, güvenlik duvarında yalnızca gereken portları aç, otomatik güvenlik güncellemelerini aç ve ilk yedeği al. Gerisi ayrıntı.

1. Önce güncelle

Kalıp imajlar genellikle haftalar hatta aylar öncesinden kalmadır. İlk iş:

apt update && apt full-upgrade -y

Çekirdek güncellendiyse /var/run/reboot-required dosyası oluşur. Varsa sunucuyu şimdi yeniden başlat; içinde henüz hiçbir şey çalışmıyorken yeniden başlatmanın bedeli sıfır.

2. Root ile yaşama, kendi kullanıcını aç

Root her şeyi yapabilir, yanlışlıkla yapılanlar dahil. Günlük iş için sudo yetkili bir kullanıcı aç:

adduser semih
usermod -aG sudo semih

3. SSH anahtarı: şifreden vazgeç

Kendi bilgisayarında bir anahtar çifti üret ve genel anahtarı sunucuya kopyala:

ssh-keygen -t ed25519 -C "laptop"
ssh-copy-id semih@SUNUCU_IP

Şimdi en önemli kural: açık olan oturumu kapatmadan, yeni bir terminalde ssh semih@SUNUCU_IP ile girmeyi dene. Anahtarla girebildiğini ve sudo çalıştığını görmeden bir sonraki adıma geçme. Kendini sunucunun dışında kilitlemek, bu listenin en klasik kazasıdır.

4. SSH güvenliğini artır

Ana ayar dosyasını düzenlemek yerine ayrı bir dosya açmak daha temiz. Burada küçük ama sinsi bir tuzak var: OpenSSH aynı ayarı birden fazla yerde görürse ilk okuduğu değeri kullanır ve sshd_config.d klasöründeki dosyaları alfabetik sırayla okur. Bazı bulut imajları 50-cloud-init.conf içinde şifreli girişi açık bırakır. Dosyanın adını 00- ile başlatırsan senin ayarın önce okunur:

# /etc/ssh/sshd_config.d/00-guvenlik.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no

Ayarı uygulamadan önce sözdizimini kontrol et, sonra servisi yeniden başlat ve gerçekte ne uygulandığına bak:

sudo sshd -t && sudo systemctl restart ssh
sudo sshd -T | grep -E "permitrootlogin|passwordauthentication"

SSH portunu 22’den başka bir sayıya taşımak loglardaki kalabalık görüntüyü azaltır ama güvenlik önlemi sayılmaz. Asıl koruma, şifreyle girişin kapalı olması.

5. Güvenlik duvarı: yalnızca gerekeni aç

Ubuntu’da ufw hazır gelir, Debian’da apt install ufw ile kurulur. Sıralama önemli, SSH iznini güvenlik duvarını açmadan önce ver:

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

Docker kullanıyorsan bir uyarı: Docker’ın dışarı açtığı portlar ufw kurallarını atlayabilir. -p 3306:3306 yazdığın bir veritabanı konteyneri, ufw’da kapalı görünse bile internete açık olabilir. Yalnızca sunucu içinden erişilecek servisleri -p 127.0.0.1:3306:3306 biçiminde bağla.

6. fail2ban: kapıyı zorlayanları beklet

Şifreli girişi kapattıysan botlar zaten içeri giremez; fail2ban burada daha çok loglardaki kalabalığı ve boşa harcanan kaynağı azaltır. Yine de kurması bir dakika:

sudo apt install fail2ban
# /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 5
bantime = 1h

Debian 12 gibi auth.log dosyası tutmayan sistemlerde aynı bölüme backend = systemd satırını ekle. Durumu sudo fail2ban-client status sshd ile görebilirsin.

7. Güvenlik güncellemeleri kendiliğinden gelsin

Her sabah sunucuya girip güncelleme kontrol etmeyeceksin, kimse etmiyor. Bırak işi sistem yapsın:

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Bu yalnızca güvenlik güncellemelerini otomatik kurar. PHP’nin ya da veritabanının büyük sürüm geçişleri hâlâ senin kontrolünde kalır, kalmalı da.

8. Saat dilimi ve saat

Loglardaki saat ile senin saatin tutmuyorsa, gece 03.00’teki bir hatayı ararken yanlış yere bakarsın:

sudo timedatectl set-timezone Europe/Istanbul
timedatectl

Çıktıda System clock synchronized: yes görmelisin. SSL sertifikaları ve iki adımlı doğrulama kodları doğru saate bağlıdır.

9. Küçük sunucuya küçük bir swap

1 veya 2 GB RAM’li bir sunucuda bir composer install ya da büyük bir yedek alma işlemi belleği bitirebilir. Linux bu durumda bir süreci öldürür ve genellikle öldürdüğü şey veritabanıdır. Küçük bir swap dosyası bu ani çöküşü yavaşlamaya çevirir:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Swap, RAM’in yerini tutmaz. Sunucu sürekli swap kullanıyorsa bu bir ayar sorunu değil, büyütme sinyalidir.

10. İlk yedek, ilk gün

Yedek konusunu “site yayına girince hallederim” diye ertelemek en pahalı ertelemedir. Kuralı basit tut: veritabanı dökümü ve yüklenen dosyalar her gün, sunucunun dışında bir yere gitsin. Sağlayıcının anlık görüntü (snapshot) özelliği güzel ama sağlayıcı hesabına bir şey olursa yedek de onunla gider.

Bir de şu cümleyi bir yere yaz: denenmemiş yedek, yedek değil umuttur. Ayda bir kez yedeği boş bir makineye geri yükleyip gerçekten çalıştığını gör.

Kontrol listesi

Adım Komut ya da dosya Neden
Güncelleme apt full-upgrade Bilinen açıkları kapatır
Kullanıcı adduser, usermod -aG sudo Root ile günlük iş yapılmaz
SSH anahtarı ssh-copy-id Şifre tahminini anlamsız kılar
SSH ayarı 00-guvenlik.conf Root ve şifreli girişi kapatır
Güvenlik duvarı ufw Yalnızca 22, 80, 443 açık kalır
fail2ban jail.local Deneme yapanları bekletir
Otomatik güncelleme unattended-upgrades Güvenlik yamaları beklemez
Saat timedatectl Loglar ve sertifikalar doğru saati görür
Swap /swapfile Bellek dolunca ani çöküşü önler
Yedek Sunucu dışında, günlük Kötü günün sigortası

Hepsi bu. Yarım saat sonra elinde, bot listelerinin “uğraşmaya değmez” kısmına düşmüş bir sunucu var. Sunucun bir gün yavaşlarsa nereye bakacağın da ayrı bir yazının konusu.

Sunucu kurulumunu ya da taşımasını birine devretmek istersen teklif formundan yazabilirsin.

Kitapçıkta devamı

  1. 4 dk okuma

    PHP-FPM ayarı: pm.max_children nasıl hesaplanır?

    PHP-FPM'de pm.max_children değerini tahminle değil ölçerek belirlemek. Süreç belleğini ölçme, hesap formülü, pm modları, status sayfası ve slowlog.

  2. 4 dk okuma

    Sunucu yavaşladı: panik yapmadan önce bakılacak 10 Linux komutu

    Site yavaşladığında Linux sunucuda sorunun CPU, bellek, disk, ağ ya da uygulama kaynaklı olduğunu beş dakikada ayırt etmeyi sağlayan 10 komut.

Şans

Aklında bir proje mi var? Kutuyu açalım: ne yapmak istediğini anlat, sana kapsamı ve yol haritasını içeren bir teklif hazırlayayım.

Teklif iste

ya da doğrudan yaz: e-posta adresi