
دليل شامل لتعزيز أمان تثبيتات ووردبريس: يغطي تغييرات مستخدم المدير، فرض HTTPS، أمان الإضافات، صلاحيات الملفات، وتكوين الخادم للمواقع الثابتة للشركات.
تمت كتابة هذا المستند بهدف أن يكون مناسبًا لتطبيقات الويب المطورة باستخدام ووردبريس والتي لا تتفاعل مع المستخدمين. وهو مخصص بشكل أساسي لصفحات العلامات التجارية للشركات، وطرق العرض الثابتة المختلفة، وصفحات التوظيف، والمواقع المماثلة.
بالنسبة للمواقع الإلكترونية التي يسجل فيها المستخدمون ويستخدمون الموقع بحرية، مثل المجتمعات المفتوحة، قد لا تنطبق بعض العناصر في هذا المستند. يرجى أخذ ذلك في الاعتبار أثناء القراءة.
لا يتضمن هذا المستند جميع المحتويات اللازمة لتأمين ووردبريس.
ومع ذلك، فإنه يتضمن معلومات عامة ومفصلة إلى مستوى يسمح بإجراء تقييمات مخاطر أمنية والاستجابة للثغرات بناءً على الدليل.
إذا وجدت هذا مفيدًا، يرجى دعم المزيد من التحسينات عن طريق "نجمة"🌟.
عند تثبيت ووردبريس، يكون اسم المستخدم الافتراضي للمدير هو "admin" ما لم تقم بتغييره أثناء عملية الإعداد. اسم الحساب "admin" معروف على نطاق واسع، لذلك يجب تغييره إلى اسم مختلف. إذا استمررت في استخدام "admin" كاسم مستخدم للمدير، فقد يحاول المهاجم القيام بهجوم تخمين باستخدام "admin" للوصول إلى موقع ووردبريس الخاص بك.
إذا تمكن المهاجم من الوصول إلى حساب مدير ووردبريس، فسيكون لديه سيطرة كاملة على الموقع. يجب تغيير اسم المستخدم الافتراضي لمدير ووردبريس إلى اسم مختلف.
التدقيق:
المعالجة:
ملاحظة:
بشكل افتراضي، يحتوي ووردبريس على خمسة أدوار للمستخدمين - "المديرون" و"المحررون" و"المؤلفون" و"المساهمون" و"المشتركون"
تسمح لك هذه الأدوار بالتحكم في المهام التي يمكن للمستخدمين تنفيذها على موقعك من خلال تعيين الصلاحيات المناسبة. إذا لم تتم إدارة أدوار المستخدمين وصلاحياتهم بشكل صحيح، فقد يحصل المستخدمون على وصول غير ضروري إلى الوظائف الحيوية، مما يشكل خطرًا أمنيًا كبيرًا.
التدقيق:
المعالجة:
ملاحظة:
يتضمن ووردبريس ميزة تسجيل مستخدمين مدمجة. هذه الميزة معطلة افتراضيًا، ولكن يمكن تفعيلها بواسطة مدير.
إذا تم تمكين هذه الميزة، يمكن لأي شخص التسجيل وربما الوصول إلى لوحة تحكم ووردبريس، مما قد يؤدي إلى مشاكل أمنية. بالنسبة لمعظم المواقع التي ليست مخصصة للعمل كمجتمعات مفتوحة، فإن ميزة تسجيل المستخدمين غير ضرورية ويجب أن تبقى معطلة.
التدقيق:
باستخدام متصفح ويب

باستخدام curl
(response) HTTP/1.1 302 Moved Temporarily cache-control: no-cache, no-store, must-revalidate, max-age=0 content-type: text/html; charset=UTF-8 server: Apache content-length: 0 ... location: https://yourwordpress.com/wp-login.php?registration=disabled
**الإصلاح:**
- إذا كان تسجيل المستخدمين مفعّلاً، فقم بتعطيله.
- قم بإلغاء تحديد "يمكن لأي شخص التسجيل"

