Ana içeriğe geç
Kategoriye Dön

Sunucu Güvenliği İçin 10 Temel Adım

Linux sunucu güvenliğini sağlamak için 10 temel adım: SSH anahtar doğrulama, güvenlik duvarı, Fail2ban, otomatik güncellemeler, DDoS koruması ve daha fazlası. Komutlarla açıklamalı rehber.

Okuma süresi: 12 dk Güvenlik
sunucu güvenliğilinux güvenliksshfirewallfail2banddos koruması

İçindekiler

Sunucu Güvenliği İçin 10 Temel Adım

Yeni bir Linux sunucu kurduğunuzda, varsayılan yapılandırma güvenlik açısından optimize edilmemiştir. İnternete açık her sunucu, dakikalar içinde otomatik tarama araçlarının hedefi haline gelir. Bu rehber, sunucunuzu güvence altına almak için uygulamanız gereken 10 temel adımı komutlarla birlikte açıklar.

Bu adımları uygulamadan önce sunucunuza erişiminizi kaybetmemek için dikkatli olun. Özellikle SSH yapılandırmasını değiştirirken mevcut oturumunuzu açık tutun ve yeni bir terminal penceresiyle test edin.

Adım 1: SSH Anahtar Doğrulama ve Parola Girişini Devre Dışı Bırakma

Parola tabanlı SSH girişi, brute-force saldırılarına karşı savunmasızdır. SSH anahtar çifti kullanmak çok daha güvenlidir.

SSH Anahtar Çifti Oluşturma (Yerel Makinede)

hljs bash
# RSA 4096-bit anahtar oluştur
ssh-keygen -t ed25519 -C "sunucu-adi@rexe"

# Veya RSA kullanmak istiyorsanız
ssh-keygen -t rsa -b 4096 -C "sunucu-adi@rexe"

Public Key'i Sunucuya Kopyalama

hljs bash
# Yerel makineden çalıştırın
ssh-copy-id -i ~/.ssh/id_ed25519.pub kullanici@sunucu-ip

# Manuel yöntem
cat ~/.ssh/id_ed25519.pub | ssh kullanici@sunucu-ip \
  "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Parola Girişini Devre Dışı Bırakma

hljs bash
# /etc/ssh/sshd_config dosyasını düzenleyin
sudo nano /etc/ssh/sshd_config

# Şu satırları değiştirin:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
X11Forwarding no

# SSH servisini yeniden başlatın
sudo systemctl restart sshd

SSH portunu varsayılan 22'den farklı bir porta (örn. 2222) değiştirmek, otomatik tarama araçlarının büyük çoğunluğunu engeller. Port 2222 satırını sshd_config'e ekleyin.

Adım 2: Güvenlik Duvarı Yapılandırması (UFW)

UFW (Uncomplicated Firewall), iptables'ın kullanımı kolay bir arayüzüdür.

hljs bash
# UFW'yi kur
sudo apt install ufw -y

# Varsayılan politikaları ayarla
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH'ye izin ver (portunu değiştirdiyseniz güncelleyin)
sudo ufw allow 22/tcp
# sudo ufw allow 2222/tcp  # Özel port kullanıyorsanız

# Web sunucusu portları
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# UFW'yi etkinleştir
sudo ufw enable

# Durumu kontrol et
sudo ufw status verbose

iptables ile Gelişmiş Kural Örneği

hljs bash
# Belirli bir IP'den gelen bağlantılara izin ver
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT

# SYN flood koruması
sudo iptables -A INPUT -p tcp --syn -m limit \
  --limit 1/s --limit-burst 3 -j ACCEPT

# Kuralları kaydet
sudo iptables-save > /etc/iptables/rules.v4

Adım 3: Fail2ban Kurulumu ve Yapılandırması

Fail2ban, başarısız giriş denemelerini izler ve belirli bir eşiği aşan IP adreslerini otomatik olarak engeller.

hljs bash
# Fail2ban'ı kur
sudo apt install fail2ban -y

# Yapılandırma dosyası oluştur
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
hljs ini
# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 3600        # 1 saat ban
findtime = 600         # 10 dakika içinde
maxretry = 5           # 5 başarısız deneme
ignoreip = 127.0.0.1/8 ::1  # Yerel IP'leri yoksay

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
maxretry = 3
bantime  = 86400       # 24 saat ban

[nginx-http-auth]
enabled = true

[nginx-limit-req]
enabled = true
hljs bash
# Fail2ban'ı başlat
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Durumu kontrol et
sudo fail2ban-client status
sudo fail2ban-client status sshd

# Engellenen IP'leri listele
sudo fail2ban-client status sshd | grep "Banned IP"

Adım 4: Otomatik Güvenlik Güncellemeleri

Güncel olmayan yazılımlar, en yaygın güvenlik açığı kaynaklarından biridir.

hljs bash
# unattended-upgrades kur
sudo apt install unattended-upgrades apt-listchanges -y

# Yapılandır
sudo dpkg-reconfigure -plow unattended-upgrades

# Yapılandırma dosyasını düzenle
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
// Güvenlik güncellemelerini otomatik uygula
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
};

// Otomatik yeniden başlatma (gerekirse)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

// E-posta bildirimi
Unattended-Upgrade::Mail "admin@example.com";

Adım 5: Kullanılmayan Servisleri Devre Dışı Bırakma

Her çalışan servis potansiyel bir saldırı yüzeyidir.

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

# Açık portları kontrol et
sudo ss -tlnp
sudo netstat -tlnp

# Gereksiz servisleri durdur ve devre dışı bırak
sudo systemctl stop bluetooth
sudo systemctl disable bluetooth

sudo systemctl stop cups
sudo systemctl disable cups

# Gereksiz paketleri kaldır
sudo apt remove --purge telnet rsh-client rsh-redone-client

Adım 6: Güçlü Parolalar ve İki Faktörlü Kimlik Doğrulama

hljs bash
# Parola politikasını güçlendir
sudo apt install libpam-pwquality -y
sudo nano /etc/security/pwquality.conf
# Minimum 12 karakter
minlen = 12
# En az 1 büyük harf
ucredit = -1
# En az 1 küçük harf
lcredit = -1
# En az 1 rakam
dcredit = -1
# En az 1 özel karakter
ocredit = -1

Google Authenticator ile 2FA

hljs bash
# Google Authenticator PAM modülünü kur
sudo apt install libpam-google-authenticator -y

# Kullanıcı için yapılandır
google-authenticator

# PAM yapılandırmasını güncelle
sudo nano /etc/pam.d/sshd
# Şu satırı ekle:
# auth required pam_google_authenticator.so

# sshd_config'de ChallengeResponseAuthentication'ı etkinleştir
sudo nano /etc/ssh/sshd_config
# ChallengeResponseAuthentication yes
# AuthenticationMethods publickey,keyboard-interactive

sudo systemctl restart sshd

Adım 7: Düzenli Yedekleme

hljs bash
# rsync ile yerel yedekleme
rsync -avz --delete /var/www/ /backup/www/

# Uzak sunucuya yedekleme
rsync -avz -e ssh /var/www/ kullanici@yedek-sunucu:/backup/www/

# Otomatik yedekleme için cron job
crontab -e
# Her gece 02:00'de yedekle
0 2 * * * rsync -avz /var/www/ /backup/www/ >> /var/log/backup.log 2>&1

# Veritabanı yedekleme
mysqldump -u root -p --all-databases | gzip > /backup/db_$(date +%Y%m%d).sql.gz

3-2-1 yedekleme kuralını uygulayın: 3 kopya, 2 farklı medya, 1 farklı lokasyon.

Adım 8: Log İzleme

hljs bash
# Önemli log dosyaları
tail -f /var/log/auth.log          # Kimlik doğrulama logları
tail -f /var/log/syslog            # Sistem logları
tail -f /var/log/nginx/access.log  # Nginx erişim logları
tail -f /var/log/nginx/error.log   # Nginx hata logları

# Başarısız SSH girişlerini izle
grep "Failed password" /var/log/auth.log | tail -20

# logwatch ile günlük rapor
sudo apt install logwatch -y
sudo logwatch --output mail --mailto admin@example.com --detail high

# Logrotate yapılandırması
sudo nano /etc/logrotate.d/custom
/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
}

Adım 9: DDoS Koruması

hljs bash
# iptables ile temel DDoS koruması

# SYN flood koruması
sudo iptables -A INPUT -p tcp --syn -m limit \
  --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

# ICMP flood koruması
sudo iptables -A INPUT -p icmp -m limit \
  --limit 1/s --limit-burst 5 -j ACCEPT
sudo iptables -A INPUT -p icmp -j DROP

# Bağlantı sayısı sınırı (IP başına)
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit \
  --connlimit-above 50 -j REJECT

# Nginx rate limiting
# /etc/nginx/nginx.conf
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

# Location bloğunda:
limit_req zone=api burst=20 nodelay;

Yazılım tabanlı DDoS koruması, büyük ölçekli saldırılara karşı yetersiz kalabilir. REXE'nin Path.net altyapısı, ağ seviyesinde DDoS filtrelemesi sağlayarak sunucunuza ulaşmadan önce saldırı trafiğini temizler.

Adım 10: SSL/TLS Yapılandırması

hljs bash
# Let's Encrypt ile ücretsiz SSL sertifikası
sudo apt install certbot python3-certbot-nginx -y

# Sertifika al
sudo certbot --nginx -d example.com -d www.example.com

# Otomatik yenileme
sudo certbot renew --dry-run

# Cron ile otomatik yenileme
0 12 * * * /usr/bin/certbot renew --quiet

Nginx SSL Yapılandırması

hljs nginx
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Güvenli SSL ayarları
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000" always;

    # Güvenlik başlıkları
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "strict-origin-when-cross-origin";
}

# HTTP'yi HTTPS'e yönlendir
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

Güvenlik Kontrol Listesi

  • SSH anahtar doğrulama aktif, parola girişi kapalı
  • Root SSH girişi devre dışı
  • Güvenlik duvarı (UFW/iptables) yapılandırıldı
  • Fail2ban kurulu ve çalışıyor
  • Otomatik güvenlik güncellemeleri aktif
  • Kullanılmayan servisler kapatıldı
  • Güçlü parola politikası uygulandı
  • 2FA etkinleştirildi
  • Düzenli yedekleme planı oluşturuldu
  • Log izleme yapılandırıldı
  • DDoS koruması aktif
  • SSL/TLS sertifikası kuruldu ve HTTPS zorunlu
  • Güvenlik başlıkları yapılandırıldı