WordPress Giriş Güvenliği ve Brute Force Koruması
Kısa cevap
WordPress giriş güvenliğini brute force'a karşı korumak için tek bir önlem yetmez: iki adımlı doğrulama, giriş deneme sınırı, giriş URL'sini gizleme, güçlü parola politikası ve fail2ban ile IP engelleme katmanlarını birlikte kurarsınız. Botlar önce eşikte, sonra parolada, en son IP düzeyinde durdurulur.
WordPress giriş ekranı, internetteki en çok saldırıya uğrayan sayfalardan biridir. Sitenizi yeni yayına aldıktan birkaç saat sonra bile, dünyanın dört bir yanındaki botlar wp-login.php ve xmlrpc.php sayfalarınıza parola denemeye başlar. Bu saldırıların hedef seçmesi gerekmez; otomatik tarayıcılar tüm interneti gezip WordPress kurulumlarını bulur ve sözlük listeleriyle giriş dener.
İyi haber, bu saldırıların işe yaramasının tek nedeninin zayıf parolalar ve korumasız bir giriş ekranı olmasıdır. Doğru katmanları kurduğunuzda, milyonlarca deneme yapılsa bile botlar içeri giremez. Bu yazıda brute force'un tam olarak nasıl çalıştığını ve onu adım adım nasıl durduracağınızı anlatıyoruz.
Brute Force ve XML-RPC Saldırısı Nasıl Çalışır?
Brute force, bir saldırganın geçerli parolayı bulana kadar otomatik olarak binlerce hatta milyonlarca kombinasyon denemesidir; WordPress'te bu saldırı iki cepheden gelir: wp-login.php üzerinden klasik form denemeleri ve xmlrpc.php üzerinden çok daha verimli toplu denemeler. Saldırganlar genelde en yaygın parolaları içeren "sözlük" listeleri kullanır; bu yüzden zayıf parolalar dakikalar içinde kırılır.
XML-RPC'nin özel tehlikesi system.multicall yöntemidir. Normalde her parola denemesi ayrı bir HTTP isteği gerektirirken, saldırgan bu yöntemle tek bir istekte yüzlerce parolayı birden deneyebilir. Yani wp-login.php'de saatte birkaç yüz deneme yapan bir bot, aynı süede XML-RPC üzerinden on binlerce deneme yapabilir. Bu nedenle XML-RPC'yi kullanmıyorsanız kapatmak, giriş güvenliğinin en yüksek getirili adımlarından biridir:
# .htaccess — xmlrpc.php'ye erişimi tümden kapat
<Files xmlrpc.php>
Require all denied
</Files>
Botların bir diğer taktiği, önce geçerli kullanıcı adlarını toplamaktır. Yazar arşivi URL'leri (?author=1) veya REST API kullanıcı uç noktası, kullanıcı adlarını sızdırabilir. Kullanıcı adını bilen saldırgan, artık yalnızca parolayı denemek zorunda kalır ve işi kolaylaşır.
Güçlü Parola Politikası Uygulayın
Brute force'a karşı en temel savunma, tahmin edilmesi ve sözlük saldırısıyla kırılması imkânsız parolalardır; tüm yönetici ve editör hesapları uzun, benzersiz ve rastgele parolalar kullanmalı, aynı parola başka hiçbir yerde tekrar edilmemelidir. Bir botun deneyeceği ilk şeyler "123456", "admin123", site adı + yıl gibi tahmin edilebilir dizilerdir; parola bunların dışındaysa saldırının süresi pratikte sonsuza uzar.
Uygulanabilir kurallar:
- Uzunluk her şeydir: En az 16 karakter; uzunluk, karmaşıklıktan daha çok işe yarar. Bir parola yöneticisiyle rastgele üretin.
- Tekrar yasak: Aynı parolayı e-posta, hosting paneli ve WordPress'te kullanmayın; birinde sızarsa hepsi düşer.
- Kullanıcı adını ayırın: "admin" kullanmayın ve görünen adı (display name) kullanıcı adından farklı tutun.
Yazar arşivinden kullanıcı adı sızmasını engellemek için author sorgularını yönlendirebilirsiniz:
// ?author=N ile kullanıcı numaralandırmasını engelle
add_action( 'template_redirect', function() {
if ( is_author() && ! is_user_logged_in() ) {
wp_redirect( home_url(), 301 );
exit;
}
} );
İki Adımlı Doğrulamayı (2FA) Zorunlu Kılın
İki adımlı doğrulama, parolanız ele geçse bile saldırganın içeri girmesini engelleyen en güçlü tek önlemdir; giriş sırasında paroladan sonra telefonunuzdaki uygulamadan gelen zamanla değişen bir kod da istenir. Brute force ile doğru parolayı bulan bir bot bile, bu ikinci faktör olmadan panele ulaşamaz — yani 2FA, parola tabanlı saldırıların büyük kısmını anlamsız hale getirir.
TOTP tabanlı (Google Authenticator, Authy, 1Password gibi) uygulamalar tercih edilmelidir. SMS tabanlı doğrulama, SIM swap saldırılarına açık olduğu için ikinci tercih olmalıdır. En az yönetici, editör ve yazar rolleri için 2FA'yı zorunlu tutun; isteğe bağlı bıraktığınızda çoğu kullanıcı etkinleştirmez.
2FA'nın brute force'a karşı bu kadar etkili olmasının nedeni, saldırının ekonomisini tamamen bozmasıdır. Bir bot parolayı kaba kuvvetle bulmayı, denenecek kombinasyon sayısı sonlu olduğu için mümkün görür. Oysa TOTP kodu 30 saniyede bir değişen altı haneli bir sayıdır; saldırganın hem parolayı hem de o anki geçerli kodu aynı anda bilmesi gerekir. Kodu tahmin etme olasılığı pratikte sıfıra yakındır ve zaman penceresi o kadar dardır ki kaba kuvvetle denenemez. Bu yüzden 2FA, parolası sızmış bir hesabı bile korur.
2FA'yı yedek kodlarla birlikte kurun; telefon kaybı durumunda kendinizi dışarıda bırakmamak için kurtarma kodlarını güvenli bir yerde saklayın. Ayrıca ekibinizde birden fazla yönetici varsa, hepsinin 2FA kullandığından emin olun — koruması olmayan tek bir yönetici hesabı, tüm sitenin zayıf halkası olur.
Giriş Deneme Sınırı Koyun
WordPress varsayılan olarak sınırsız giriş denemesine izin verir; bu yüzden başarısız denemelere bir sınır koyup, sınırı aşan IP'leri geçici olarak engellemelisiniz. Örneğin 5 başarısız denemeden sonra o IP'yi 15-30 dakika bloklamak, saatte binlerce deneme yapabilen bir botu birkaç denemede durdurur ve saldırıyı ekonomik olmaktan çıkarır.
Deneme sınırının mantığı kademelidir: İlk birkaç başarısız denemeden sonra kısa bir bekleme, tekrarlayan ihlallerde daha uzun engel. Bu, gerçek kullanıcının bir kez parolasını yanlış girmesini cezalandırmadan, ısrarcı botu etkili biçimde eler.
Deneme sınırı ile 2FA birbirini tamamlar: 2FA doğru parolayı bile yetersiz kılar, deneme sınırı ise parolanın hiç denenememesini sağlar. İkisi birlikte, hem otomatik hem hedefli saldırılara karşı sağlam bir duvar kurar. Bu koruma özellikle çok sayıda kullanıcı hesabı olan sitelerde kritik önem taşır.
Deneme sınırını kurarken dikkat edilmesi gereken bir nokta, engellemenin gerçek IP adresine göre yapılmasıdır. Siteniz Cloudflare veya bir yük dengeleyici arkasındaysa, tüm istekler tek bir proxy IP'sinden geliyormuş gibi görünebilir; bu durumda sınır yanlış çalışır ve ya herkesi ya da hiç kimseyi engeller. Bu yüzden proxy arkasındaki kurulumlarda ziyaretçinin gerçek IP'sini doğru okuyacak yapılandırmayı (örneğin CF-Connecting-IP başlığını) mutlaka doğrulayın. Aksi halde deneme sınırı bir güvenlik önlemi değil, meşru kullanıcıları dışarıda bırakan bir tuzak haline gelir.
Giriş URL'sini Gizleyin
Botların ezici çoğunluğu doğrudan /wp-login.php ve /wp-admin yollarını hedefler; bu yolları tahmin edilemez bir adrese taşımak, saldırıların büyük kısmını daha ilk temasta eler. Bir bot giriş sayfasını bulamazsa parola denemesine bile başlayamaz — bu, "gizlilikle güvenlik" değil, gürültüyü kaynağında kesen pratik bir filtredir.
Giriş URL gizleme tek başına yeterli bir güvenlik önlemi değildir; hedefli bir saldırgan yeni URL'yi bulabilir. Ama otomatik bot trafiğinin çok büyük kısmını kestiği için, sunucu yükünü ve log gürültüsünü ciddi biçimde azaltır ve gerçek saldırı denemelerini görünür kılar. Bu yüzden gizlemeyi, deneme sınırı ve 2FA'nın yerine değil, yanına koyun.
Ek olarak, yöneticiler sabit bir IP'den giriyorsa, giriş sayfasını sunucu düzeyinde yalnızca o IP'ye açmak en güçlü korumadır:
# wp-login.php'yi yalnızca güvenilir IP'lere aç
<Files wp-login.php>
Require ip 203.0.113.10
Require ip 198.51.100.0/24
</Files>
fail2ban ile WordPress Girişlerini Sunucu Düzeyinde Engelleyin
En güçlü brute force savunması sunucu katmanındadır: fail2ban, sunucu loglarını izleyip belirli sürede çok sayıda başarısız giriş yapan IP'leri güvenlik duvarı düzeyinde tamamen engeller — yani bloklanan istek PHP'ye, WordPress'e hatta çoğu zaman web sunucusuna bile ulaşmadan düşer. Bu, eklenti tabanlı deneme sınırından daha verimlidir, çünkü engelleme WordPress yüklenmeden gerçekleşir ve sunucu kaynağı harcamaz.
fail2ban'ı WordPress'e bağlamak için, başarısız girişlerin loga düşmesi gerekir. Bir eklenti veya küçük bir kod parçası ile başarısız girişleri sunucu loguna yazdırabilirsiniz; ardından fail2ban için bir filtre ve jail tanımlarsınız:
# /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST .*/wp-login.php
^<HOST> .* "POST .*/xmlrpc.php
ignoreregex =
# /etc/fail2ban/jail.local
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/apache2/access.log
maxretry = 5
findtime = 300
bantime = 3600
Bu yapılandırma, 5 dakika içinde 5'ten fazla giriş POST'u yapan IP'yi 1 saat boyunca engeller. bantime değerini tekrar eden ihlallerde uzatabilir (recidive jail) veya kalıcı bana çevirebilirsiniz. fail2ban'ı sıfırdan kurup yapılandırmayı fail2ban kurulumu ve yapılandırması rehberimizde adım adım anlattık.
fail2ban'ın büyük avantajı, WordPress'ten bağımsız çalışmasıdır: Aynı yapıyla SSH, posta sunucusu ve diğer servislere yönelik brute force denemelerini de aynı anda engellersiniz. Sunucu tabanlı brute force önleme mantığının bütününü brute force saldırısı nasıl önlenir yazımızda ele aldık.
Tekrarlayan ihlaller için "recidive" adı verilen ikinci bir katman kurmak, ısrarcı saldırganları çok daha uzun süre engellemenizi sağlar. Bu yapı, fail2ban'ın kendi loglarını izler ve defalarca banlanan bir IP'yi (örneğin bir gün içinde beşten fazla) günlerce hatta haftalarca engeller. Böylece aynı IP havuzundan gelen inatçı botlar, kısa süreli banların arasından sızmak yerine kalıcı olarak elenir. Bu, özellikle belirli botnet aralıklarından sürekli saldırı alan siteler için etkili bir savunmadır.
Son olarak, fail2ban engellemelerini izlemek de önemlidir; hangi IP'lerin ne sıklıkta banlandığını görmek, saldırının şiddetini ve kaynağını anlamanızı sağlar. fail2ban-client status wordpress komutuyla o an kaç IP'nin engelli olduğunu ve toplam kaç deneme yakalandığını görebilirsiniz. Sürekli yüksek sayılar görüyorsanız, giriş URL gizleme ve XML-RPC kapatma gibi eşik-öncesi filtreleri de devreye almak sunucu yükünü ciddi biçimde azaltır.
Sık Sorulan Sorular
Botlar sitemi yeni yayınladım, neden bu kadar çabuk saldırıya başladı?
Çünkü saldırılar hedefli değildir. Otomatik tarayıcılar sürekli tüm interneti gezerek WordPress kurulumlarını arar ve bulduğu her siteye deneme yapar. Sitenizin küçük, yeni veya bilinmedik olması sizi korumaz; botlar için siz sadece listedeki bir IP'siniz. Bu yüzden giriş korumasını sitenin ilk gününden itibaren kurmak gerekir.
XML-RPC brute force için deneme sınırı eklentisi yeterli mi?
Genelde değil. Çünkü XML-RPC'nin system.multicall yöntemi, tek bir HTTP isteğinde yüzlerce parola denemesine izin verir; eklenti bunu tek başarısız giriş sayabilir ve sınırı geç devreye sokar. En sağlamı, kullanmıyorsanız XML-RPC'yi tümden kapatmak; kullanıyorsanız erişimini WAF veya IP kısıtıyla korumaktır.
fail2ban mı yoksa güvenlik eklentisi mi daha iyi?
İkisi farklı katmanlardır ve birlikte kullanılmaları en iyisidir. Güvenlik eklentisi WordPress içinde çalışır ve kullanıcı dostudur; fail2ban ise sunucu düzeyinde, WordPress yüklenmeden engelleme yapar ve çok daha az kaynak harcar. Eklenti kolaylık, fail2ban verimlilik sağlar; ideali her ikisini birden kurmaktır.
Giriş URL'mi gizlersem tamamen güvende olur muyum?
Hayır. Giriş URL gizleme otomatik bot trafiğinin büyük kısmını keser ama hedefli bir saldırgan yeni adresi bulabilir. Bunu tek başına bir güvenlik önlemi olarak değil, deneme sınırı, 2FA ve güçlü parolanın üzerine eklenen bir gürültü filtresi olarak görün.
Google Authenticator telefonumu kaybedersem panele giremez miyim?
2FA kurarken size verilen yedek kurtarma kodlarını güvenli bir yerde saklarsanız girebilirsiniz. Telefon kaybı durumunda bu kodlarla giriş yapıp yeni cihazınızı tanımlarsınız. Kurtarma kodlarını hiç saklamadıysanız, sunucuya erişimi olan biri (siz veya hostinginiz) 2FA eklentisini geçici olarak devre dışı bırakarak erişimi geri açabilir.
Sitenize sürekli brute force denemesi geliyorsa ve nereden başlayacağınızdan emin değilseniz, ücretsiz bir teşhisle giriş güvenliğinizin zayıf noktalarını çıkaralım. Acil bir durumda 7/24 WhatsApp hattımızdan bize ulaşın; WordPress virüs temizleme ve bakım ve izleme hizmetlerimizle giriş ekranınızı sunucu düzeyinde kalıcı olarak koruma altına alalım.