## 4. تأكد من تعطيل محرر ملفات الإضافات
إذا تمكن المهاجم من اختراق حساب مدير ووردبريس، يمكنه السيطرة الكاملة على موقعك.
يمكنه تحرير كود القوالب والإضافات من خلال ميزة "المحرر" المدمجة، وتحميل نصوص ضارة، وتشويه موقعك، وإرسال رسائل غير مرغوب فيها للمستخدمين، وغير ذلك.
الاختراقات الشائعة عبر هذه المحررات تشمل حقن SQL، واختراق SEO بالبريد العشوائي، واختراق SEO الياباني.
**التدقيق:**
- تحقق من تعطيل محرر الملفات.
- تحقق مما إذا كان يمكنك الوصول إلى المحرر عبر المظهر > المحرر أو الإضافات > محرر الإضافات.
**الإصلاح:**
- إذا كان محرر الملفات مفعّلاً، فقم بتعطيله باتباع الخطوات التالية:
1. قم بالوصول إلى ملف wp-config.php الخاص بك باستخدام مدير الملفات أو FTP
2. افتح ملف wp-config.php للتحرير.
3. انتقل إلى أسفل الملف (إذا كنت تستخدم wp-config.php الافتراضي).
4. حدد موقع السطر التالي:
`
/* هذا كل شيء، توقف عن التحرير! كتابة سعيدة. */
`
5. فوق هذا السطر، أضف الكود التالي:
`
define('DISALLOW_FILE_EDIT', true);
`
6. احفظ التغييرات وأغلق المحرر.
7. عد إلى لوحة تحكم ووردبريس الخاصة بك وتأكد من أن خيارات المحرر لم تعد متاحة.
## 5. تأكد من تعطيل الإضافات غير المستخدمة وغير الضرورية
تنشأ العديد من الثغرات الأمنية في ووردبريس من مشاكل أمان الإضافات.
الإضافات مفتوحة المصدر، مما يسهل على المهاجمين العثور على الثغرات واستغلالها.
من الضروري الحفاظ على تحديث الإضافات التي تستخدمها وتعطيل أي إضافات غير مستخدمة لمنع الاستغلال المحتمل.
**التدقيق:**
- تحقق من تعطيل الإضافات غير المستخدمة وغير الضرورية.
- تأكد من تعطيل الإضافات غير المستخدمة وغير الضرورية.
**الإصلاح:**
- قم بتعطيل أي إضافات غير مستخدمة وغير ضرورية باتباع الخطوات التالية:
**استخدام فحص الإضافات - PCP:**
- PCP: https://wordpress.org/plugins/plugin-check
1. قم بتثبيت وتفعيل فحص الإضافات (PCP):
- اذهب إلى لوحة تحكم ووردبريس الخاصة بك
- انتقل إلى الإضافات > إضافة جديد.
- ابحث عن "Plugin Check" وقم بالتثبيت والتفعيل.
2. قم بتشغيل فحص الإضافات:
- في لوحة تحكم ووردبريس، اذهب إلى قائمة فحص الإضافات.
- حدد الإضافات التي تريد فحصها وقم بتشغيل المسح.
3. تحليل نتائج المسح:
- سيقوم PCP بتحليل كود الإضافة وتقديم تقرير، بما في ذلك:
- الامتثال لمعايير الكود: مدى التزام الإضافة بمعايير الترميز الخاصة بووردبريس.
- المشاكل الأمنية: الثغرات المحتملة أو الكود الضار.
- مشاكل الأداء: تأثير الإضافة على أداء الموقع.
- مشاكل التوافق: ما إذا كانت الإضافة متوافقة مع الإضافات والقوالب الأخرى.
4. تحديد الإضافات المشبوهة:
- إذا سلط التقرير الضوء على ثغرات أمنية كبيرة، أو كود ضار، أو انتهاكات عديدة لمعايير الترميز، فمن المحتمل أن تكون الإضافة "مشبوهة".
- كن حذرًا من الإضافات التي تقوم بطلبات خارجية غير ضرورية أو تشغيل استعلامات قاعدة بيانات مفرطة.
5. حل المشكلات:
- قم بإصلاح المشكلات المحددة عن طريق التحديث أو العثور على المشكلات في صفحات الإضافات.
- تجنب استخدام الإضافات ذات المشاكل الأمنية الشديدة. ابحث عن إضافات بديلة عند الضرورة.
**إدارة الإضافات:**
1. اختيار الإضافات:
- استخدم المستودعات الرسمية، تحقق من التقييمات والمراجعات، تحقق من مصداقية المطور
- لا تستخدم إضافات غير معروفة أو غير موثقة.
2. التحديثات المنتظمة
- حافظ على تحديث الإضافات لضمان حصولك على أحدث التصحيحات الأمنية.
3. تعطيل وحذف الإضافات غير المستخدمة
- حتى الإضافات غير النشطة يمكن أن تشكل خطرًا أمنيًا، لذا قم بإزالتها إذا لم تكن مستخدمة.
- قلل من الإضافات: استخدم فقط الإضافات الأساسية
## 6. تأكد من تكوين ووردبريس لاستخدام HTTPS فقط، بما في ذلك لوحة تحكم ووردبريس
اليوم، تم تكوين معظم المواقع للعمل عبر SSL (HTTPS).
ومع ذلك، قد لا تزال بعض خوادم الويب مهيأة بشكل خاطئ للتعامل مع اتصالات HTTP و HTTPS معًا.
وهذا يمكن أن يسمح بالوصول إلى ووردبريس عبر كلا البروتوكولين، مما يشكل خطرًا أمنيًا. يجب إجبار ووردبريس، بما في ذلك لوحة تحكم ووردبريس، على استخدام HTTPS حصريًا.
**التدقيق:**
- تحقق من تكوين ووردبريس، بما في ذلك لوحة التحكم، ليكون قابلاً للوصول فقط عبر HTTPS.
- تحقق من تكوين VirtualHost لخادم الويب للتأكد من عدم وجود أي VirtualHosts لبروتوكول HTTP.
**الإصلاح:**
- إذا كان الوصول عبر HTTP ممكنًا، فقم أولاً بمراجعة وتعديل إعدادات خادم الويب.
- إذا كان الخادم يحتوي على VirtualHosts لـ HTTP، فقم إما بإعادة توجيهها إلى HTTPS أو حذف VirtualHosts الخاصة بـ HTTP.
- إذا لزم الأمر، قم بتمكين ميزة "FORCE_SSL_ADMIN" لفرض الوصول عبر HTTPS للوحة تحكم ووردبريس.
**خطوات تمكين FORCE_SSL_ADMIN:**
1. قم بالوصول إلى ملف wp-config.php الخاص بك باستخدام مدير الملفات أو FTP.
2. افتح ملف wp-config.php للتحرير.
3. انتقل إلى أسفل الملف (إذا كنت تستخدم wp-config.php الافتراضي).
4. حدد موقع السطر التالي:
`
/* هذا كل شيء، توقف عن التحرير! كتابة سعيدة. */
`
5. فوق هذا السطر، أضف الكود التالي:
`
define('FORCE_SSL_ADMIN', true);`
`
6. احفظ التغييرات وأغلق المحرر.
عد إلى لوحة تحكم ووردبريس الخاصة بك وقم بتسجيل الدخول مرة أخرى للتأكد من أن لوحة التحكم يمكن الوصول إليها فقط عبر HTTPS.
**إعادة توجيه HTTP إلى HTTPS على خادم الويب:**
1. لأباتشي:
```
<VirtualHost *:80>
ServerName yourwordpress.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
```
2. لـ Nginx:
```
server {
listen 80;
server_name yourwordpress.com;
location / {
return 301 https://$host$request_uri;
}
}
```
من خلال ضمان أن ووردبريس ولوحة التحكم يمكن الوصول إليها فقط عبر HTTPS، يمكنك تعزيز أمان موقعك بشكل كبير، وحماية البيانات ومنع الوصول غير المصرح به.
## 7. تأكد من تطبيق قيود الوصول حسب عنوان IP (ACL)
تحقق من تطبيق قيود الوصول حسب عنوان IP
لتشغيل ووردبريس بشكل آمن، من الضروري تطبيق قيود الوصول حسب عنوان IP على بعض عناوين URL، بما في ذلك لوحة تحكم ووردبريس، لمنع المستخدمين غير المرغوب فيهم وأجهزة الكمبيوتر والروبوتات من الوصول إليها. يتضمن ذلك السماح بالوصول فقط من عناوين IP المسموح بها، مثل عناوين IP الخاصة بالمسؤولين. بالإضافة إلى ذلك، من الضروري تعطيل الميزات غير المستخدمة لتقليل أسطح الهجوم.
تشمل عناوين URL التي يجب تأمينها: لوحة تحكم ووردبريس، تسجيل المستخدمين (wp-signup.php)، واجهة برمجة تطبيقات JSON REST، وميزة XML-RPC.
يستهدف هذا الدليل الأمني مواقع الويب الموجهة للخدمات مثل مدونات الشركات، وصفحات التوظيف، ومواقع العلامات التجارية، والمواقع الترويجية حيث يكون تفاعل المستخدم ضئيلاً ويتم عرض المحتوى بشكل أساسي.
من خلال تطبيق قيود الوصول حسب عنوان IP، يمكنك تقليل مخاطر الوصول غير المصرح به بشكل كبير وتعزيز الأمان العام لموقعك.
### 7.1. تأكد من تطبيق قيود الوصول حسب عنوان IP على لوحة تحكم ووردبريس.
مسار الوصول إلى لوحة تحكم ووردبريس ثابت في شكل wp-login.php أو /wp-admin، مما يجعله سهل الوصول للمستخدمين غير المصرح لهم.
تأكد من تطبيق قيود الوصول حسب عنوان IP لمنع الوصول غير المصرح به إلى صفحة الإدارة.
**التدقيق:**
- تحقق من تطبيق قيود الوصول حسب عنوان IP للوحة تحكم ووردبريس.
- في معظم الحالات، يتم تكوين ذلك على خادم الويب (Apache, Nginx).
**الإصلاح:**
- إذا لم يتم تطبيق قيود الوصول حسب عنوان IP، فقم بتطبيقها.
- فيما يلي طرق تطبيق قيود الوصول حسب عنوان IP باستخدام خوادم الويب Apache و Nginx.
**تطبيق قيود الوصول حسب عنوان IP على لوحة تحكم ووردبريس:**
- /wp-admin, wp-login.php
1. لأباتشي:
```
# توجيه الملفات
<Files "wp-login.php">
Require ip 10.10.77.49 # استبدل بعنوان IP الخاص بك
</Files>
# توجيه FilesMatch
<FilesMatch "^wp-login\.php$">
Require all granted
</FilesMatch>
# توجيه مزيج من الدليل والملفات
<Directory /www/vhosts/yourwordpress>
Require all granted
AllowOverride None
<Files "wp-login.php">
Require ip 10.10.77.49 # استبدل بعنوان IP الخاص بك
</Files>
</Directory>
# توجيه الموقع
<Location "/wp-admin">
Require ip 10.10.77.49 # استبدل بعنوان IP الخاص بك
</Location>
<Location "/wp-login.php">
Require ip 10.10.77.49 # استبدل بعنوان IP الخاص بك
</Location>
```
2. لـ Nginx:
```
location /wp-admin {
allow 10.10.77.49; # استبدل بعنوان IP الخاص بك
deny all;
}
location ~* \wp-login.php {
allow 10.10.77.49; # استبدل بعنوان IP الخاص بك
deny all;
}
```
### 7.2. تقييد الوصول حسب عنوان IP أو تعطيل ميزة واجهة برمجة تطبيقات JSON REST
يوفر ووردبريس وظيفتين لـ REST (xmlrpc, json rest api) ويتم تمكينهما افتراضيًا عند تثبيت ووردبريس.
توفر واجهة برمجة تطبيقات REST نقاط نهاية لأنواع بيانات ووردبريس، مما يسمح بالتفاعل عن بعد مع الموقع لمهام مثل الاستعلام عن المنشورات أو البيانات، وتعديل الموارد، والتحرير، والحذف.
بالنسبة لمعظم مواقع ووردبريس، ميزة واجهة برمجة تطبيقات REST ليست ضرورية.
قد يؤدي تمكينها إلى تعريض ووردبريس لهجمات DDoS ويمكن أن يؤدي إلى استهلاك الموارد وإبطاء الموقع.
**التدقيق:**
- تحقق من تمكين ميزة واجهة برمجة تطبيقات JSON REST. (الافتراضي: ممكّن)```
# curl -i -k https://yourwordpress.com/wp-json
(response)
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, max-age=0
content-type: text/html; charset=UTF-8
...
Server: Apache
{"name":"mywordress","description":"".......................
المعالجة:
تثبيت إضافة "تعطيل REST API" وتفعيلها:
تقييد الوصول عبر IP لواجهة JSON REST API:
<Location "/wp-json">
Require ip 10.10.77.49 # Replace with your IP address
</Location>
location ~ ^/wp-json/ {
allow 10.10.77.49; # Replace with your allowed IP address
deny all;
}
على غرار JSON REST API، يُنصح بتعطيل XML-RPC API لأنه غير مطلوب لمعظم تثبيتات ووردبريس.
إذا كانت REST API مطلوبة، فمن المستحسن استخدام JSON REST API بدلاً من ذلك.
لدى XML-RPC نقطتا ضعف رئيسيتان:
هجمات القوة الغاشمة:
هجمات حجب الخدمة عبر Pingback:
إذا تم تمكين XML-RPC، فلا يزال من الممكن استغلاله لمثل هذه الهجمات.
التدقيق:
(response) HTTP/1.1 405 Method Not Allowed Date: Mon, 25 Jun 2018 08:30:24 GMT Server: Apache Allow: POST Content-Length: 42 Content-Type: text/plain; charset=UTF-8
XML-RPC server accepts POST requests only.
**الإصلاح:**
- تعطيل ميزة XML-RPC باستخدام إضافة
**تثبيت إضافة "Disable XML-RPC-API"، تفعيلها:**
1. اذهب إلى لوحة تحكم ووردبريس الخاصة بك
2. انتقل إلى الإضافات > إضافة جديد.
3. ابحث عن "[Disable XML-RPC-API](https://wordpress.org/plugins/disable-xml-rpc-api/)" وقم بتثبيتها وتفعيلها.
4. تم الآن تعطيل XML-RPC-API.
**حول هجمات pingback عبر XML-RPC:**
1. تأكد من تمكين XML-RPC
```
# curl -i -k https://yourwordpress.com/xmlrpc.php
(response)
HTTP/1.1 405 Method Not Allowed
Date: Mon, 25 Jun 2018 08:30:24 GMT
Server: Apache
Allow: POST
Content-Length: 42
Content-Type: text/plain; charset=UTF-8
XML-RPC server accepts POST requests only.
```
2. البحث عن طرق XML-RPC المتاحة
```
(request)
POST /xmlrpc.php HTTP/1.1
Host: yourwordpress.com
Content-Length: 135
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
(response)
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, max-age=0
...
Server: Apache
Content-Length: 4272
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array><data>
<value><string>system.multicall</string></value>
<value><string>system.listMethods</string></value>
<value><string>system.getCapabilities</string></value>
<value><string>demo.addTwoNumbers</string></value>
<value><string>demo.sayHello</string></value>
<value><string>pingback.extensions.getPingbacks</string></value>
<value><string>pingback.ping</string></value>
<value><string>mt.publishPost</string></value>
...
<value><string>wp.getUsersBlogs</string></value>
</data></array>
</value>
</param>
</params>
</methodResponse>
```
3. تنفيذ pingbacks
- لم يتم وصف نجاح هجوم pingback وطرق التحقق المحددة.
```
(request)
POST /xmlrpc.php HTTP/1.1
Host: yourwordpress.com
Content-Length: 303
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param>
<value><string>call-back url for pingback result</string></value>
</param>
<param>
<value><string>https://yourwordpress.com/</string></value>
</param>
</params>
</methodCall>
(response)
HTTP/1.1 200 OK
...
Server: Apache
Content-Length: 370
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>0</int></value>
</member>
<member>
<name>faultString</name>
<value><string></string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
```
### 7.4. تعطيل WP-Cron أو تقييد الميزة
في ووردبريس، يتم استخدام WP-Cron (wp-cron.php) لأتمتة المهام مثل جدولة نشر المقالات، والتحقق من تحديثات الإضافات/القوالب، وإرسال رسائل البريد الإلكتروني للإشعارات.
يعمل WP-Cron بشكل أساسي عن طريق التحقق من قائمة المهام المجدولة في كل مرة يتم فيها تحميل صفحة.
تنشأ المشكلة عندما يكون هناك تحميل ثقيل للصفحات.
نظرًا لأن مهام WP-Cron تُنفذ مع كل تحميل صفحة، فإن الوصول المتكرر المتعدد يؤدي إلى استدعاءات WP-Cron المقابلة. وبالتالي، قد تصبح موارد النظام شحيحة، مما يتسبب في تباطؤ الموقع أو حتى توقفه.
هذا أمر حقيقي وغالبًا ما يتم استغلاله في هجمات الثغرات التي تستهدف ووردبريس.
إذا لم يكن WP-Cron ضروريًا، فمن المستحسن تعطيله.
إذا كان ضروريًا، قم بتقييد الوصول إلى المضيفين المحليين فقط.
**التدقيق:**
- تأكد من تمكين WP-Cron. (الافتراضي: ممكّن)```
# curl -i -k https://yourwordpress.com/wp-cron.php
(response)
HTTP/1.1 200 ok
Date: Mon, 25 Jun 2018 08:30:24 GMT
Server: Apache
Allow: POST
Content-Length: 42
Content-Type: text/plain; charset=UTF-8
المعالجة:
خطوات تعطيل WP-Cron:
/* That’s all, stop editing! Happy publishing. */define('DISABLE_WP_CRON', true);# Files Directive
<Files "wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Files>
# FilesMatch Directive
<FilesMatch "^wp-cron\.php$">
Require ip 127.0.0.1 # localhost only
</FilesMatch>
# Location Directive
<Location "/wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Location>
location = /wp-cron.php {
allow 127.0.0.1;
deny all;
access_log off;
log_not_found off;
}
خطوات تفعيل 'ALTERNATE_WP_CRON':
/* That’s all, stop editing! Happy publishing. */define( 'ALTERNATE_WP_CRON', true );# Files Directive
<Files "wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Files>
# FilesMatch Directive
<FilesMatch "^wp-cron\.php$">
Require ip 127.0.0.1 # localhost only
</FilesMatch>
# Location Directive
<Location "/wp-cron.php">
Require ip 127.0.0.1 # localhost only
</Location>
location = /wp-cron.php {
allow 127.0.0.1;
deny all;
access_log off;
log_not_found off;
}
مثال: استخدام Cron النظام (crontab):
.. ... */10 * * * * curl http://yourwordpress.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
*/10 * * * * cd /var/www/yourwordpress.com/htdocs; php /var/www/yourwordpress.com/htdocs/wp-cron.php?doing_wp_cron > /dev/null 2>&1
*/10 * * * * cd /var/www/example.com/htdocs; wp cron event run --due-now > /dev/null 2>&1
**حول تنفيذ هجوم رفض الخدمة (DoS) باستخدام wp-cron.php:**
- إرسال حجم كبير من الطلبات إلى ملف wp-cron.php
- يؤدي ذلك إلى استهلاك البرنامج النصي لكمية هائلة من الموارد، مما يؤدي في النهاية إلى تحميل الخادم فوق طاقته


## 8. تكوين النظام لـ WordPress آمن.
لضمان التشغيل الآمن لـ WordPress، يلزم وجود تكوين مناسب لخادم الويب وتقوية مكونات الواجهة الخلفية.
فيما يلي العديد من العناصر الأساسية التي يجب التحقق منها وتنفيذها.
### 8.1. التأكد من استخدام إصدارات WordPress وPHP غير المنتهية (غير EOL)
للحفاظ على تثبيت آمن لـ WordPress، من الضروري استخدام إصدارات من WordPress وPHP ليست في نهاية عمرها الافتراضي (EOL). الإصدارات المنتهية لم تعد مدعومة ولا تتلقى تحديثات أمنية، مما يترك موقعك الإلكتروني عرضة للمشكلات الأمنية غير المصححة.
استخدام الإصدارات المدعومة يضمن معالجة أي ثغرات أمنية مكتشفة على الفور، مما يحمي موقعك من الهجمات المحتملة. إليك ما عليك فعله للتحقق من إصدارات WordPress وPHP الخاصة بك وتحديثها:
**التدقيق:**
- تحقق من أن إصدارات WordPress وPHP الحالية لديك ليست منتهية (EOL).
**المعالجة:**
- قم بتثبيت وتشغيل إصدارات غير منتهية من WordPress وPHP.
- اعتبارًا من مايو 2024، إصدار WordPress المدعوم هو 6.5 وما فوق. إصدارات PHP المدعومة هي 8.1 و8.2 و8.3.
- إذا كنت تستخدم خدمة استضافة ويب، فاستفد من ميزات تبديل الإصدارات الخاصة بها لضمان تشغيل إصدارات مدعومة من كل من WordPress وPHP.
**حالة نهاية العمر (EOL) اعتبارًا من مايو 2024**
1. PHP: [supported-versions](https://www.php.net/supported-versions.php)
- الإصدارات المدعومة حاليًا: 8.1 و8.2 و8.3
2. WordPress: [current-releases](https://wordpress.org/download/releases/)
- الإصدارات المدعومة حاليًا: سلسلة 6.5
**مثال: PHP في RockyLinux 8.5**
- في RockyLinux 8.5، إصدارات PHP الافتراضية المتاحة هي 7.2 و7.3 و7.4.
```
# dnf module list php
Rocky Linux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
php 7.4 common [d], devel, minimal PHP scripting language
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
# dnf module enable php:7.4
==============================================================================================
Package Architecture Version Repository Size
==============================================================================================
Enabling module streams:
httpd 2.4
php 7.4
Transaction Summary
==============================================================================================
Is this ok [y/N]: y
Complete!
```
- لقد وصل PHP 7 بالفعل إلى نهاية عمره الافتراضي (EOL)؛ يُوصى بالترقية إلى PHP 8.
- يمكن تثبيت PHP 8 من مستودع REMI.
- فيما يلي مثال لكيفية تمكين وتثبيت PHP 8.2 باستخدام REMI:
```
# Install PHP 8.2 in Rocky Linux 8
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# dnf -y install yum-utils
# dnf module reset php
# dnf module install php:remi-8.2
Last metadata expiration check: 0:00:39 ago on Tue 13 Dec 2022 07:19:26 AM UTC.
Dependencies resolved.
=======================================================================================================================================
Package Architecture Version Repository Size
=======================================================================================================================================
Installing group/module packages:
php-cli x86_64 8.2.0-1.el8.remi remi-modular 5.4 M
php-common x86_64 8.2.0-1.el8.remi remi-modular 1.3 M
php-fpm x86_64 8.2.0-1.el8.remi remi-modular 1.9 M
php-mbstring x86_64 8.2.0-1.el8.remi remi-modular 574 k
php-xml x86_64 8.2.0-1.el8.remi remi-modular 254 k
Installing dependencies:
httpd-filesystem noarch 2.4.37-51.module+el8.7.0+1059+126e9251 appstream 41 k
libxslt x86_64 1.1.32-6.el8 baseos 249 k
oniguruma5php x86_64 6.9.8-1.el8.remi remi-safe 212 k
Installing weak dependencies:
nginx-filesystem noarch 1:1.14.1-9.module+el8.4.0+542+81547229 appstream 23 k
Installing module profiles:
php/common
Enabling module streams:
httpd 2.4
nginx 1.14
php remi-8.2
Transaction Summary
=======================================================================================================================================
Install 9 Packages
# dnf update
# dnf install php
Last metadata expiration check: 0:00:23 ago on Tue 13 Dec 2022 07:29:55 AM UTC.
Dependencies resolved.
=======================================================================================================================================
Package Architecture Version Repository Size
=======================================================================================================================================
Installing:
php x86_64 8.2.0-1.el8.remi remi-modular 1.8 M
Installing dependencies:
apr x86_64 1.6.3-12.el8 appstream 128 k
apr-util x86_64 1.6.1-6.el8.1 appstream 104 k
httpd x86_64 2.4.37-51.module+el8.7.0+1059+126e9251 appstream 1.4 M
httpd-tools x86_64 2.4.37-51.module+el8.7.0+1059+126e9251 appstream 108 k
libsodium x86_64 1.0.18-2.el8 epel 162 k
mailcap noarch 2.1.48-3.el8 baseos 38 k
mod_http2 x86_64 1.15.7-5.module+el8.6.0+823+f143cee1 appstream 153 k
rocky-logos-httpd noarch 86.3-1.el8 baseos 24 k
Installing weak dependencies:
apr-util-bdb x86_64 1.6.1-6.el8.1 appstream 23 k
apr-util-openssl x86_64 1.6.1-6.el8.1 appstream 26 k
php-opcache x86_64 8.2.0-1.el8.remi remi-modular 633 k
php-pdo x86_64 8.2.0-1.el8.remi remi-modular 166 k
php-sodium x86_64 8.2.0-1.el8.remi remi-modular 105 k
Transaction Summary
=======================================================================================================================================
Install 14 Packages
Total download size: 4.8 M
Installed size: 14 M
Is this ok [y/N]: y
# php -v
PHP 8.2.0 (cli) (built: Dec 6 2022 14:26:47) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.0, Copyright (c) Zend Technologies
with Zend OPcache v8.2.0, Copyright (c), by Zend Technologies
```
**ملاحظة:**
- للحصول على تعليمات مفصلة حول تثبيت PHP من مستودع REMI: [rpms.remirepo.net](https://rpms.remirepo.net/)
- وثائق حول توافق WordPress وPHP: [php-compatibility-and-wordpress-versions](https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/)
### 8.2. التأكد من تمكين إضافات PHP الضرورية فقط لـ WordPress
تأكد من تمكين إضافات PHP الضرورية فقط لموقع WordPress الخاص بك. يمكن للإضافات غير الضرورية أن تزيد من سطح الهجوم لموقعك وقد تعرض WordPress لثغرات أمنية. بتمكين الإضافات المطلوبة فقط، يمكنك تقليل المخاطر المحتملة وتحسين الأمان العام.
فيما يلي الإضافات المطلوبة لكي يعمل موقع WordPress بشكل صحيح. **(ليست قائمة لأغراض تقوية الأمان)**
| الإضافة | الوصف |
|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| json | تُستخدم للاتصالات مع الخوادم الأخرى ومعالجة البيانات بتنسيق JSON. |
| mysqli | يتصل بـ MySQL للتفاعل مع قاعدة البيانات. |
| curl | ينفذ عمليات الطلب عن بُعد. |
| dom | يُستخدم للتحقق من صحة محتوى أداة النص وتهيئة IIS7+ تلقائيًا. |
| exif | يعمل مع البيانات الوصفية المخزنة في الصور. |
| fileinfo | يُستخدم لاكتشاف نوع MIME لرفع الملفات. |
| hash | يُستخدم للتجزئة (hashing)، بما في ذلك كلمات المرور وحزم التحديث. |
| igbinary | يحسن الأداء كبديل مباشر للمُسلسل (serializer) القياسي في PHP. |
| imagick | يوفر جودة صورة أفضل لرفع الوسائط. راجع WP_Image_Editor للتفاصيل. تغيير حجم الصور بشكل أذكى (للحصول على صور أصغر) ودعم مصغرات PDF، عند توفر Ghost Script أيضًا. |
| intl | يمكّن العمليات الحساسة للموقع بما في ذلك على سبيل المثال لا الحصر: التنسيق، التحويل الصوتي (transliteration)، تحويل الترميز، عمليات التقويم، الترتيب المطابق (collation)، تحديد حدود النص، والعمل مع معرفات الموقع، المناطق الزمنية، والرموز الرسومية. |
| mbstring | يُستخدم للتعامل السليم مع نص UTF8. |
| openssl | اتصالات SSL بالمضيفين الآخرين. |
| pcre | يحسن أداء مطابقة الأنماط في عمليات البحث عن الكود. |
| xml | يُستخدم لتحليل XML، مثل من موقع طرف ثالث. |
| zip | يُستخدم لفك ضغط الإضافات والقوالب وحزم تحديث WordPress. |
| bc | للعمليات الحسابية الرياضية ذات الدقة التعسفية، والتي تدعم الأرقام من أي حجم ودقة تصل إلى 2147483647 رقمًا عشريًا. |
| filter | يُستخدم لتصفية إدخال المستخدم بشكل آمن. |
| image | إذا لم يكن Imagick مثبتًا، يتم استخدام مكتبة GD للرسومات كبديل محدود الوظائف لمعالجة الصور. |
| iconv | يُستخدم للتحويل بين مجموعات الأحرف. |
| shmop | Shmop مجموعة سهلة الاستخدام من الدوال التي تسمح لـ PHP بقراءة وكتابة وإنشاء وحذف مقاطع الذاكرة المشتركة في Unix. |
| simplexml | يُستخدم لتحليل XML. |
| sodium | يتحقق من صحة التوقيعات ويوفر وحدات بايت عشوائية آمنة. |
| xmlreader | يُستخدم لتحليل XML. |
| zlib | ضغط وفك ضغط Gzip. |
يمكن العثور على الإضافات الأساسية هنا: [WordPress Hosting Handbook: PHP Extensions](https://make.wordpress.org/hosting/handbook/server-environment/#php-extensions)
**التدقيق:**
- تحقق من تمكين إضافات PHP الضرورية فقط لموقع WordPress الخاص بك.
**المعالجة:**
- قم بإزالة أي إضافات غير ضرورية. في بعض الأحيان، يتم تثبيت الإضافات مع القوالب أو الإضافات الأخرى، وقد لا تكون مطلوبة لموقعك.
- للتحقق من إضافات PHP المُمكّنة حاليًا، يمكنك مراجعة ملف **php.ini** أو استخدام دالة **phpinfo()** لعرض جميع الإضافات النشطة.

- بعض الإضافات، إذا لم تكن ضرورية، يجب تعطيلها لمنع المشكلات الأمنية المحتملة.
- على سبيل المثال، الإضافات مثل exif وfileinfo وimap وsoap وpdo_sqlite وopcache يمكن استغلالها إذا بقيت مفعلة دون استخدام مناسب.
- إذا كنت تستخدم خدمة استضافة ويب، فإن العديد من المزودين يقدمون واجهات سهلة لتبديل إعدادات PHP، بما في ذلك تمكين أو تعطيل إضافات PHP. باستخدام هذه الميزات، يمكنك إدارة الإضافات بفعالية.
### 8.3. تأمين الإضافات التي تحتوي على ميزات رفع الملفات
يمكن أن تشكل الإضافات التي تحتوي على قدرات رفع الملفات خطرًا أمنيًا كبيرًا إذا لم يتم تأمينها بشكل صحيح. يمكن للثغرات الأمنية في وظائف رفع الملفات أن تسمح للمهاجمين برفع أغلفة الويب (web shells)، مما قد يؤدي إلى اختراق كامل للنظام. لذلك، من الضروري التأكد من أن أي وظيفة لرفع الملفات تتضمن آليات التحقق والتنظيف.
لماذا هذا مهم؟
1. التحقق من الامتداد:
- يجب على الخادم التحقق من امتدادات الملفات مقابل قائمة بيضاء للأنواع المسموح بها لمنع رفع الملفات الضارة.
2. فحص نوع MIME:
- يجب فحص نوع MIME للملف للتأكد من مطابقته للنوع المتوقع، مما يضيف طبقة أمان إضافية.
3. تقييد مسار الرفع:
- التأكد من عدم وجود مسارات مكشوفة تسمح بالوصول المباشر إلى الملفات المرفوعة دون تحقق.
تعتبر ثغرات رفع الملفات خطيرة بشكل خاص لأنها توفر مسارًا مباشرًا للمهاجمين لرفع كود قابل للتنفيذ وتشغيل أوامر عشوائية. غالبًا ما تكون ثغرات رفع الملفات أسهل في التحديد والاستغلال مقارنة بثغرات أمنية أخرى مثل حقن SQL.
**التدقيق:**
- تحديد الإضافات التي تحتوي على وظيفة رفع الملفات على موقع WordPress الخاص بك.
- التحقق من أن هذه الإضافات تنفذ عمليات التحقق المناسبة للملفات المرفوعة، بما في ذلك التحقق من الامتداد ونوع MIME.
**المعالجة:**
- إذا كانت إضافة تحتوي على وظيفة رفع ملفات تفتقر إلى التحقق المناسب، فإما تعزيز أمانها أو إزالة الإضافة.
- فيما يلي أمثلة على إضافات WordPress الشائعة التي تحتوي على ميزات رفع الملفات وكيفية تعاملها مع التحقق من الملفات.
**مثال: إضافات WordPress الشائعة مع معالجة رفع الملفات**
1. Contact Form 7
- Contact Form 7 هي واحدة من أكثر إضافات النماذج استخدامًا في WordPress. تتضمن وظيفة رفع ملفات أساسية مع التحقق من الامتداد ونوع MIME.**كود التحقق من الامتدادات المسموح بها ونوع MIME:**
```
function wpcf7_allowed_file_extensions() {
// Default allowed file extensions
$allowed_file_extensions = array(
'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx',
'xls', 'xlsx', 'txt', 'csv', 'rtf', 'html', 'zip'
);
return $allowed_file_extensions;
}
function wpcf7_handle_upload( $file ) {
$allowed_mime_types = wpcf7_allowed_file_extensions();
$file_type = wp_check_filetype( $file['name'] );
// Check if the file type is allowed
if ( ! in_array( $file_type['ext'], $allowed_mime_types ) ) {
return new WP_Error( 'wpcf7_upload_failed', __( 'File type is not allowed.', 'contact-form-7' ) );
}
// Handle the file upload
$upload = wp_handle_upload( $file, array( 'test_form' => false ) );
// Check if the upload was successful
if ( isset( $upload['error'] ) ) {
return new WP_Error( 'wpcf7_upload_failed', $upload['error'] );
}
return $upload;
}
```
في Contact Form 7، تقوم دالة `wpcf7_allowed_file_extensions()` بإرجاع قائمة بامتدادات الملفات المسموح بها،
وتقوم دالة `wpcf7_handle_upload()` بالتحقق مما إذا كان امتداد الملف موجودًا في هذه القائمة قبل متابعة التحميل.
2. WPForms
- يتعامل WPForms مع تحميل الملفات عن طريق التحقق من أنواع الملفات المسموح بها.
**مثال كود لـ WPForms:**
```
function wpforms_get_file_types() {
// Return an array of allowed file types
return array( 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx' );
}
function wpforms_process_file_upload( $file ) {
$allowed_file_types = wpforms_get_file_types();
$file_type = wp_check_filetype( $file['name'] );
if ( ! in_array( $file_type['ext'], $allowed_file_types ) ) {
return new WP_Error( 'wpforms_upload_failed', __( 'File type is not allowed.', 'wpforms' ) );
}
$upload = wp_handle_upload( $file, array( 'test_form' => false ) );
if ( isset( $upload['error'] ) ) {
return new WP_Error( 'wpforms_upload_failed', $upload['error'] );
}
return $upload;
}
```
3. WooCommerce
- يقوم WooCommerce أيضًا بتعريف والتحقق من الامتدادات المسموح بها مباشرة في كود معالجة التحميل الخاص به.
**مثال كود لـ WooCommerce:**
```
function woocommerce_handle_upload( $file ) {
$allowed_file_types = array( 'jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx' );
$file_type = wp_check_filetype( $file['name'] );
if ( ! in_array( $file_type['ext'], $allowed_file_types ) ) {
return new WP_Error( 'woocommerce_upload_failed', __( 'File type is not allowed.', 'woocommerce' ) );
}
$upload = wp_handle_upload( $file, array( 'test_form' => false ) );
if ( isset( $upload['error'] ) ) {
return new WP_Error( 'woocommerce_upload_failed', $upload['error'] );
}
return $upload;
}
```
**مثال: إضافة تحميل ملفات ضارة (Malicious fileupload Plugin)**
- قد تبدو إضافة ضارة (plugin) نقية ولكنها تستغل امتداد fileinfo لتجاوز فحوصات الأمان:
```
<?php
/*
Plugin Name: Simple Malicious Upload
Description: A plugin with hidden malicious file upload capability.
Version: 1.0
*/
function simple_file_upload_menu() {
add_menu_page('File Upload', 'File Upload', 'manage_options', 'file-upload', 'simple_file_upload_page');
}
add_action('admin_menu', 'simple_file_upload_menu');
function simple_file_upload_page() {
?>
<h1>File Upload</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="uploaded_file" />
<input type="submit" name="upload_file" value="Upload" />
</form>
<?php
if (isset($_POST['upload_file'])) {
simple_handle_file_upload();
}
}
function simple_handle_file_upload() {
if (!empty($_FILES['uploaded_file']['tmp_name'])) {
$file_tmp = $_FILES['uploaded_file']['tmp_name'];
$file_name = basename($_FILES['uploaded_file']['name']);
// Using fileinfo to check MIME type
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file_tmp);
finfo_close($finfo);
// Insecure handling: allows any PHP files to be uploaded
if ($mime_type === 'text/plain' || $mime_type === 'application/x-php') {
$upload_dir = wp_upload_dir();
$upload_file = $upload_dir['path'] . '/' . $file_name;
// Move the uploaded file to the uploads directory
if (move_uploaded_file($file_tmp, $upload_file)) {
echo "File uploaded successfully.";
} else {
echo "File upload failed.";
}
} else {
echo "Invalid file type.";
}
}
}
?>
```
**شرح الثغرة (Explanation of the Exploit):**
- تسمح الإضافة الضارة برفع ملفات PHP إذا كان نوع MIME الخاص بها هو `application/x-php.`
- يمكن للمهاجم رفع Web Shell بلغة PHP باستخدام هذه الوظيفة.
- بمجرد رفع الملف، يمكن للمهاجم الوصول إلى عنوان URL الخاص بالملف وتنفيذ أوامر عشوائية.
**مثال: كود PHP Web Shell (PHP Web Shell Code)**```
<?php
if (isset($_GET['cmd'])) {
echo "<pre>";
system($_GET['cmd']);
echo "</pre>";
}
?>
توضيح الهجوم
http://yourwordpress.com/wp-content/uploads/webshell.php.http://yourwordpress.com/wp-content/uploads/webshell.php?cmd=ls، يمكن للمهاجم تنفيذ أوامر عشوائية.ملاحظة:
يمكن أن يؤدي التأكد من تكوين دوال وإعدادات PHP بشكل صحيح إلى تعزيز أمان موقع ووردبريس الخاص بك بشكل كبير. يمكن أن تؤدي الإعدادات الخاطئة إلى تعريض موقعك لثغرات أمنية متنوعة، بما في ذلك تنفيذ الأكواد عن بُعد، كشف المعلومات، وخطف الجلسات. من الضروري تعزيز أمان PHP عن طريق تعطيل هذه الدوال أو تكوينها بشكل صحيح.
لماذا هذا مهم؟
تنفيذ الأكواد عن بُعد:
allow_url_fopen والدوال مثل exec إلى تمكين تنفيذ الأكواد عن بُعد، مما يؤدي إلى اختراق النظام المحتمل.كشف المعلومات:
display_errors و expose_php إلى تسريب معلومات حساسة حول إعدادات الخادم الخاص بك، مما يسهل على المهاجمين العثور على الثغرات الأمنية.أمان الجلسة:
session.cookie_secure و session.cookie_httponly، ملفات تعريف ارتباط الجلسة من الوصول إليها من خلال نصوص العميل أو نقلها عبر قنوات غير آمنة.التدقيق:
الإصلاح:
allow_url_fopen:
file_get_contents(), fopen(), include(), and require() استرداد البيانات من مواقع بعيدة عبر FTP أو HTTP.allow_url_fopen لميزات متنوعة.; (اختياري) تعطيل allow_url_fopen، إذا لم يكن ضرورياً
allow_url_fopen = Off
display_errors:
; تعطيل عرض أخطاء PHP على موقع ووردبريس الخاص بك
display_errors = Off
expose_php:
; منع كشف إصدار PHP في رؤوس استجابة HTTP
expose_php = Off
session.cookie_secure
session.cookie_secure:
; ضمان إرسال ملفات تعريف ارتباط الجلسة عبر HTTPS
session.cookie_secure = On
session.cookie_httponly
مثال: فيما يلي قائمة بدوال PHP المعطلة في موقع ووردبريس فعلي``` system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
### 8.5. ضمان تشغيل خادم الويب كمستخدم غير جذري - مستخدم ومجموعة فريدة وغير مميزة لتطبيق الخادم
في معظم الحالات، تعمل خوادم الويب كمستخدمين مثل "www-data" (ديبيان/أوبونتو) أو "apache" (RHEL/CentOS).
هؤلاء المستخدمون عبارة عن حسابات خدمة مخصصة بدون صلاحيات خاصة على الخادم، ويستخدمون لتعيين المستخدم والمجموعة التي ستفترضها عمليات عمال خادم الويب.
إذا كان لدى هؤلاء المستخدمين صلاحيات نظامية أو كانوا يعملون كجذر، فيجب تغيير ذلك.
**التدقيق:**
- تحقق من المستخدم الذي يقوم بتشغيل عملية خادم الويب. (تحديدًا، إنها عملية عامل خادم الويب.)
1. لأباتشي:
```
# ps -ef | grep httpd
root 2257 1 0 Apr08 ? 00:00:01 /usr/local/apache/bin/httpd -k start
apache 5678 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
apache 5679 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
apache 5680 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
apache 5681 1234 0 Apr08 ? 00:00:00 /usr/sbin/httpd -k start
```
2. لـ Nginx:
```
# ps -ef | grep nginx
root 626653 1 0 Apr08 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 626654 626653 0 Apr08 ? 00:00:00 nginx: worker process
nginx 626655 626653 0 Apr08 ? 00:00:00 nginx: worker process
nginx 626656 626653 0 Apr08 ? 00:00:00 nginx: worker process
nginx 626657 626653 0 Apr08 ? 00:00:00 nginx: worker process
```
**الإصلاح:**
- يجب تشغيل خادم الويب كحساب غير مميز ومخصص.
- في معظم الحالات، يتم استخدام أحد هذه الحسابات الشائعة مثل "www-data" أو "apache" أو "nginx" أو "nobody" أو "daemon".
1. لأباتشي:
```
# vim /etc/httpd/httpd.conf
..
...
User www-data
Group www-data
..
...
```
2. لـ Nginx:
```
# vim /etc/nginx/nginx.conf
..
...
user daemon;
```
**ملاحظة:**
- لا ينبغي أن يتمتع مستخدمو عمليات خادم الويب بصلاحيات تسجيل دخول عبر الصدفة. ```
# cat /etc/passwd | grep -i www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
تم بناء WordPress باستخدام PHP، لذا فإن تهيئة النظام الصحيحة ضرورية لتنفيذ كود PHP بشكل صحيح.
يتم إدارة تنفيذ كود PHP في WordPress بواسطة PHP-FPM، وهو مدير عمليات FastCGI. لضمان التشغيل الآمن لـ PHP-FPM، يجب تشغيله تحت حساب خدمة مخصص وغير مميز.
بشكل عام، يتم تعيين حساب عملية خادم الويب وحساب PHP-FPM على نفس الحساب. ومع ذلك، لتعزيز الأمان، من الأفضل تشغيلهما تحت حسابات منفصلة.
فيما يلي سببان:
عزل العمليات:
مبدأ الامتياز الأقل:
التدقيق:
root 1234 1 0 12:00 ? 00:00:01 php-fpm: master process (/etc/php-fpm.conf) php-fpm 5678 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5679 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5680 1234 0 12:00 ? 00:00:00 php-fpm: pool www php-fpm 5681 1234 0 12:00 ? 00:00:00 php-fpm: pool www
**الإصلاح:**
- يجب تشغيل PHP-FPM كحساب مخصص غير مميز.
- في معظم الحالات، الحساب المستخدم هو "php-fpm".
**تغيير حساب العملية لـ PHP-FPM:**```
# vim /etc/php-fpm.d/www.conf # Adjust the path based on your PHP version
...
user = php-fpm
group = php-fpm
listen.owner = php-fpm
listen.group = php-fpm
يجب ألا يكون لحساب عملية PHP-FPM صلاحيات تسجيل الدخول عبر shell.```
php-fpm❌999:999:PHP-FPM:/run/php:/usr/sbin/nologin
**ملاحظة:**
- يُفضل استخدام حسابات مستخدمين مختلفة لعمليات PHP-FPM وعمليات خادم الويب من منظور أمني.
- عند السؤال عن أيها أفضل للأمان، يجب أن تكون مختلفة. تجنب استخدام نفس حساب التنفيذ في هذا السياق.
### 8.7. ضمان التكوين الآمن لدليل ووردبريس الرئيسي
لتشغيل خادم ويب بشكل آمن، من الضروري تكوين ملكية وصلاحيات دليل ووردبريس الرئيسي بشكل صحيح.
في معظم الحالات، يتم تعيين ملكية وصلاحيات ملفات وأدلة ووردبريس لتتطابق مع حساب عملية خادم الويب.
يسمح هذا التكوين لخادم الويب بالوصول إلى الملفات في جذر الويب والعمل دون أخطاء.
ومع ذلك، فإن هذا التكوين غير آمن.
على سبيل المثال، إذا كانت عملية خادم الويب هي 'apache' وكل من دليل جذر الويب والملفات مملوكة لـ 'apache'، فقد يؤدي ذلك إلى ثغرات أمنية خطيرة.
يمكن للمهاجمين استغلال هذه الثغرات للحصول على وصول غير مصرح به إلى الملفات والأدلة الحساسة داخل دليل ووردبريس الرئيسي.
**مثال شائع للثغرة:**
- إذا كان كل من حساب عملية خادم الويب والدليل الرئيسي (جذر الويب) والملفات مملوكة لـ 'apache':
- في حالة وجود ثغرات في الموقع الإلكتروني ووصول خارجي إلى النظام (مثل webshell)، يمكن للمهاجمين تنفيذ إجراءات متنوعة داخل جذر الويب:
1. إنشاء، أو تعديل، أو حذف الملفات أو الأدلة داخل جذر الويب.
2. التلاعب بسجلات الوصول إلى الويب، بما في ذلك التعديل أو الحذف أو الإنشاء. (باستثناء بعض البيئات)
3. يمكن الحصول على الوصول إلى ملفات تعريف الارتباط النشطة للجلسات للمستخدمين المسجلين. (في البيئات المعرضة للخطر بشكل خاص)
لتخفيف هذه المخاطر، من الضروري تعديل ملكية وصلاحيات دليل ووردبريس الرئيسي بشكل صحيح.
**المعالجة:**
- تعيين مالك الدليل الرئيسي (جذر الويب) والملفات إلى 'root:root'. (تجنب تعيينه ليكون نفس حساب عملية خادم الويب)
- قيمة UMASK الافتراضية للأدلة والملفات هي 022. (الأدلة: 755، الملفات: 644)
- بالنسبة للأدلة التي تتطلب صلاحيات الكتابة مثل رفع الملفات بواسطة خدمة الويب، قم بتعيين مالك تلك الأدلة إلى حساب عملية خادم الويب.
**الأدلة التي تتطلب صلاحيات كتابة بشكل عام في ووردبريس:**```
/wp-content/uploads
/wp-content/cache
/wp-content/wflogs (when using security plugins like Wordfence)
/wp-content/upgrade (used during the WordPress upgrade process)
بعد تكوين ملكية وصلاحيات الدليل الرئيسي وفقًا لإجراءات التصحيح المذكورة أعلاه، يكون مخرجات الدليل الرئيسي لووردبريس كما يلي:
مثال: دليل ووردبريس الرئيسي``` drwxr-xr-x 5 root root 4096 May 27 2024 . drwxr-xr-x 3 root root 4096 May 27 2024 .. -rw-r--r-- 1 root root 418 May 27 2024 index.php -rw-r--r-- 1 root root 19935 May 27 2024 license.txt -rw-r--r-- 1 root root 7346 May 27 2024 readme.html -rw-r--r-- 1 root root 7106 May 27 2024 wp-activate.php drwxr-xr-x 9 root root 4096 May 27 2024 wp-admin -rw-r--r-- 1 root root 351 May 27 2024 wp-blog-header.php -rw-r--r-- 1 root root 2328 May 27 2024 wp-comments-post.php -rw-r--r-- 1 root root 4973 May 27 2024 wp-config-sample.php -rw-r--r-- 1 root root 2755 May 27 2024 wp-config.php drwxr-xr-x 8 root root 4096 May 27 2024 wp-content -rw-r--r-- 1 root root 3940 May 27 2024 wp-cron.php drwxr-xr-x 25 root root 12288 May 27 2024 wp-includes -rw-r--r-- 1 root root 2496 May 27 2024 wp-links-opml.php -rw-r--r-- 1 root root 3300 May 27 2024 wp-load.php -rw-r--r-- 1 root root 51556 May 27 2024 wp-login.php -rw-r--r-- 1 root root 8403 May 27 2024 wp-mail.php -rw-r--r-- 1 root root 24568 May 27 2024 wp-settings.php -rw-r--r-- 1 root root 30869 May 27 2024 wp-signup.php -rw-r--r-- 1 root root 4620 May 27 2024 wp-trackback.php -rw-r--r-- 1 root root 3065 May 27 2024 xmlrpc.php
**في حالة اختلاف حسابات عملية php-fpm وخادم الويب (أذونات منفصلة)**
إذا كان حساب عملية خادم الويب هو "apache" وكان حساب عملية php-fpm هو "php-fpm".
قم بتغيير أذونات المجلدات التي تتطلب إذن الكتابة في WordPress (مثل /wp-content/uploads).
- المالك: php-fpm
- المجموعة: apache
- أذونات المجلد: 775 (755 إذا لزم الأمر)
**هيكل الملفات والمجلدات**
تعيين أذونات الكتابة للمجلدات الضرورية بحيث يمكن لكل من حسابات "php-fpm" و"apache" الكتابة.```
ex) /service/wordpress/www
├── index.php (root:root, 644)
├── license.txt (root:root, 644)
├── readme.html (root:root, 644)
├── wp-activate.php (root:root, 644)
├── wp-admin/ (root:root, 755)
├── wp-blog-header.php (root:root, 644)
├── wp-comments-post.php (root:root, 644)
├── wp-config-sample.php (root:root, 644)
├── wp-config.php (root:root, 644)
├── wp-content/ (root:root, 755)
│ ├── plugins/ (root:root, 755)
│ ├── themes/ (root:root, 755)
│ ├── uploads/ (php-fpm:apache, 775)
│ │ ├── 2024/ (php-fpm:apache, 775)
│ │ └── ... (php-fpm:apache, 775)
│ └── ... (root:root, 755)
├── wp-cron.php (root:root, 644)
├── wp-includes/ (root:root, 755)
├── wp-links-opml.php (root:root, 644)
├── wp-load.php (root:root, 644)
├── wp-login.php (root:root, 644)
├── wp-mail.php (root:root, 644)
├── wp-settings.php (root:root, 644)
├── wp-signup.php (root:root, 644)
├── wp-trackback.php (root:root, 644)
└── xmlrpc.php (root:root, 644)
ملخص
من خلال الإعداد بهذه الطريقة، يمكنك فصل صلاحيات خادم الويب وPHP-FPM، وتطبيق إعدادات الملكية والصلاحيات بشكل صحيح للدليل الرئيسي، وتعزيز الأمان.
تنطبق هذه الطريقة ليس فقط على ووردبريس ولكن على أي هيكل خادم ويب يخدم محتوى الويب.
ضمان تعطيل تنفيذ PHP في الأدلة التي يمكن رفع الملفات فيها أمر بالغ الأهمية للحفاظ على بيئة آمنة.
أدلة الرفع ذات صلاحيات الكتابة هي أهداف محتملة للمهاجمين لرفع نصوص ضارة، مثل web shells، والتي يمكن تنفيذها لاختراق الخادم.
لماذا يعتبر هذا مهمًا؟
التخفيف من هجمات Web Shell:
تقليل سطح الهجوم:
الامتثال لأفضل ممارسات الأمان:
التدقيق:
الإصلاح:
/wp-content/uploads.خطوات التكوين
<Location "/wp-content/uploads">
SetHandler application/octet-stream
</Location>
location /wp-content/uploads {
default_type application/octet-stream;
}
<Location "/wp-content/uploads">
php_flag engine off
# أو بدلاً من ذلك
php_value engine 0
</Location>
<Location "/wp-content/uploads">
<FilesMatch "\.php$">
SetHandler none
Require all denied
</FilesMatch>
</Location>
<Directory "/var/www/html/yourwordpress/wp-content/uploads">
# تعطيل تنفيذ PHP
<FilesMatch "\.php$">
SetHandler none
Require all denied
</FilesMatch>
</Directory>
location /wp-content/uploads {
location ~ \.php$ {
fastcgi_pass off;
}
}
location /wp-content/uploads {
location ~ \.php$ {
deny all;
}
}
تضمن هذه التكوينات أنه حتى إذا تم رفع ملف PHP إلى دليل /wp-content/uploads، فلن يتمكن من التنفيذ، وبالتالي منع الهجمات المحتملة.
شرح توجيهات التكوين
SetHandler application/octet-stream:
php_flag engine off / php_value engine 0:
SetHandler none:
ملاحظة:
/wp-content/uploads قابلاً للوصول وعرضه بشكل صحيح باستخدام وسم :```
من خلال تطبيق هذه الإعدادات، يمكنك تعزيز دليل التحميل بشكل كبير ضد ثغرات تنفيذ البرامج النصية المحتملة.
### 8.9. تأكد من أن خادم الويب يستجيب فقط لرؤوس المضيف المستندة إلى النطاق
لتأمين خادم الويب الخاص بك، من الضروري التأكد من أنه يستجيب فقط للطلبات الموجهة إلى اسم النطاق الخاص بك وليس للطلبات المقدمة مباشرة إلى عنوان IP الخاص بالخادم.
يمكن تحقيق ذلك من خلال التكوين المناسب لتوجيهات VirtualHost.
في معظم الحالات، يتم الوصول إلى خدمات الويب عبر اسم نطاق، مثل `https://yourwordpress.com`. يستقبل خادم الويب هذا الطلب ويقدم المحتوى المناسب. لفرض هذا السلوك، نحتاج إلى تكوين خادم الويب للاستجابة فقط للطلبات التي تحتوي على رأس المضيف الصحيح.
**المخاطر الأمنية المحتملة للسماح بالوصول القائم على عنوان IP**
1. تعداد الخدمات:
- يمكن للمهاجمين استخدام عناوين IP لتعداد الخدمات قيد التشغيل على الخادم، مما يزيد من خطر اكتشاف الثغرات واستغلالها.
2. كشف المعلومات الحساسة:
- قد تكشف الخوادم غير المهيأة بشكل صحيح عن الأدلة أو الملفات أو غيرها من المعلومات الحساسة عند الوصول إليها عبر IP، والتي لا ينبغي أن تكون متاحة للجمهور.
3. تجاوز ضوابط الأمان:
- قد يتجاوز الوصول القائم على IP الإجراءات الأمنية التي يتم تطبيقها فقط للوصول القائم على النطاق، مما قد يؤدي إلى وصول غير مصرح به.
**التدقيق:**
- تحقق من أن خادم الويب مهيأ للاستجابة فقط للطلبات القائمة على النطاق وليس للوصول المباشر عبر عنوان IP.
**المعالجة:**
- قم بتكوين خادم الويب للتعامل مع الطلبات بناءً على النطاق المحدد فقط ورفض أو إعادة توجيه الطلبات الأخرى بشكل مناسب.
**خطوات التكوين**
1. تكوين VirtualHost الافتراضي
- قم بإنشاء VirtualHost افتراضي يلتقط جميع الطلبات غير المحددة ويعيد رمز 403 ممنوع أو يعيد توجيهها.
**لـ Apache:**
```
<VirtualHost _default_:80>
DocumentRoot /var/www/html/yourwordpress
...
<Location />
Require all denied
</Location>
<VirtualHost _default_:443>
DocumentRoot /var/www/html/yourwordpress
...
SSLEngine on
SSLCertificateFile /path/to/ssl/certificate.crt;
SSLCertificateKeyFile /path/to/ssl/private.key;
...
<Location />
Require all denied
</Location>
</VirtualHost>
```
**لـ Nginx:**
```
server {
listen 80 default_server;
return 403;
}
server {
listen 443 ssl default_server;
...
ssl_certificate /path/to/ssl/certificate.crt;
ssl_certificate_key /path/to/ssl/private.key;
...
return 403;
}
```
2. تكوين VirtualHost القائم على النطاق
- تأكد من وجود VirtualHost مهيأ لنطاقك.
**لـ Apache:**
```
<VirtualHost *:80>
ServerName yourwordpress.com
...
Redirect permanent / https://yourwordpress.com/
</VirtualHost>
<VirtualHost *:443>
ServerName yourwordpress.com
DocumentRoot /var/www/html/yourwordpress
...
SSLEngine on
SSLCertificateFile /etc/httpd/to/ssl/certificate.crt;
SSLCertificateKeyFile /etc/httpd/to/ssl/private.key;
...
</VirtualHost>
```
**لـ Nginx:**
```
server {
listen 443 ssl;
server_name yourwordpress.com;
root /var/www/html/wordpress;
...
ssl_certificate /path/to/ssl/certificate.crt;
ssl_certificate_key /path/to/ssl/private.key;
...
```
3. الاختبار
- فيما يلي إنشاء VirtualHost الافتراضي وVirtualHost القائم على النطاق لـ `yourwordpress.com`.
- بعد إنشاء VirtualHost الافتراضي وVirtualHost القائم على النطاق لـ `yourwordpress.com`، يتم رفض الوصول (خطأ 403) للطلبات غير القائمة على النطاق (https://ip)، مما يؤدي إلى ظهور شاشة خطأ 403.
```
$ curl -i -k http(s)://10.10.66.88
HTTP/1.1 403 Forbidden
Server: nginx
Date: Mon, 03 Jun 2024 23:23:13 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
$ curl -i -k https://yourwordpress.com
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 03 Jun 2024 23:32:12 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 9
Connection: keep-alive
Hello, yourwordpress.com
```
- إذا كانت هناك حاجة للاتصال بين الخوادم أو الاتصال داخل نفس الشبكة الفرعية IP، يمكنك تكوين VirtualHost الافتراضي للسماح بالوصول من عناوين IP محددة.
من خلال تطبيق هذه التكوينات، يستجيب خادم الويب فقط للطلبات الموجهة إلى نطاقك.
### 8.10. تكوين خادم الويب المكتمل
فيما يلي مثال لتكوين خادم ويب مكتمل يتضمن الإرشادات الأمنية. قم بتعديل هذا التكوين واستخدامه وفقًا لبيئة خادم ووردبريس الخاصة بك.
1. Apache
```
<VirtualHost _default_:80>
DocumentRoot /var/www/html/yourwordpress
ErrorLog /var/log/httpd/http.ip.error.log
CustomLog /var/log/httpd/http.ip.access.log combined
<Location />
Require all denied
</Location>
<VirtualHost _default_:443>
DocumentRoot /var/www/html/current/public
ErrorLog /var/log/httpd/https.ip.error.log
CustomLog /var/log/httpd/https.ip.access.log combined
# SSL Configuration
SSLEngine on
SSLCertificateFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.crt
SSLCertificateKeyFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.key
SSLSessionTimeout 1d
SSLSessionCache shared:MozSSL:10m
SSLSessionTickets off
SSLProtocol TLSv1.2 TLSv1.3
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
<Location />
Require all denied
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName yourwordpress.com
Redirect permanent / https://yourwordpress.com/
</VirtualHost>
<VirtualHost *:443>
ServerName yourwordpress.com
Protocols h2 http/1.1
DocumentRoot /var/www/html/current/public
ErrorLog /var/log/httpd/https.yourwordpress.com.error.log
CustomLog /var/log/httpd/https.yourwordpress.com.access.log combined
# SSL Configuration
SSLEngine on
SSLCertificateFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.crt
SSLCertificateKeyFile /etc/httpd/conf.d/cert/yourwordpress.com_ssl.key
SSLSessionTimeout 1d
SSLSessionCache shared:MozSSL:10m
SSLSessionTickets off
SSLProtocol TLSv1.2 TLSv1.3
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
<Directory /var/www/html/current/public>
Options -Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Deny PHP execution in uploads directory
<Directory "/var/www/html/current/public/wp-content/uploads">
<FilesMatch "\.php$">
SetHandler none
Require all denied
</FilesMatch>
</Directory>
# PHP Serving
ProxyPassMatch ^/(?!wp-content/uploads/.*\.php$)(.*\.php(/.*)?)$ unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost/var/www/html/current/public
#ProxyPassMatch ^/(?!wp-content/uploads/.*\.php$)(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/current/public
# Favicon
<Location "/favicon.ico">
ErrorDocument 404 "Not Found"
SetEnvIf Request_URI "^/favicon\.ico$" no_log
</Location>
# Robots.txt
<Location "/robots.txt">
Require all granted
SetEnvIf Request_URI "^/robots\.txt$" no_log
</Location>
# Restrict access to wp-cron.php
<Files "wp-cron.php">
Require all denied
Require ip 127.0.0.1
</Files>
# Restrict access to wp-json
<Location "/wp-json/">
Require all denied
Require ip 127.0.0.1
Require ip 10.10.77.49
Require ip 10.10.71.20
</Location>
# Restrict access to wp-admin
<Location "/wp-admin">
Require all denied
Require ip 10.10.77.49
Require ip 10.10.71.20
</Location>
<Files "wp-login.php">
Require all denied
Require ip 10.10.77.49
Require ip 10.10.71.20
</Files>
# Deny access to hidden files
<FilesMatch "^\.">
Require all denied
</FilesMatch>
</VirtualHost>
```
2. Nginx
```
server {
listen 80 default_server;
listen 443 default_server ssl http2;
error_log /var/log/nginx/http.ip.error.log;
access_log /var/log/nginx/http.ip.access.log main;
ssl_certificate /etc/nginx/conf.d/cert/yourwordpress.com_ssl.crt;
ssl_certificate_key /etc/nginx/conf.d/cert/yourwordpress.com_ssl.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
location / {
deny all;
}
}
server {
listen 443 ssl http2;
server_name yourwordpress.com;
root /var/www/html/wordpress;
error_log /var/log/nginx/https.yourwordpress.com.error.log;
access_log /var/log/nginx/https.yourwordpress.com.access.log main;
ssl_certificate /etc/nginx/conf.d/cert/yourwordpress.com_ssl.crt;
ssl_certificate_key /etc/nginx/conf.d/cert/yourwordpress.com_ssl.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Restrict to access Wordpress Cron
location = /wp-cron.php {
allow 127.0.0.1;
deny all;
access_log off;
log_not_found off;
}
# Restrict to access json rest-api
location ~ ^/wp-json/ {
allow 127.0.0.1; # Allow localhost
allow 10.10.77.49; # Allow myip
allow 10.10.71.20; # Allow myip
deny all;
access_log off;
log_not_found off;
}
# Restrict to access Wordpress Admin
location = /wp-admin {
allow 10.10.77.49; # Allow myip
allow 10.10.71.20; # Allow myip
deny all;
}
location ~* \wp-login.php {
allow 10.10.77.49; # Allow myip
allow 10.10.71.20; # Allow myip
deny all;
}
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
location ~ /\. {
deny all;
}
# Deny access to any files with a .php extension in the uploads directory
location /wp-content/uploads {
location ~ \.php$ {
deny all;
}
}
# Other example
# location ~* /(?:uploads|files)/.*\.php$ {
# deny all;
# }
# Rewrite rules, sends everything through index.php and keeps the appended query string intact
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# Serving PHP
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\\.php)(/.+)$;
# fastcgi_pass 127.0.0.1:9000; # With php-cgi (or other tcp sockets):
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # With php-fpm (or other unix sockets):
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
```
## 9. تأمين تحديثات ووردبريس
يعالج ووردبريس الثغرات الأمنية عن طريق إصدار إصدارات تحديث جديدة عند اكتشاف الثغرات.
على سبيل المثال، إذا تم العثور على ثغرة أمنية في ووردبريس 6.5.2، فسيتم معالجتها وتوزيعها في الإصدار 6.5.3.
نظرًا لأن التحديثات الأمنية لا تتم إدارتها على أساس كل إصدار على حدة، فإن التحديثات المنتظمة للإصدارات ضرورية لمعالجة الثغرات الأمنية.
راجع معلومات الإصدار الرسمي لووردبريس للحصول على التحديثات:
[إصدارات ووردبريس](https://wordpress.org/download/releases/)
**المعالجة:**
- قم بتحديث ووردبريس بانتظام.
- لا يدير ووردبريس التحديثات (بما في ذلك التحديثات الأمنية) على أساس كل إصدار على حدة.
- اعتبارًا من 20 مايو 2024، الإصدار 6.5 فقط هو قيد الصيانة.
**ملاحظة:**
- لا يتم دعم إصدارات Beta أو Nightly builds أو أي مخرجات Subversion أخرى.
- تجنب استخدام المنتجات المشتقة أو الإصدارات غير الرسمية لووردبريس.
- وثائق الإصدارات المدعومة: [الإصدارات المدعومة](https://wordpress.org/documentation/article/supported-versions/)
## 10. إجراء فحوصات أمنية منتظمة للثغرات في ووردبريس
ووردبريس هو برنامج نظام إدارة محتوى (CMS).
نظرًا لأنه برنامج معبأ، تحدث الثغرات الأمنية بشكل أساسي في مكوناته (الملفات الأساسية، الإضافات، القوالب، إلخ).
على عكس تطبيقات الويب المطورة خصيصًا لتلبية متطلبات محددة، يجب تحديد الثغرات الأمنية ومعالجتها باستخدام طرق مناسبة لووردبريس.
إذا لم يتم تخصيص موقع ويب مبني على ووردبريس بشكل كبير واحتفظ بطبيعة ووردبريس، فيمكن فحص الثغرات الأمنية بسهولة باستخدام WPScan.
WPScan هو برنامج مدفوع جزئيًا، لكن الطبقة الأساسية المجانية ليس لها قيود وظيفية. يتيح الفحص المنتظم والاستجابة للثغرات الأمنية في ووردبريس.
**المعالجة:**
- قم بإجراء فحوصات الثغرات بانتظام باستخدام WPScan (أو أدوات مماثلة يمكنها فحص ووردبريس).
- إذا تم العثور على ثغرات، تحقق منها وقم بتنفيذ الإجراءات اللازمة لإزالتها. في معظم الحالات، يتم حل ذلك من خلال التحديثات.
- راجع [وثائق مستخدم WPScan](https://github.com/wpscanteam/wpscan/wiki/WPScan-User-Documentation).
- مزيد من المعلومات حول الثغرات الشائعة التي توجد غالبًا في ووردبريس: [توسيع الثغرات الأمنية الشائعة في ووردبريس](https://learn.wordpress.org/tutorial/extending-wordpress-common-security-vulnerabilities/)
**WPScan:**```
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.8.22
Sponsored by Automattic - https://automattic.com/
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[+] URL: https://yourwordpress.com/ [192.168.10.100]
[+] Started: Fri May 24 14:39:06 2024
Interesting Finding(s):
[+] Headers
..
...
| - content-security-policy: upgrade-insecure-requests
| Found By: Headers (Passive Detection)
| Confidence: 100%
..
...
[+] XML-RPC seems to be enabled: https://yourwordpress.com/xmlrpc.php
| Found By: Link Tag (Passive Detection)
| Confidence: 30%
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner/
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos/
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login/
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access/
..
...
[+] Finished: Fri May 24 14:39:48 2024
[+] Requests Done: 187
[+] Cached Requests: 7
[+] Data Sent: 56.32 KB
[+] Data Received: 605.595 KB
[+] Memory used: 276.602 MB
[+] Elapsed time: 00:00:42
| الرقم | الدور | الوصف | طاقم الإدارة |
|---|
| 1 | مدير | لديه وصول كامل إلى جميع ميزات ووردبريس ويمكنه إدارة جميع المحتويات على الموقع. | مدراء النظام |
| 2 | محرر | يمكنه إدارة ونشر منشورات المستخدمين الآخرين، بالإضافة إلى تحرير المحتوى ونشره. | مديرو الخدمات التشغيلية، مساهمو المحتوى الداخلي |
| 3 | مؤلف | يمكنه كتابة ونشر منشوراته الخاصة، ولديه إذن لتحرير منشوراته الخاصة. | مساهمو المحتوى الداخلي |
| 4 | مساهم | يمكنه كتابة المحتوى ولكن لا يمكنه نشره. تتم مراجعة المنشورات ونشرها بواسطة مدير. | مساهمو المحتوى الداخلي |
| 5 | مشترك | يمكنه تسجيل الدخول إلى الموقع وإدارة ملفه الشخصي، ولكن لا يمكنه كتابة أو تحرير المحتوى. | مساهمو المحتوى الداخلي |
session.cookie_httponly:
; جعل ملفات تعريف ارتباط الجلسة غير قابلة للوصول من خلال جافاسكريبت
session.cookie_httponly = On
open_basedir:
; تقييد وصول PHP للملفات إلى الدليل المحدد
open_basedir = "/path/to/your/web/root"
مثال:
open_basedir = "/var/www/html:/tmp"
يسمح هذا التكوين لـ PHP بالوصول إلى الملفات فقط داخل دليل /var/www/html والدليل المؤقت /tmp.
disable_functions:
; تعطيل دوال PHP التي قد تكون خطيرة
disable_functions = "system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail"
شرح الدوال المعطلة:
system, exec, shell_exec, passthru:
mysql_list_dbs:
ini_alter:
dl:
symlink, link:
chgrp:
leak:
popen:
apache_child_terminate:
virtual:
mb_send_mail: