İçindekiler
wp-login.php neden bu kadar çok saldırı alıyor?
Her WordPress sitesinin giriş adresi aynıdır: /wp-login.php ve /wp-admin/. Botların sitenizi tanımasına gerek yoktur; adres listesini alıp dünyanın her yerinden aynı anda parola denerler. Buna kaba kuvvet (brute force) saldırısı denir.
- Kullanıcı adı tahmini kolaydır. "admin" hâlâ en çok denenen addır. Yazar arşivi (
/?author=1) de çoğu sitede kullanıcı adını ele verir. - xmlrpc.php tek istekte yüzlerce parola denemeye izin verir.
system.multicallyöntemi, giriş sınırlama eklentilerinin saydığı istek sayısını bire indirir. - Her deneme sunucuyu yorar. Başarısız olsa bile her istek PHP'yi ve veritabanını çalıştırır. Yoğun bir saldırı siteyi yavaşlatabilir, hatta çökertebilir.
Saldırının başarılı olması için tek bir zayıf parola yeter. Bu yüzden wp-login güvenliği tek bir eklentiyle değil, birbirini tamamlayan katmanlarla sağlanır.
WordPress giriş sayfası güvenliği: hızlı kontrol listesi
Aşağıdaki on adım, küçük bir blogdan çok siteli bir ajansa kadar her WordPress kurulumuna uyar. Ayrıntıları sonraki bölümlerde bulacaksınız.
- Her yönetici hesabına uzun ve benzersiz bir parola verin.
- "admin" kullanıcı adını kaldırın.
- Yönetici ve editör hesaplarında iki faktörlü doğrulamayı açın.
- Giriş sayfasını yalnızca HTTPS üzerinden sunun.
- Giriş denemelerini sınırlayın ya da captcha ekleyin.
- Kullanmıyorsanız xmlrpc.php'yi kapatın.
- wp-login.php'yi IP ile kısıtlayın ya da dışarıya tamamen kapatın.
- Hatalı giriş denemeleri için anlık bildirim kurun.
- Israrla saldıran IP adreslerini engelleyin.
- Çekirdeği, eklentileri ve temaları güncel tutun, siteyi düzenli tarayın.
| Önlem | Neye karşı korur | Zorluk | Birtıkta'da |
|---|---|---|---|
| Güçlü parola ve 2FA | Parola tahmini, sızan parolalar | Kolay | — |
| Giriş sınırlama, captcha | Otomatik denemeler | Kolay | — |
| Giriş adresini değiştirme | Bot gürültüsü | Orta | — |
| xmlrpc.php'yi kapatma | Toplu parola denemesi | Kolay | ✓ Tek tıkla |
| wp-login.php'yi kapatma | Tüm dış giriş denemeleri | Orta | ✓ Tek tıkla |
| Hatalı giriş bildirimi | Fark edilmeyen saldırılar | Orta | ✓ Mobil, e-posta, Slack, WhatsApp |
| IP engelleme | Israrcı saldırganlar | Orta | ✓ Tek tıkla |
| "admin" ve SSL kontrolü | Riskli yapılandırma | Kolay | ✓ Güvenlik taraması |
Temel önlemler: parola, kullanıcı adı, 2FA ve HTTPS
Güçlü ve benzersiz parola
En az 14 karakterlik, başka hiçbir yerde kullanmadığınız bir parola seçin ve bir parola yöneticisinde saklayın. Sızan parola listeleri saldırganların ilk baktığı yerdir. Başka bir sitede kullandığınız parola, WordPress'iniz için de açık kapıdır.
"admin" kullanıcı adını kullanmayın
Kullanıcılar ekranından yeni bir yönetici oluşturun, onunla giriş yapın ve eski "admin" hesabını silerken içeriği yeni hesaba aktarın. Profildeki "Herkese açık görünen ad" alanını kullanıcı adından farklı seçin; böylece yazıların altında kullanıcı adınız görünmez. Birtıkta Güvenlik Taraması "admin" adlı kullanıcıyı ve SSL eksikliğini riskli yapılandırma olarak işaretler.
İki faktörlü doğrulama (2FA)
WordPress çekirdeğinde 2FA yoktur. Two Factor gibi bir eklentiyle yönetici hesaplarında, Google Authenticator benzeri bir uygulamanın ürettiği tek kullanımlık kodu zorunlu tutun. Yedek kodları parolanızdan ayrı bir yerde saklayın. Parolanız ele geçse bile ikinci adım olmadan giriş yapılamaz.
Girişi HTTPS üzerinden yapın
Giriş formu HTTPS olmadan çalışıyorsa parola ağda açık metin olarak gider. SSL sertifikasını kurduktan sonra wp-config.php dosyasına şu satırı ekleyerek yönetim panelini HTTPS'e zorlayın:
define( 'FORCE_SSL_ADMIN', true );
Sertifikanın süresi dolarsa ziyaretçiler tarayıcı uyarısı görür. Birtıkta Uptime Monitör SSL bitiş tarihini önceden haber verir.
wp-login.php gizleme, giriş sınırlama ve XML-RPC
Giriş adresini değiştirmek yeterli mi?
WPS Hide Login gibi eklentiler giriş sayfasını /wp-login.php yerine sizin seçtiğiniz bir adrese taşır ve otomatik bot trafiğini belirgin şekilde azaltır. Ancak bu bir gizlemedir, kilit değildir. Adres bir e-postada ya da tarayıcı geçmişinde ortaya çıkabilir; eklenti devre dışı kalırsa eski adres geri gelir. WordPress'in resmi el kitabı da bunun tek başına savunma olmaması gerektiğini vurgular.
Giriş denemelerini sınırlama ve captcha
Giriş sınırlama eklentileri belirli sayıda hatalı denemeden sonra IP adresini bir süre bekletir. Cloudflare Turnstile ya da reCAPTCHA gibi doğrulamalar da botları ayıklar. İkisi de PHP katmanında çalıştığı için çok yoğun bir saldırıda sunucu yine yorulur. Mümkünse sınırlamayı WAF ya da CDN gibi kenar katmanda yapın.
xmlrpc.php'yi kapatma
XML-RPC, WordPress'e uzaktan yazı göndermek için kullanılan eski bir arayüzdür; bugün bu işi çoğunlukla REST API yapar. Kullanmıyorsanız Apache 2.4 sunucuda kök dizindeki .htaccess dosyasına şu bloğu ekleyin:
# xmlrpc.php'ye dışarıdan tüm erişimi kapat (Apache 2.4)
<Files "xmlrpc.php">
Require all denied
</Files>
Nginx kullanıyorsanız sunucu bloğuna eklenen location = /xmlrpc.php { deny all; } satırı aynı işi görür.
Dikkat: Jetpack'in bazı özellikleri ve eski mobil yayın uygulamaları xmlrpc.php'ye ihtiyaç duyar. Bunlardan birini kullanıyorsanız kapatmadan önce test edin.
wp-login.php'yi IP ile kısıtlama
Siteye her zaman aynı ofisten ya da sabit bir IP adresinden giriyorsanız giriş sayfasını yalnızca o adreslere açabilirsiniz:
# wp-login.php'ye yalnızca listelenen IP'lerden izin ver (Apache 2.4)
<Files "wp-login.php">
Require ip 203.0.113.15
Require ip 198.51.100.0/24
</Files>
Dikkat: IP'si değişen bağlantılarda (ev interneti, mobil hat) kendinizi dışarıda bırakırsınız. Site Cloudflare gibi bir proxy arkasındaysa sunucu ziyaretçinin değil proxy'nin IP'sini görür; mod_remoteip ayarlanmadan bu kural doğru çalışmaz. Değişiklikten önce .htaccess dosyasının yedeğini alın ve dosya yöneticisi ya da FTP erişiminizin açık olduğundan emin olun.
cPanel'de "Dizin Gizliliği" ile wp-admin klasörüne sunucu düzeyinde ikinci bir parola da ekleyebilirsiniz. Bu durumda ön yüzün kullandığı admin-ajax.php dosyasını kuralın dışında bırakın.
Daha basit yol: giriş sayfasını tamamen kapatmak
Yukarıdaki yöntemlerin ortak sorunu, saldırı isteklerinin hâlâ giriş formuna ulaşmasıdır. Sınırlama, captcha ve adres gizleme denemeleri yalnızca zorlaştırır. Daha güçlü yaklaşım kapıyı dışarıya tamamen kapatmak ve siteye başka, güvenli bir yoldan girmektir.
Bu yaklaşımda wp-login.php ve xmlrpc.php'ye gelen her dış istek 403 ile reddedilir. Apache'de engel .htaccess kuralıyla WordPress yüklenmeden uygulanır, böylece saldırı sunucuyu da yormaz. Çıkış yapma, oturum yenileme ve parolalı yazı formu çalışmaya devam eder.
Hatalı giriş denemelerini anında telefonunuza bildirin
Kontrol listesindeki adımların çoğu önleyicidir; kimin, ne zaman denediğini ise ancak izleyerek öğrenirsiniz. Erken fark edilen bir saldırı, parola sızıntısı gibi daha büyük bir sorunun ilk işareti olabilir. Güvenlik eklentilerinin çoğu hatalı girişleri kaydeder, ancak bildirimleri genellikle e-postayla ve toplu gönderir.
İyi bir bildirimde en azından kullanıcı adı, IP adresi ve ülke yer almalıdır. Var olmayan kullanıcı adlarıyla gelen denemeler çoğunlukla bot taramasıdır. Gerçek bir yönetici adıyla gelen denemeler ise o hesabın hedeflendiğini gösterir.
Şüpheli IP adreslerini engelleyin
Aynı adresten ısrarla gelen denemeleri sunucu düzeyinde engellemek, o IP'nin sitenize ulaşmasını tamamen keser. Apache 2.4'te .htaccess dosyasına şu bloğu ekleyebilirsiniz:
# Belirli IP'leri sitenin tamamından engelle (Apache 2.4)
<RequireAll>
Require all granted
Require not ip 203.0.113.24
Require not ip 198.51.100.7
</RequireAll>
Saldırılar çoğunlukla binlerce farklı IP'den gelir ve liste bir süre sonra yönetilemez hale gelir. Bu yüzden IP engellemeyi tek başına değil, giriş sayfasını kapatmanın tamamlayıcısı olarak düşünün.
Giriş sayfası kapalıyken siteye nasıl girilir?
Giriş formunu kapattığınızda akla gelen ilk soru budur. Çözüm, girişi tarayıcıdaki formdan alıp güvendiğiniz bir panele taşımaktır. Panel, siteye kısa ömürlü ve tek kullanımlık bir anahtar ürettirir; anahtar kullanılınca silinir. Parola hiçbir yere yazılmaz, kimseyle paylaşılmaz.
Böylece siteye girmek için parolayı hatırlamanız ya da bir yere not etmeniz gerekmez. Saldırganın deneyebileceği bir giriş formu da kalmaz.
Birden fazla sitede giriş güvenliğini tek ekrandan izleyin
On sitenin her birine ayrı eklenti kurup ayrı ayar yapmak, bir yerde mutlaka bir açık bırakır. Ajanslar ve çok siteli yöneticiler için asıl ihtiyaç, tüm sitelerin giriş denemelerini ve koruma durumunu tek bir listede görmektir.
Güncelleme, WAF ve düzenli tarama
Giriş sayfası ne kadar sağlam olursa olsun, güncel olmayan bir eklentideki açık saldırganı hiç giriş yapmadan içeri alabilir. Çekirdeği, eklentileri ve temaları düzenli güncelleyin; Birtıkta'da bunu tüm siteler için toplu yapabilirsiniz. Cloudflare gibi bir WAF, kötü trafiği sunucuya ulaşmadan durdurur. Haftalık güvenlik taraması da zararlı kodu ve riskli ayarları erken yakalar. Tek bir kapsamlı güvenlik eklentisi yeterlidir; aynı işi yapan iki eklenti birbiriyle çakışabilir.