Linux sunucu güvenliği konusunda 15+ yıllık deneyimim boyunca öğrendiğim en önemli şey şu:
Varsayılan konfigürasyonlar hiçbir zaman yeterli değildir. Her yeni Linux sunucu kurduğumda, sistemi üretime almadan önce mutlaka uyguladığım 7 temel CIS (Center for Internet Security) güvenlik pratiği var. Bu yazıda, bu uygulamaları neden kritik bulduğumu ve nasıl hayata geçirdiğimi anlatacağım.
CIS Benchmarks Nedir ve Neden Önemlidir?
CIS Benchmarks, dünyanın dört bir yanından siber güvenlik uzmanlarının consensus esaslı katkılarıyla geliştirilmiş, kapsamlı güvenlik konfigürasyon rehberleridir. CIS standardlarının bilinen güvenlik açıklarının %80-95'ini eliminate ettiği kanıtlanmıştır.
CIS Benchmarks'in Temel Prensipleri: - Consensus-driven: Uzmanların ortaklaşa görüşüyle geliştirilir
- Vendor-neutral: Belirli bir üreticiye bağlı değildir
- Level 1 ve Level 2: Temel ve ileri seviye güvenlik konfigürasyonları
- Scored ve Not Scored: Zorunlu ve opsiyonel kontroller
1. SSH Sertleştirme: İlk Savunma Hattı
SSH, Linux sunuculara erişimin temel yöntemi olduğu için sertleştirme sürecimin en kritik parçasıdır.
Temel SSH Yapılandırması
# SSH konfigürasyon dosyasını düzenle sudo nano /etc/ssh/sshd_config # Kritik ayarlar: Protocol 2 # Sadece SSH v2 kullan PermitRootLogin no # Root kullanıcısının SSH erişimini engelle PasswordAuthentication no # Parola tabanlı girişi devre dışı bırak PubkeyAuthentication yes # Public key authentication aktif et Port 2222 # Varsayılan port değiştir MaxAuthTries 3 # Maksimum deneme sayısını sınırla MaxSessions 4 # Eşzamanlı oturum sayısını sınırla LoginGraceTime 30 # Giriş süresi sınırı AllowUsers your_username # Sadece belirli kullanıcılara izin ver ClientAliveInterval 300 # İnaktif bağlantıları sonlandır ClientAliveCountMax 2 # Maksimum hayatta kalma kontrolü HostBasedAuthentication no # Host tabanlı kimlik doğrulamayı devre dışı bırak IgnoreRhosts yes # .rhosts dosyalarını yoksay
Güçlü SSH Key Oluşturma
# RSA 4096 bit key oluştur ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # ED25519 (önerilen - daha güvenli ve hızlı) ssh-keygen -t ed25519 -C "your_email@example.com" # SSH directory güvenliğini sağla chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub
SSH Monitoring ve Fail2Ban
# Fail2Ban kurulumu sudo apt install fail2ban -y # SSH için jail konfigürasyonu sudo nano /etc/fail2ban/jail.local enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600 sudo systemctl enable fail2ban sudo systemctl start fail2ban
2. Firewall Konfigürasyonu: Ağ Trafiği Kontrolü
CIS Controls, host-based firewall ile varsayılan-reddet kuralının uygulanmasını önermektedir.
UFW (Uncomplicated Firewall) Kurulumu
# UFW'yi aktif et sudo ufw enable # Varsayılan politikaları ayarla sudo ufw default deny incoming sudo ufw default allow outgoing # Gerekli portları aç sudo ufw allow 2222/tcp # SSH (özel port) sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS # Belirli IP'den SSH erişimi (opsiyonel) sudo ufw allow from 192.168.1.100 to any port 2222 # Rate limiting ile SSH brute force koruması sudo ufw limit 2222/tcp # UFW durumunu kontrol et sudo ufw status verbose
İleri Seviye iptables Kuralları
# Temel iptables konfigürasyonu #!/bin/bash # Mevcut kuralları temizle iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X # Varsayılan politikalar iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # Loopback trafiğine izin ver iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Established ve related bağlantılara izin ver iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH erişimi (rate limiting ile) iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # Web servisleri iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # ICMP (ping) sınırlı izin iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Kuralları kaydet iptables-save > /etc/iptables/rules.v4
3. Kullanıcı Hesap Yönetimi: Least Privilege Prensibi
Güçlü Parola Politikası
# PAM konfigürasyonu ile parola karmaşıklığı sudo nano /etc/pam.d/common-password # Şu satırı ekle: password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 # Parola geçmişi kontrolü sudo nano /etc/pam.d/common-password # Şu satırı ekle: password required pam_pwhistory.so remember=5 # Hesap kilitleme politikası sudo nano /etc/pam.d/common-auth # Şu satırı ekle: auth required pam_tally2.so deny=3 unlock_time=600 onerr=fail audit even_deny_root
Sudo Konfigürasyonu
# Sudo konfigürasyonunu düzenle sudo visudo # Kullanıcı için sudo izinleri your_username ALL=(ALL:ALL) ALL # Parola timeout ayarı Defaults passwd_timeout=5 # Sudo session timeout Defaults timestamp_timeout=15 # Sudo kullanımını logla Defaults logfile="/var/log/sudo.log" Defaults log_input,log_output
Gereksiz Kullanıcı Hesaplarını Temizleme
# Sistem kullanıcılarını kontrol et cat /etc/passwd | grep -v "/usr/sbin/nologin\|/bin/false" | cut -d: -f1 # Gereksiz hesapları devre dışı bırak sudo usermod -L username # Hesabı kilitle sudo usermod -s /bin/false username # Shell erişimini engelle # Son giriş tarihlerini kontrol et sudo lastlog | grep -v "Never" # Pasif hesapları tespit et sudo last | head -20
4. Sistem Güncellemeleri ve Yamaları
Otomatik Güvenlik Güncellemeleri
# Unattended upgrades kurulumu sudo apt install unattended-upgrades apt-listchanges -y # Konfigürasyon sudo dpkg-reconfigure -plow unattended-upgrades # Manuel konfigürasyon sudo nano /etc/apt/apt.conf.d/50unattended-upgrades # İçerik: Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; "${distro_id}ESMApps:${distro_codename}-apps-security"; "${distro_id}ESM:${distro_codename}-infra-security"; }; Unattended-Upgrade::AutoFixInterruptedDpkg "true"; Unattended-Upgrade::MinimalSteps "true"; Unattended-Upgrade::Remove-Unused-Dependencies "true"; Unattended-Upgrade::Automatic-Reboot "false"; # E-posta bildirimlerini aktif et Unattended-Upgrade::Mail "admin@yourdomain.com";
Manuel Güncelleme Rutini
#!/bin/bash # update_system.sh echo "Sistem güncelleme başlıyor..." # Paket listesini güncelle apt update # Güncellenebilir paketleri listele apt list --upgradable # Güvenlik güncellemelerini uygula apt upgrade -y # Sistem temizleme apt autoremove -y apt autoclean # Kernel güncellemesi kontrolü if ; then echo "Sistem yeniden başlatma gerekiyor!" echo "Yeniden başlatma için: sudo reboot" fi echo "Güncelleme tamamlandı: $(date)"
5. Logging ve Monitoring: Güvenlik Olaylarını Yakalama
Rsyslog Konfigürasyonu
# Rsyslog konfigürasyonu sudo nano /etc/rsyslog.conf # Uzak log gönderimi için (opsiyonel) *.* @@logserver.yourdomain.com:514 # Lokal log rotasyonu sudo nano /etc/logrotate.d/rsyslog /var/log/syslog { daily missingok rotate 52 compress delaycompress notifempty create 0640 syslog adm postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
Auditd Kurulumu ve Konfigürasyonu
# Auditd kurulumu sudo apt install auditd audispd-plugins -y # Auditd kuralları sudo nano /etc/audit/rules.d/audit.rules # Kritik dosya değişikliklerini izle -w /etc/passwd -p wa -k passwd_changes -w /etc/shadow -p wa -k shadow_changes -w /etc/group -p wa -k group_changes -w /etc/sudoers -p wa -k sudoers_changes -w /etc/ssh/sshd_config -p wa -k ssh_config_changes # Sistem çağrılarını izle -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change -a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time_change # Network konfigürasyon değişikliklerini izle -w /etc/issue -p wa -k system_locale -w /etc/issue.net -p wa -k system_locale -w /etc/hosts -p wa -k system_locale -w /etc/network/ -p wa -k system_locale # Auditd'yi yeniden başlat sudo systemctl restart auditd sudo systemctl enable auditd
Log Analizi Araçları
# Logwatch kurulumu sudo apt install logwatch -y # Günlük rapor konfigürasyonu sudo nano /etc/logwatch/conf/logwatch.conf Detail = High MailTo = admin@yourdomain.com MailFrom = logwatch@yourdomain.com Format = html Range = today # Manuel logwatch raporu sudo logwatch --detail high --mailto admin@yourdomain.com --format html --range today
6. Servis Sertleştirme: Saldırı Yüzeyini Minimize Etme
Gereksiz Servislerin Tespiti ve Devre Dışı Bırakılması
# Çalışan servisleri listele systemctl list-units --type=service --state=running # Açık portları kontrol et sudo netstat -tulpn sudo ss -tulpn # Gereksiz servisleri devre dışı bırak sudo systemctl disable telnet sudo systemctl disable ftp sudo systemctl disable rsh sudo systemctl disable rlogin sudo systemctl disable tftp sudo systemctl disable xinetd sudo systemctl disable sendmail # Eğer mail server değilse # Servis durumlarını kontrol et sudo systemctl is-enabled service_name sudo systemctl is-active service_name
Web Server Sertleştirme (Apache/Nginx)
Apache Sertleştirme
# Apache güvenlik modülü sudo a2enmod security2 sudo a2enmod headers sudo a2enmod ssl # Güvenlik konfigürasyonu sudo nano /etc/apache2/conf-available/security.conf # İçerik: ServerTokens Prod ServerSignature Off TraceEnable Off # Güvenlik başlıkları Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set Content-Security-Policy "default-src 'self'" # Konfigürasyonu aktif et sudo a2enconf security sudo systemctl restart apache2
Nginx Sertleştirme
# Nginx güvenlik konfigürasyonu sudo nano /etc/nginx/nginx.conf # İçerik: server_tokens off; # SSL konfigürasyonu ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # Rate limiting limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m; # Güvenlik başlıkları add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
7. Dosya Sistemi Güvenliği ve İzinler
Kritik Dosya İzinlerinin Ayarlanması
# Sistem dosya izinlerini kontrol et ve düzelt sudo chmod 644 /etc/passwd sudo chmod 600 /etc/shadow sudo chmod 644 /etc/group sudo chmod 600 /etc/gshadow sudo chmod 600 /etc/ssh/sshd_config sudo chmod 755 /etc/ssh # World-writable dosyaları bul ve düzelt find / -type f -perm -002 -exec ls -la {} \; 2>/dev/null find / -type d -perm -002 -exec ls -ld {} \; 2>/dev/null # SUID/SGID dosyalarını kontrol et find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null # Sahibi olmayan dosyaları bul find / -nouser -o -nogroup 2>/dev/null
Disk Şifreleme ve Mount Güvenliği
# Fstab güvenlik ayarları sudo nano /etc/fstab # Örnek güvenli mount opsisonları: /dev/sda1 /tmp ext4 defaults,nodev,nosuid,noexec 0 2 tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0 # Dosya sistemi bütünlük kontrolü (AIDE) sudo apt install aide -y # AIDE veritabanını başlat sudo aide --init sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Günlük bütünlük kontrolü için cron job echo "0 5 * * * root /usr/bin/aide --check | mail -s 'AIDE Integrity Check' admin@yourdomain.com" >> /etc/crontab
Otomatik CIS Compliance Kontrolleri
CIS-CAT Lite ile Automated Assessment
#!/bin/bash # cis_assessment.sh # CIS-CAT Lite indir (ücretsiz versiyon) wget https://learn.cisecurity.org/cis-cat-lite # Unzip ve çalıştır unzip cis-cat-lite.zip cd CIS-CAT-Lite/ # Ubuntu 20.04 için assessment çalıştır ./CIS-CAT.sh -i -a -x -r /opt/cis-reports/ # Raporu analiz et echo "CIS Assessment tamamlandı. Rapor: /opt/cis-reports/"
Lynis ile Security Auditing
# Lynis kurulumu sudo apt install lynis -y # Tam güvenlik denetimi sudo lynis audit system # Raporu incele sudo lynis show report # Öneriler için: sudo lynis show suggestions
Sürekli İyileştirme ve Monitoring
Haftalık Güvenlik Kontrolü Scripti
#!/bin/bash # weekly_security_check.sh echo "=== Haftalık Güvenlik Kontrolü ===" echo "Tarih: $(date)" # 1. Sistem güncellemelerini kontrol et echo "--- Mevcut Güncellemeler ---" apt list --upgradable # 2. Son giriş yapan kullanıcıları kontrol et echo "--- Son Kullanıcı Girişleri ---" last | head -10 # 3. Başarısız SSH girişlerini kontrol et echo "--- Başarısız SSH Girişleri ---" grep "Failed password" /var/log/auth.log | tail -10 # 4. Açık portları kontrol et echo "--- Açık Portlar ---" ss -tulpn # 5. Disk kullanımını kontrol et echo "--- Disk Kullanımı ---" df -h # 6. Yüksek CPU/Memory kullanımını kontrol et echo "--- Sistem Kaynakları ---" top -bn1 | head -20 # 7. Fail2Ban durumunu kontrol et echo "--- Fail2Ban Durumu ---" fail2ban-client status echo "=== Kontrol Tamamlandı ==="
Sonuç ve Tavsiyeler
Bu 7 CIS güvenlik pratiği, Linux sunucularınızın güvenlik seviyesini önemli ölçüde artıracaktır.
Ancak güvenlik bir hedef değil, sürekli bir süreçtir.
Hatırlanması Gerekenler:
- Test Ortamında Deneyin: Üretim sunucularında değişiklik yapmadan önce mutlaka test edin
- Dokümante Edin: Her değişikliği kayıt altına alın
- Düzenli Kontrol: Güvenlik ayarlarını düzenli olarak gözden geçirin
- Güncel Kalın: CIS Benchmarks düzenli güncellenir, takip edin
- Yedekleme: Kritik değişiklikler öncesi sistem yedeği alın
Sonraki Adımlar:
- IDS/IPS sistemi kurulumu
- WAF (Web Application Firewall) implementasyonu
- Vulnerability scanning otomasyonu
- SIEM entegrasyonu
- Incident response planı geliştirme
Linux güvenliği karmaşık görünse de, bu temel CIS pratiklerini sistematik olarak uygulayarak sunucularınızı siber tehditlere karşı önemli ölçüde koruyabilirsiniz. Güvenlik katmanları prensibi gereği, hiçbir tek önlem %100 koruma sağlamaz, ancak bu 7 uygulamanın kombinasyonu saldırganlar için yeterince yüksek bir engel oluşturacaktır. Her sunucu kurulumunda bu listeyi kontrol ederek, güvenli bir temel üzerine inşa etmeye devam edin. Unutmayın:
En iyi savunma, proaktif önlemlerdir.