Sunucunu kurdun, sitelerini taşıdın, hızlandırdın. Şimdi hepsini korumaya alma zamanı.
Şunu net söyleyeyim: internete açtığın sunucu, açtığın andan itibaren taranmaya başlar. Bunu abartı sanma; yeni kurduğun bir VPS'in SSH loguna 24 saat sonra bak, binlerce başarısız giriş denemesi göreceksin. Bunlar sana özel saldırılar değil, sürekli dönen otomatik botlar. Kapıyı açık bırakırsan er ya da geç biri girer.
Bu rehberde HestiaCP sunucusunu adım adım sıkılaştıracağız. Örneklerde kullanıcı adı olarak
1. SSH erişimini kilitle
Saldırıların büyük çoğunluğu SSH'a şifre denemesiyle başlar. Şifreyi tamamen devre dışı bırakıp anahtar kullanacağız.
1.1 Önce kendine anahtar oluştur
Kendi bilgisayarında (sunucuda değil) çalıştır:
Anahtarı sunucuya gönder:
Şimdi test et. Yeni bir terminal aç ve şifre sormadan girebildiğini doğrula. Bunu doğrulamadan bir sonraki adıma sakın geçme, yoksa kendini sunucudan kilitlersin.
1.2 Sudo yetkili kullanıcı aç
Root ile doğrudan giriş yapmayı kapatacağız, önce alternatif bir kapı açalım:
Yeni bir terminalden
1.3 SSH ayarlarını sıkılaştır
Şu değerleri ayarla:
Port değiştirmeden önce firewall'da yeni portu aç, yoksa bağlantın kopar:
Mevcut oturumunu kapatma. Yeni bir terminalden
Her şey çalışıyorsa eski SSH kuralını kaldır:
2. Panel portunu değiştir ve koru
Varsayılan 8083 portu botların ilk baktığı yerdir.
Daha da güvenlisi: panele sadece kendi IP'nden erişim ver. Sabit IP'n varsa:
Sonra genel erişim kuralını sil. Artık paneli sadece sen açabilirsin.
Panel hesabına iki adımlı doğrulama ekle: panelde sağ üstten Edit Profile → Two-Factor Authentication bölümünden QR kodu Google Authenticator ile tara. Yedek kodları güvenli bir yere kaydet.
3. Firewall'u sadeleştir
Kapalı port, korunması gerekmeyen porttur. Mevcut kuralları listele:
Kullanmadığın her servisin portunu kapat. Mail kullanmıyorsan 25, 465, 587, 110, 143, 993, 995 portlarını; DNS kullanmıyorsan 53'ü kapat.
Kural silme:
Açık kalması gereken minimum set genelde şudur:
Dışarıdan gerçekten kapalı mı, kontrol et:
4. Fail2Ban'i güçlendir
HestiaCP Fail2Ban ile gelir ama varsayılan yasak süreleri kısadır.
Durumu gör:
Ayarları sertleştir:
Kendi IP'ni
Yanlışlıkla yasaklanan bir IP'yi çıkarmak için:
5. Dosya izinleri ve PHP kısıtlamaları
Hacklenmelerin çoğu SSH'tan değil, sitedeki bir açıktan gelir. Yüklenen bir PHP shell'i sunucuda ne yapabileceğini sınırlamalıyız.
5.1 Tehlikeli PHP fonksiyonlarını kapat
Uyarı: Bazı yazılımlar (özellikle yedekleme eklentileri ve görsel işleme kütüphaneleri)
5.2 Doğru dosya izinleri
Hiçbir zaman 777 kullanma. Bir klasör yazılamıyor diye 777 vermek, o klasörü sunucudaki herkese açmak demektir. Sorun neredeyse her zaman sahiplik ayarındadır, izinde değil.
5.3 Yükleme klasörlerinde PHP çalıştırmayı engelle
Saldırganın en sevdiği yöntem, resim yükleme alanına PHP dosyası yüklemektir. Domainin ek Nginx conf dosyasına ekle:
6. Güncellemeleri otomatikleştir
En yaygın hack sebebi sıfır gün açığı değil, aylardır güncellenmeyen yazılımdır.
Güvenlik güncellemelerini otomatikleştir:
HestiaCP'yi güncelle:
Panelde Server → Updates bölümünden otomatik güncellemeyi açabilirsin.
Site yazılımlarını (WordPress, XenForo, eklentiler) düzenli güncelle. Takvimine ayda bir hatırlatma koy.
7. Şüpheli aktivite tespiti
Son 24 saatte değişen dosyaları bul; hacklenme şüphesinde ilk bakacağın yer burasıdır:
Şüpheli kod kalıplarını ara:
Başarısız panel girişlerini gör:
Aktif oturumları kontrol et:
Beklemediğin bir IP'den giriş görüyorsan hemen tüm şifreleri değiştir ve son yedeğe dön.
Rootkit taraması
8. Hacklendiysen ne yapmalısın?
Panik yapıp dosyaları silmek en kötü yaklaşımdır. Sırayla:
Güvenlik kontrol listesi
Bu listedeki her madde bir saldırı yolunu kapatıyor. Hepsini bir günde yapmak zorunda değilsin ama hepsini yap.
Takıldığınız yer olursa sorun, birlikte bakalım. Serinin devamında HestiaCP'de mail sunucusu kurulumu ve maillerin spam'e düşmemesi konusunu işleyeceğim.
Şunu net söyleyeyim: internete açtığın sunucu, açtığın andan itibaren taranmaya başlar. Bunu abartı sanma; yeni kurduğun bir VPS'in SSH loguna 24 saat sonra bak, binlerce başarısız giriş denemesi göreceksin. Bunlar sana özel saldırılar değil, sürekli dönen otomatik botlar. Kapıyı açık bırakırsan er ya da geç biri girer.
Bu rehberde HestiaCP sunucusunu adım adım sıkılaştıracağız. Örneklerde kullanıcı adı olarak
oblifex kullanıyorum.1. SSH erişimini kilitle
Saldırıların büyük çoğunluğu SSH'a şifre denemesiyle başlar. Şifreyi tamamen devre dışı bırakıp anahtar kullanacağız.
1.1 Önce kendine anahtar oluştur
Kendi bilgisayarında (sunucuda değil) çalıştır:
Kod:
ssh-keygen -t ed25519 -C "oblifex-yonetim"
Anahtarı sunucuya gönder:
Kod:
ssh-copy-id root@SUNUCU_IP
Şimdi test et. Yeni bir terminal aç ve şifre sormadan girebildiğini doğrula. Bunu doğrulamadan bir sonraki adıma sakın geçme, yoksa kendini sunucudan kilitlersin.
1.2 Sudo yetkili kullanıcı aç
Root ile doğrudan giriş yapmayı kapatacağız, önce alternatif bir kapı açalım:
Kod:
adduser yonetici
usermod -aG sudo yonetici
mkdir -p /home/yonetici/.ssh
cp /root/.ssh/authorized_keys /home/yonetici/.ssh/
chown -R yonetici:yonetici /home/yonetici/.ssh
chmod 700 /home/yonetici/.ssh
chmod 600 /home/yonetici/.ssh/authorized_keys
Yeni bir terminalden
ssh yonetici@SUNUCU_IP ile giriş yapabildiğini ve sudo -i çalıştığını doğrula.1.3 SSH ayarlarını sıkılaştır
Kod:
nano /etc/ssh/sshd_config
Şu değerleri ayarla:
Kod:
Port 2244
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
X11Forwarding no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers yonetici
Port değiştirmeden önce firewall'da yeni portu aç, yoksa bağlantın kopar:
Kod:
v-add-firewall-rule ACCEPT 0.0.0.0/0 2244 TCP SSH-YENI
systemctl restart sshd
Mevcut oturumunu kapatma. Yeni bir terminalden
ssh -p 2244 yonetici@SUNUCU_IP ile bağlanabildiğini doğrula, ancak ondan sonra eskisini kapat.Her şey çalışıyorsa eski SSH kuralını kaldır:
Kod:
v-list-firewall
v-delete-firewall-rule KURAL_NUMARASI
2. Panel portunu değiştir ve koru
Varsayılan 8083 portu botların ilk baktığı yerdir.
Kod:
v-change-sys-port 2083
v-add-firewall-rule ACCEPT 0.0.0.0/0 2083 TCP HESTIA
Daha da güvenlisi: panele sadece kendi IP'nden erişim ver. Sabit IP'n varsa:
Kod:
v-add-firewall-rule ACCEPT SENIN_IP 2083 TCP HESTIA-OZEL
Sonra genel erişim kuralını sil. Artık paneli sadece sen açabilirsin.
Panel hesabına iki adımlı doğrulama ekle: panelde sağ üstten Edit Profile → Two-Factor Authentication bölümünden QR kodu Google Authenticator ile tara. Yedek kodları güvenli bir yere kaydet.
3. Firewall'u sadeleştir
Kapalı port, korunması gerekmeyen porttur. Mevcut kuralları listele:
Kod:
v-list-firewall
Kullanmadığın her servisin portunu kapat. Mail kullanmıyorsan 25, 465, 587, 110, 143, 993, 995 portlarını; DNS kullanmıyorsan 53'ü kapat.
Kural silme:
Kod:
v-delete-firewall-rule KURAL_NO
Açık kalması gereken minimum set genelde şudur:
| Port | Servis | Kime açık |
|---|---|---|
| 80, 443 | Web | Herkese |
| 2244 | SSH | Mümkünse sadece kendi IP'ne |
| 2083 | Panel | Mümkünse sadece kendi IP'ne |
Dışarıdan gerçekten kapalı mı, kontrol et:
Kod:
apt install -y nmap
nmap -Pn SUNUCU_IP
4. Fail2Ban'i güçlendir
HestiaCP Fail2Ban ile gelir ama varsayılan yasak süreleri kısadır.
Durumu gör:
Kod:
fail2ban-client status
fail2ban-client status hestia
fail2ban-client status sshd
Ayarları sertleştir:
Kod:
nano /etc/fail2ban/jail.local
[DEFAULT] Bölümüne:
Kod:
bantime = 86400
findtime = 600
maxretry = 3
ignoreip = 127.0.0.1/8 SENIN_SABIT_IP
Kendi IP'ni
ignoreip listesine eklemeyi unutma, yoksa bir gün kendini yasaklarsın.
Kod:
systemctl restart fail2ban
Yanlışlıkla yasaklanan bir IP'yi çıkarmak için:
Kod:
fail2ban-client set sshd unbanip 1.2.3.4
5. Dosya izinleri ve PHP kısıtlamaları
Hacklenmelerin çoğu SSH'tan değil, sitedeki bir açıktan gelir. Yüklenen bir PHP shell'i sunucuda ne yapabileceğini sınırlamalıyız.
5.1 Tehlikeli PHP fonksiyonlarını kapat
Kod:
nano /etc/php/8.3/fpm/php.ini
Kod:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
expose_php = Off
allow_url_include = Off
allow_url_fopen = Off
Uyarı: Bazı yazılımlar (özellikle yedekleme eklentileri ve görsel işleme kütüphaneleri)
exec kullanır. Kapattıktan sonra sitelerini test et, bozulan varsa o fonksiyonu listeden çıkar.
Kod:
systemctl restart php8.3-fpm
5.2 Doğru dosya izinleri
Kod:
cd /home/oblifex/web/oblifex.com/public_html
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chown -R oblifex:oblifex .
Hiçbir zaman 777 kullanma. Bir klasör yazılamıyor diye 777 vermek, o klasörü sunucudaki herkese açmak demektir. Sorun neredeyse her zaman sahiplik ayarındadır, izinde değil.
5.3 Yükleme klasörlerinde PHP çalıştırmayı engelle
Saldırganın en sevdiği yöntem, resim yükleme alanına PHP dosyası yüklemektir. Domainin ek Nginx conf dosyasına ekle:
Kod:
location ~* /(uploads|internal_data|data|attachments)/.*\.php$ {
deny all;
return 403;
}
Kod:
nginx -t && systemctl reload nginx
6. Güncellemeleri otomatikleştir
En yaygın hack sebebi sıfır gün açığı değil, aylardır güncellenmeyen yazılımdır.
Güvenlik güncellemelerini otomatikleştir:
Kod:
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
HestiaCP'yi güncelle:
Kod:
apt update && apt upgrade hestia
Panelde Server → Updates bölümünden otomatik güncellemeyi açabilirsin.
Site yazılımlarını (WordPress, XenForo, eklentiler) düzenli güncelle. Takvimine ayda bir hatırlatma koy.
7. Şüpheli aktivite tespiti
Son 24 saatte değişen dosyaları bul; hacklenme şüphesinde ilk bakacağın yer burasıdır:
Kod:
find /home/oblifex/web -type f -mtime -1 -name "*.php" -ls
Şüpheli kod kalıplarını ara:
Kod:
grep -rl --include="*.php" -E "eval\(base64_decode|gzinflate\(base64|str_rot13\(" /home/oblifex/web/
Başarısız panel girişlerini gör:
Kod:
grep "failed" /usr/local/hestia/log/auth.log | tail -30
Aktif oturumları kontrol et:
Kod:
who
last -20
Beklemediğin bir IP'den giriş görüyorsan hemen tüm şifreleri değiştir ve son yedeğe dön.
Rootkit taraması
Kod:
apt install -y rkhunter
rkhunter --update
rkhunter --check --skip-keypress
8. Hacklendiysen ne yapmalısın?
Panik yapıp dosyaları silmek en kötü yaklaşımdır. Sırayla:
- Sunucuyu kapatma, ağdan izole et. Firewall'da 80/443'ü geçici kapat, siteyi bakım moduna al.
- Mevcut hâlin kopyasını al. Kanıt ve inceleme için gerekir.
- Değişen dosyaları tespit et. Yukarıdaki
findkomutuyla giriş noktasını bul. - Temiz bir yedeğe dön. Hangi tarihte bulaştığını bulmadan yedek seçme, virüslü yedeği geri yüklersin.
- Tüm şifreleri değiştir. Panel, SSH, FTP, veritabanı, site yönetici hesapları, mail.
- Açığı kapat. Aynı açık kapanmazsa üç gün içinde tekrar girerler.
Güvenlik kontrol listesi
- SSH anahtar tabanlı, şifre girişi kapalı
- Root ile doğrudan SSH girişi kapalı
- SSH ve panel portu değiştirildi
- Panelde iki adımlı doğrulama açık
- Kullanılmayan portlar firewall'da kapalı
- Fail2Ban aktif, yasak süresi uzun
- Tehlikeli PHP fonksiyonları kapalı
- Yükleme klasörlerinde PHP çalıştırma engelli
- Hiçbir yerde 777 izin yok
- Otomatik güvenlik güncellemeleri açık
- Uzak sunucuya otomatik yedekleme çalışıyor ve test edildi
Bu listedeki her madde bir saldırı yolunu kapatıyor. Hepsini bir günde yapmak zorunda değilsin ama hepsini yap.
Takıldığınız yer olursa sorun, birlikte bakalım. Serinin devamında HestiaCP'de mail sunucusu kurulumu ve maillerin spam'e düşmemesi konusunu işleyeceğim.