Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
WordPress sitelerinin wp-login.php ve xmlrpc.php dosyaları, otomatik parola deneme saldırılarının (brute force) ilk hedefidir. Bu rehberde WordPress giriş saldırılarını sunucu seviyesinde engellemek için Fail2Ban kuralı yazacak, hız sınırlama uygulayacak, xmlrpc erişimini kısıtlayacak ve uygulama tarafında iki adımlı doğrulamayı ele alacağız. Tahmini süre 30-45 dakikadır.
Bu yöntemler birlikte çalışır: sunucu seviyesi önlemler saldırı trafiğini WordPress’e ulaşmadan keser, uygulama seviyesi önlemler ise parolası çalınmış hesabı yine de korur.
Gereksinimler
- Nginx veya Apache çalışan bir Linux sunucu, root/sudo yetkisi
- Fail2Ban kurulumu (Debian/Ubuntu veya EPEL ile AlmaLinux/Rocky)
- Web sunucusunun erişim günlüğünün yolu
- Site önünde Cloudflare gibi bir vekil varsa gerçek ziyaretçi IP’sinin günlüğe yazıldığından emin olunması
- Kendi IP adresinizi not edin (kendinizi engellememek için)
Adım adım WordPress giriş saldırılarını engelleme
1. Saldırıyı günlükte teyit edin
Önce giriş sayfasına kaç istek geldiğini görün.
sudo grep 'POST /wp-login.php' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | headApache’de günlük yolu Debian/Ubuntu için /var/log/apache2/access.log, AlmaLinux için /var/log/httpd/access_log olabilir.
2. Fail2Ban’ı kurun
# Debian/Ubuntu
sudo apt install fail2ban
# AlmaLinux/Rocky
sudo dnf install epel-release
sudo dnf install fail2ban
sudo systemctl enable --now fail2ban3. WordPress filtresi oluşturun
Filtre, günlükte hangi satırların başarısız deneme sayılacağını tanımlar. Aşağıdaki kural, giriş sayfasına ve xmlrpc dosyasına yapılan POST isteklerini sayar.
sudo nano /etc/fail2ban/filter.d/wordpress-login.conf[Definition]
failregex = ^<HOST> .* "POST /wp-login\.php
ignoreregex =[Definition]
failregex = ^<HOST> .* "POST /xmlrpc\.php
ignoreregex =Birinci blok wordpress-login.conf dosyasına aittir. xmlrpc için de ayrı bir jail istiyorsanız ikinci bloğu wordpress-xmlrpc.conf adlı ayrı bir dosyaya yazın; bu rehberin devamında yalnızca giriş filtresini jail olarak tanımlıyoruz. Bu filtre başarılı girişleri de sayar; yalnızca başarısız denemeleri saymak isterseniz WordPress’in başarısız girişte 200, başarılı girişte 302 döndüğünü göz önüne alarak satırın sonuna [^"]*" 200 ekleyebilirsiniz (güvenlik eklentileri bu davranışı değiştirebilir). Filtreyi günlük üzerinde test edin.
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress-login.conf4. Jail tanımlayın
sudo nano /etc/fail2ban/jail.d/wordpress.local[wordpress-login]
enabled = true
port = http,https
filter = wordpress-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 203.0.113.10ignoreip satırına kendi IP adresinizi yazın (örnek adres belge amaçlıdır). Apache kullanıyorsanız logpath değerini kendi günlük yolunuza çevirin.
sudo systemctl restart fail2ban5. Nginx ile hız sınırlama ekleyin
Fail2Ban günlüğü okur, hız sınırlama ise isteği anında yavaşlatır. Bunları birlikte kullanabilirsiniz. http bloğunda bir bölge tanımlayın, giriş konumuna uygulayın.
# http bloğu
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=1r/s;
# server bloğu
location = /wp-login.php {
limit_req zone=wplogin burst=5 nodelay;
# mevcut PHP-FPM (fastcgi) ayarlarınızı buraya ekleyin
}6. xmlrpc.php dosyasını kısıtlayın
Kullanmıyorsanız xmlrpc erişimini tamamen kapatın. Jetpack veya mobil uygulama gibi bir bileşen gerektiriyorsa kapatmadan önce etkisini test edin.
location = /xmlrpc.php {
deny all;
}Apache için karşılığı:
<Files xmlrpc.php>
Require all denied
</Files>7. Uygulama tarafı: iki adımlı doğrulama ve parola
Yönetici ve editör hesaplarında iki adımlı doğrulama eklentisi kullanın, admin gibi tahmin edilebilir kullanıcı adlarını değiştirin, güçlü ve benzersiz parolalar belirleyin. İsterseniz giriş sayfasını ek bir HTTP kimlik doğrulamasıyla veya IP kısıtlamasıyla da koruyabilirsiniz.
8. Yapılandırmayı sınayıp yeniden yükleyin
sudo nginx -t && sudo systemctl reload nginxDoğrulama
sudo fail2ban-client status wordpress-login
sudo fail2ban-client set wordpress-login banip 198.51.100.7
sudo fail2ban-client set wordpress-login unbanip 198.51.100.7Beklenen sonuç: jail durumu Currently failed ve Banned IP list alanlarını gösterir. Kendi IP’niz ignoreip listesinde olduğu için engellenmez; gerçek bir test için ignoreip dışında kalan bir ağdan (ör. mobil veri) yanlış parolayla art arda giriş deneyin, sınıra ulaşınca o IP engellenmelidir. Testten sonra unbanip ile engeli kaldırın. xmlrpc için curl -I https://alanadiniz.com/xmlrpc.php çağrısı 403 dönmelidir.
Sık karşılaşılan sorunlar
- Fail2Ban hiçbir şey engellemiyor:
fail2ban-regexçıktısında eşleşme sayısına bakın; günlük biçimi veya yol yanlış olabilir. - Herkes aynı IP görünüyor: Site vekil/CDN arkasındadır; web sunucusunda gerçek IP’yi günlüğe yazdırın, aksi halde vekil IP’si engellenir.
- Kendimi engelledim: Sunucudan
fail2ban-client set wordpress-login unbanip IPçalıştırın ve IP’niziignoreiplistesine ekleyin. - Jetpack veya mobil uygulama çalışmıyor: xmlrpc kapatılmıştır; yalnızca ilgili servis IP’lerine izin vermeyi düşünün.
Güvenlik ve bakım notları
- WordPress çekirdeği, eklenti ve temaları güncel tutun.
- Kullanılmayan yönetici hesaplarını silin.
- Giriş denemelerini ve engellenen IP’leri haftalık gözden geçirin.
- Gerekirse giriş sayfasını yalnızca belirli IP aralıklarına açın.
- Bot trafiği çok yüksekse WAF veya CDN seviyesinde hız sınırlama düşünün.
- Başarılı bir girişten sonra yönetici e-postasına bildirim gönderen bir ayar ekleyin.
Sık sorulan sorular
wp-login.php adresini değiştirmek yeterli mi?
Adres değiştirmek otomatik botları azaltır ama gerçek koruma değildir. Hız sınırlama, Fail2Ban ve iki adımlı doğrulama ile birlikte kullanmak çok daha etkilidir.
Fail2Ban sunucuyu yavaşlatır mı?
Normal koşullarda ihmal edilebilir bir yük getirir. Çok büyük günlük dosyalarında ise süreyi ve tarama aralığını gözden geçirmek gerekebilir.
Paylaşımlı hostingde bunları yapabilir miyim?
Sunucu ayarlarına erişiminiz yoksa uygulama tarafı önlemleri (iki adımlı doğrulama, güvenlik eklentisi, parola) ve hosting sağlayıcınızın sunduğu koruma özelliklerini kullanın.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- AIDE ile dosya bütünlüğü izlemeAIDE ile sunucudaki dosya değişikliklerini izleyin: kurulum, veritabanı oluşturma, kural yazma, düzenli denetim, güncelleme ve sonuçları güvenle yorumlama adımları.
- Dosya yükleme güvenliği: uzantı, MIME, depolama ve çalıştırma engeliDosya yükleme formlarını güvenli hale getirin: uzantı beyaz listesi, gerçek MIME denetimi, rastgele dosya adı, web kökü dışında depolama ve yükleme dizininde betik çalıştırmayı engelleme.
- XSS önleme ve CSP ile site savunmasıSiteler arası betik çalıştırma (XSS) saldırılarını çıktı kaçışı, güvenli çerezler ve Content-Security-Policy başlığıyla önleyin; Nginx ve Apache örnekleri ve Report-Only ile güvenli geçiş.
- SQL enjeksiyonunu önleme: hazır sorgular (prepared statements) ve doğrulama (PHP PDO örnekleriyle)SQL enjeksiyonunu PHP PDO hazır sorgularıyla önleyin: parametre bağlama, beyaz liste ile ORDER BY, IN listeleri, en az yetkili veritabanı kullanıcısı ve saldırı denemesiyle doğrulama.