أوقف هجمات التخمين (Brute-Force) على صفحة دخول ووردبريس

كل موقع ووردبريس منشور على الإنترنت يتلقى محاولات دخول من برامج آلية. تجرّب أسماء مستخدمين شائعة وكلمات مرور مسرّبة على wp-login.php وxmlrpc.php آلاف المرات يوميًا. معظمها يفشل، لكن الخطر في المحاولة التي تنجح، وفي الحمل الذي تضعه المحاولات الفاشلة على خادمك في الأثناء.
لا يوجد إعداد واحد يوقف ذلك. ما ينجح فعلًا هو عدة طبقات: حسابات يصعب تخمينها، وعامل تحقق ثانٍ، وحدود لسرعة المحاولات، وإغلاق نقاط الدخول التي لا تستخدمها. يشرح هذا الدليل كل طبقة، من لوحة التحكم إلى الخادم.
الخطوة 1: اعرف ما الذي يستهدف موقعك
قبل أي تغيير، راجع سجل الوصول. على خادم VPS يعمل بـ Nginx يكون غالبًا في /var/log/nginx/access.log، وفي الاستضافة المشتركة توفر لوحة التحكم سجل وصول خامًا يمكنك تنزيله.
# How many login and XML-RPC POSTs are in the log?
grep -cE '"POST /(wp-login|xmlrpc)\.php' /var/log/nginx/access.log
# Which IP addresses send the most?
awk '$6 == "\"POST" && $7 ~ /wp-login\.php|xmlrpc\.php/ {print $1}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn | head -20
بضع عشرات من طلبات POST يوميًا ضجيج عادي. مئات الطلبات في الساعة من قائمة قصيرة من عناوين IP تعني محاولة موجّهة. وآلاف الطلبات في الساعة من عناوين كثيرة تعني هجومًا موزعًا، وهنا تصبح الحدود على مستوى الخادم هي الأهم.
لماذا يكلّفك ذلك حتى لو فشلت الهجمات؟ لأن كل محاولة دخول تشغّل PHP وتستعلم من قاعدة البيانات. وعلى خطة صغيرة قد تكفي المحاولات الكثيرة لإبطاء الموقع أو استنفاد عمليات PHP، فينتظر الزوار الحقيقيون.
الخطوة 2: اجعل الحسابات صعبة الاختراق
كلمات مرور قوية وفريدة لكل حساب له صلاحيات
البرامج الآلية لا تخمّن عشوائيًا، بل تستخدم قوائم كلمات مرور مسرّبة من مواقع أخرى. وكلمة المرور المكررة من خدمة أخرى هي الطريق الأكثر شيوعًا للاختراق. يحتاج كل مدير ومحرر ومدير متجر إلى كلمة مرور طويلة وفريدة من مدير كلمات مرور.
# List users with admin rights
wp user list --role=administrator --fields=ID,user_login,user_email
# Force a new strong password for one account
wp user update 1 --user_pass="$(openssl rand -base64 24)"
لا أسماء مستخدمين متوقعة
تجنب admin أو اسم الموقع أو النطاق كاسم مستخدم. لا يسمح ووردبريس بتغيير اسم المستخدم، لذا أنشئ مديرًا جديدًا باسم مختلف، وادخل به، ثم احذف الحساب القديم وانقل محتواه إلى الحساب الجديد. وتذكّر أن أسماء المستخدمين يمكن اكتشافها غالبًا من أرشيف الكتّاب وواجهة REST API، فإخفاء الاسم يساعد قليلًا لكنه ليس حماية في حد ذاته. ما يُحدث الفرق هو كلمة المرور والعامل الثاني.
عدد أقل من المديرين
امنح دور Administrator لمن يحتاجه فقط، واحذف الحسابات القديمة للموظفين والوكالات والمستقلين الذين لم يعودوا يعملون على الموقع.
الخطوة 3: فعّل التحقق بخطوتين
التحقق بخطوتين (2FA) يعني أن كلمة المرور الصحيحة وحدها لا تكفي، بل يحتاج المستخدم أيضًا إلى رمز مؤقت من تطبيق مصادقة. وهذا يُفشل هجمات التخمين وكلمات المرور المسرّبة، لأن البرنامج الآلي لا يملك الهاتف.
استخدم تطبيق مصادقة (TOTP) بدل الرسائل النصية متى أمكن.
اشترط التحقق بخطوتين لكل دور يستطيع النشر أو تثبيت الإضافات أو رؤية الطلبات.
احفظ رموز الاسترداد في مكان آمن حتى لا يمنعك فقدان الهاتف من الدخول.
توجد عدة إضافات جيدة الصيانة تضيف التحقق بخطوتين إلى صفحة الدخول المعتادة، ومنها إضافة Two-Factor التي يطوّرها مساهمون في ووردبريس. اختر إضافة تُحدَّث باستمرار وتعمل مع صفحة الدخول وصفحة حساب WooCommerce إن وُجدت.
الخطوة 4: حدّد عدد محاولات الدخول
داخل ووردبريس
يمكن لإضافة حماية أو إضافة لتحديد محاولات الدخول أن تحظر عنوان IP بعد عدة محاولات فاشلة، وإعدادها سهل على أي خطة استضافة. لكن حدّها أن ووردبريس وPHP يعملان مع كل محاولة قبل أن ترفضها الإضافة، فهي تحمي الحسابات لكنها لا تخفف كثيرًا من حمل الخادم.
على خادم الويب (Nginx)
تحديد المعدل في Nginx يرفض الطلبات الزائدة قبل أن يبدأ PHP. تسمح هذه القاعدة بنحو خمسة طلبات دخول في الدقيقة لكل عنوان IP، مع هامش صغير للمستخدمين الحقيقيين الذين يخطئون في كلمة المرور. تعامل مع الأرقام كنقطة بداية وعدّلها بحسب موقعك.
# In the http { } block, for example in /etc/nginx/nginx.conf
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=5r/m;
# In your site's server { } block
location = /wp-login.php {
limit_req zone=wplogin burst=5 nodelay;
limit_req_status 429;
# Keep the same PHP lines your main "location ~ \.php$" block uses, e.g.:
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
اختبر الإعداد بالأمر sudo nginx -t ثم أعد التحميل بالأمر sudo systemctl reload nginx. الطلبات التي تتجاوز الحد تتلقى رمز HTTP 429 بدل صفحة الدخول.
باستخدام fail2ban
يقرأ fail2ban السجلات ويحظر عناوين IP في الجدار الناري بعد تكرار الطلبات. يحسب هذا الفلتر طلبات POST إلى ملفي الدخول وXML-RPC، فيحسب عمليات الدخول الناجحة أيضًا، لكن مع السماح بعشر محاولات في عشر دقائق نادرًا ما يتأثر المستخدمون الحقيقيون.
# /etc/fail2ban/filter.d/wordpress-login.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login\.php
^<HOST> .* "POST /xmlrpc\.php
ignoreregex =
# /etc/fail2ban/jail.local
[wordpress-login]
enabled = true
port = http,https
filter = wordpress-login
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 600
bantime = 3600
sudo systemctl restart fail2ban
sudo fail2ban-client status wordpress-login
إذا كان موقعك خلف CDN أو Reverse Proxy، فقد يُظهر السجل عنوان الـ Proxy بدل عنوان الزائر. اضبط عنوان IP الحقيقي للعميل أولًا، وإلا ستحظر الـ Proxy نفسه ويتوقف موقعك.
الخطوة 5: أغلق XML-RPC إن لم تكن تستخدمه
xmlrpc.php واجهة برمجية قديمة للتحكم عن بُعد، وتسمح دالتها system.multicall للمهاجم بتجربة كلمات مرور كثيرة في طلب واحد، فتتجاوز الحدود البسيطة التي تُحسب لكل طلب. وما زالت بعض الأدوات تحتاج إليها، مثل بعض تطبيقات النشر على الهاتف وبعض ميزات Jetpack القديمة والإشعارات (Pingbacks). إن لم تكن تستخدم أيًّا منها فاحظرها على مستوى الخادم:
# Apache or LiteSpeed (.htaccess)
<Files xmlrpc.php>
Require all denied
</Files>
# Nginx (server block)
location = /xmlrpc.php {
deny all;
}
الحظر على مستوى الخادم أفضل من إعداد داخل إضافة، لأن الإضافة التي تعطّل XML-RPC تترك الطلب يشغّل PHP أولًا. وبعد التغيير تأكد أن الأدوات التي تعتمد عليها ما زالت تعمل.
الخطوة 6: ضع بوابة أمام wp-login.php
إذا كان عدد من يدخلون إلى الموقع قليلًا، يمكنك وضع مصادقة HTTP الأساسية أمام صفحة الدخول، فتصطدم البرامج الآلية بطلب كلمة مرور من الخادم ولا تصل إلى ووردبريس أصلًا.
# Create the password file outside the web root
htpasswd -c /home/user/.wp-login-htpasswd yourname
# .htaccess in the WordPress root
<Files wp-login.php>
AuthType Basic
AuthName "Restricted"
AuthUserFile /home/user/.wp-login-htpasswd
Require valid-user
</Files>
احمِ wp-login.php وحده، لا مجلد wp-admin كاملًا؛ فكثير من القوالب والإضافات تستدعي wp-admin/admin-ajax.php من الواجهة العامة، وإغلاق المجلد يعطّلها. وإذا كان فريقك يعمل من عناوين IP ثابتة، فالسماح لهذه العناوين وحدها بالوصول إلى صفحة الدخول أكثر صرامة.
وماذا عن تغيير رابط صفحة الدخول؟
نقل صفحة الدخول إلى مسار مخصص يقلل ضجيج السجلات من البرامج الآلية البسيطة، لكنه لا يحمي كلمة مرور ضعيفة، وقد تتعطل معه بعض الإضافات. استخدمه كإضافة مريحة فوق الخطوات السابقة، لا بديلًا عنها.
حافظ على الأساسيات
حدّث نواة ووردبريس والقوالب والإضافات باستمرار، فكثير من الاختراقات تأتي من إضافة بها ثغرة وليس من صفحة الدخول.
استخدم HTTPS في صفحة الدخول حتى لا تُرسل كلمات المرور نصًا واضحًا.
احتفظ بنسخ احتياطية منتظمة جرّبت استعادتها، حتى تستطيع استعادة الموقع إذا اختُرق.
راجع سجل الوصول مرة أخرى بعد أسبوع من التغييرات للتأكد من أن المحاولات تُرفض مبكرًا.
شغّل ووردبريس على IM HOST
تتضمن استضافة ووردبريس من IM HOST شهادة SSL مجانية وLiteSpeed Cache وتخزين NVMe ونسخًا احتياطية يومية مجانية طوال مدة الاشتراك. وإذا أردت تحكمًا كاملًا في قواعد Nginx والجدار الناري وfail2ban، فإن خادم Linux VPS يمنحك صلاحيات root كاملة على KVM مع حماية من هجمات DDoS. ويستطيع مهندسونا المتاحون على مدار الساعة مساعدتك في قراءة السجلات وتحديد الطبقات التي يحتاجها موقعك.
المزيد من مدونتنا
اكتشف المزيد من الأدلة العملية ورؤى الخدمات من فريق IM Host.
عرض كل المقالات