تكوين الأمان
تكوين الأمان لـ XOOPS
Section titled “تكوين الأمان لـ XOOPS”دليل شامل لتأمين تثبيت XOOPS ضد نقاط الضعف الويب الشائعة.
قائمة التحقق من الأمان
Section titled “قائمة التحقق من الأمان”قبل إطلاق موقعك، طبّق هذه تدابير الأمان:
- تم تعيين أذونات الملفات بشكل صحيح (644/755)
- تم إزالة أو حماية مجلد التثبيت
- تم حماية mainfile.php من التعديل
- تم تفعيل SSL/HTTPS على جميع الصفحات
- تم إعادة تسمية أو حماية مجلد المسؤول
- الملفات الحساسة ليست قابلة للوصول من الويب
- تم وضع قيود .htaccess
- تم أتمتة النسخ الاحتياطية المنتظمة
- تم تكوين رؤوس الأمان
- تم تفعيل حماية CSRF
- حماية حقن SQL نشطة
- تم تحديث الوحدات/الملحقات
أمان نظام الملفات
Section titled “أمان نظام الملفات”أذونات الملفات
Section titled “أذونات الملفات”الأذونات الصحيحة حرجة للأمان.
إرشادات الأذونات
Section titled “إرشادات الأذونات”| المسار | الأذونات | المالك | السبب |
|---|---|---|---|
| mainfile.php | 644 | root | يحتوي على بيانات اعتماد قاعدة البيانات |
| ملفات *.php | 644 | root | منع التعديل غير المصرح |
| المجلدات | 755 | root | السماح بالقراءة، منع الكتابة |
| cache/ | 777 | www-data | يجب أن يكتب خادم الويب |
| templates_c/ | 777 | www-data | القوالب المترجمة |
| uploads/ | 777 | www-data | تحميلات المستخدم |
| var/ | 777 | www-data | بيانات متغيرة |
| install/ | حذف | - | احذف بعد التثبيت |
| configs/ | 755 | root | قابل للقراءة، غير قابل للكتابة |
سكريبت تعيين الأذونات
Section titled “سكريبت تعيين الأذونات”#!/bin/bashXOOPS_PATH="/var/www/html/xoops"WEB_USER="www-data"
# تعيين الملكيةecho "تعيين الملكية..."chown -R $WEB_USER:$WEB_USER $XOOPS_PATH
# تعيين الأذونات الافتراضية المقيدةecho "تعيين الأذونات الأساسية..."find $XOOPS_PATH -type d -exec chmod 755 {} \;find $XOOPS_PATH -type f -exec chmod 644 {} \;
# جعل المجلدات المحددة قابلة للكتابةecho "تعيين المجلدات القابلة للكتابة..."chmod 777 $XOOPS_PATH/cachechmod 777 $XOOPS_PATH/templates_cchmod 777 $XOOPS_PATH/uploadschmod 777 $XOOPS_PATH/var
# حماية الملفات الحساسةecho "حماية الملفات الحساسة..."chmod 644 $XOOPS_PATH/mainfile.phpchmod 444 $XOOPS_PATH/mainfile.php.dist # إن كانت موجودة (قراءة فقط)
# التحقق من الأذوناتecho "التحقق من الأذونات..."ls -la $XOOPS_PATH | grep -E "mainfile|cache|uploads|var|templates_c"
echo "اكتمل تقوية الأمان!"قم بتشغيل السكريبت:
chmod +x /usr/local/bin/xoops-secure.sh/usr/local/bin/xoops-secure.shإزالة مجلد التثبيت
Section titled “إزالة مجلد التثبيت”حرج: يجب إزالة مجلد التثبيت بعد التثبيت!
# الخيار 1: احذف بالكاملrm -rf /var/www/html/xoops/install/
# الخيار 2: أعد التسمية واحفظ كمرجعmv /var/www/html/xoops/install/ /var/www/html/xoops/install.bak/
# التحقق من الإزالةls -la /var/www/html/xoops/ | grep installحماية المجلدات الحساسة
Section titled “حماية المجلدات الحساسة”أنشئ ملفات .htaccess لحجب الوصول من الويب للمجلدات الحساسة:
الملف: /var/www/html/xoops/var/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar)$"> Deny from all</FilesMatch>
<IfModule mod_autoindex.c> Options -Indexes</IfModule>الملف: /var/www/html/xoops/templates_c/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar)$"> Deny from all</FilesMatch>
Options -Indexesالملف: /var/www/html/xoops/cache/.htaccess
Options -Indexes<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>حماية دليل التحميل
Section titled “حماية دليل التحميل”منع تنفيذ السكريبتات في المحميل:
الملف: /var/www/html/xoops/uploads/.htaccess
# منع تنفيذ السكريبتات<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar|pl|py|jsp|asp|aspx|cgi|sh|bat|exe)$"> Deny from all</FilesMatch>
# منع قائمة الفهرسOptions -Indexes
# حماية إضافية<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /xoops/uploads/
# حجب الملفات المريبة RewriteCond %{REQUEST_URI} \.(php|phtml|php3|php4|php5|php6|php7)$ [NC] RewriteRule ^.*$ - [F,L]</IfModule>تكوين SSL/HTTPS
Section titled “تكوين SSL/HTTPS”تشفير جميع حركة المستخدمين والخادم.
الحصول على شهادة SSL
Section titled “الحصول على شهادة SSL”الخيار 1: شهادة مجانية من Let’s Encrypt
# تثبيت Certbotapt-get install certbot python3-certbot-apache
# الحصول على الشهادة (تكوين Apache تلقائي)certbot certonly --apache -d your-domain.com -d www.your-domain.com
# التحقق من تثبيت الشهادةls /etc/letsencrypt/live/your-domain.com/الخيار 2: شهادة SSL تجارية
اتصل بمزود SSL أو المسجل:
- اشتر شهادة SSL
- تحقق من ملكية المجال
- ثبت ملفات الشهادة على الخادم
- قم بتكوين خادم الويب
تكوين SSL لـ Apache
Section titled “تكوين SSL لـ Apache”أنشئ الاستضافة الافتراضية HTTPS:
الملف: /etc/apache2/sites-available/xoops-ssl.conf
<VirtualHost *:443> ServerName your-domain.com ServerAlias www.your-domain.com DocumentRoot /var/www/html/xoops
# تكوين SSL SSLEngine on SSLProtocol TLSv1.2 TLSv1.3 SSLCipherSuite HIGH:!aNULL:!MD5 SSLCertificateFile /etc/letsencrypt/live/your-domain.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/your-domain.com/chain.pem
# رؤوس الأمان Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy "no-referrer-when-downgrade" Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"
<Directory /var/www/html/xoops> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory>
# قيد مجلد التثبيت <Directory /var/www/html/xoops/install> Deny from all </Directory>
# السجلات ErrorLog ${APACHE_LOG_DIR}/xoops_ssl_error.log CustomLog ${APACHE_LOG_DIR}/xoops_ssl_access.log combined</VirtualHost>
# إعادة توجيه HTTP إلى HTTPS<VirtualHost *:80> ServerName your-domain.com ServerAlias www.your-domain.com Redirect 301 / https://your-domain.com/</VirtualHost>تفعيل التكوين:
# تفعيل وحدة SSLa2enmod ssl
# تفعيل الموقعa2ensite xoops-ssl
# عطّل الموقع غير SSL إن كان موجودa2dissite 000-default
# اختبر التكوينapache2ctl configtest# يجب أن يعرض: Syntax OK
# أعد تشغيل Apachesystemctl restart apache2تكوين SSL لـ Nginx
Section titled “تكوين SSL لـ Nginx”الملف: /etc/nginx/sites-available/xoops
# إعادة توجيه HTTP إلى HTTPSserver { listen 80; listen [::]:80; server_name your-domain.com www.your-domain.com;
location / { return 301 https://$server_name$request_uri; }}
# خادم HTTPSserver { listen 443 ssl http2; listen [::]:443 ssl http2;
server_name your-domain.com www.your-domain.com; root /var/www/html/xoops; index index.php index.html;
# تكوين شهادة SSL ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# تكوين SSL حديث ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
# رأس HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# رؤوس الأمان add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'" always;
# قيد مجلد التثبيت location ~ ^/(install|upgrade)/ { deny all; }
# رفض الوصول للملفات المخفية location ~ /\. { deny all; }
# خلفية PHP-FPM location ~ \.php$ { fastcgi_pass unix:/run/php-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
# التخزين المؤقت للملفات الثابتة location ~* \.(js|css|png|jpg|gif|ico|svg)$ { expires 30d; add_header Cache-Control "public, immutable"; }
# إعادة كتابة الرابط location / { try_files $uri $uri/ /index.php?$query_string; }
# السجلات access_log /var/log/nginx/xoops_access.log; error_log /var/log/nginx/xoops_error.log;}تفعيل التكوين:
ln -s /etc/nginx/sites-available/xoops /etc/nginx/sites-enabled/nginx -tsystemctl restart nginxالتحقق من تثبيت HTTPS
Section titled “التحقق من تثبيت HTTPS”# اختبر تكوين SSLopenssl s_client -connect your-domain.com:443 -tls1_2
# تحقق من صحة الشهادةopenssl x509 -in /etc/letsencrypt/live/your-domain.com/cert.pem -noout -text
# اختبار SSL/TLS على الإنترنت# https://www.ssllabs.com/ssltest/# https://www.testssl.sh/تجديد شهادة Let’s Encrypt تلقائيًا
Section titled “تجديد شهادة Let’s Encrypt تلقائيًا”# تفعيل التجديد التلقائيsystemctl enable certbot.timersystemctl start certbot.timer
# اختبر عملية التجديدcertbot renew --dry-run
# تجديد يدوي إذا لزم الأمرcertbot renew --force-renewalأمان تطبيق الويب
Section titled “أمان تطبيق الويب”الحماية من حقن SQL
Section titled “الحماية من حقن SQL”يستخدم XOOPS استعلامات معاملية (آمنة افتراضيًا)، لكن دائمًا:
// غير آمن - لا تفعل هذا أبدًا!$query = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
// آمن - استخدم البيانات الإعدادية$database = XoopsDatabaseFactory::getDatabaseConnection();$sql = "SELECT * FROM " . $database->prefix('users') . " WHERE name = ?";$result = $database->query($sql, array($_GET['name']));منع Cross-Site Scripting (XSS)
Section titled “منع Cross-Site Scripting (XSS)”طهّر دائمًا إدخال المستخدم:
// غير آمنecho $_GET['user_input'];
// آمن - استخدم وظائف تطهير XOOPSecho htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');
// أو استخدم وظائف XOOPS$text_sanitizer = new xoops_text_sanitizer();echo $text_sanitizer->stripSlashesGPC($_GET['user_input']);منع Cross-Site Request Forgery (CSRF)
Section titled “منع Cross-Site Request Forgery (CSRF)”يتضمن XOOPS حماية رموز CSRF. ضمّن دائمًا الرموز:
<!-- في النماذج --><form method="post"> {xoops_token form=update} <input type="text" name="field"> <input type="submit"></form>تعطيل تنفيذ PHP في مجلد التحميل
Section titled “تعطيل تنفيذ PHP في مجلد التحميل”منع المهاجمين من تحميل وتنفيذ PHP:
# أنشئ .htaccess في مجلد التحميلcat > /var/www/html/xoops/uploads/.htaccess << 'EOF'<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>php_flag engine offEOF
# بديل: اجعل التحميل يقرأ فقطchmod 444 /var/www/html/xoops/uploads/رؤوس الأمان
Section titled “رؤوس الأمان”تكوين رؤوس أمان HTTP المهمة:
# Strict-Transport-Security (HSTS)# فرض HTTPS لمدة سنة واحدةHeader always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# X-Content-Type-Options# منع اكتشاف نوع MIMEHeader always set X-Content-Type-Options "nosniff"
# X-Frame-Options# منع هجمات ClickjackingHeader always set X-Frame-Options "SAMEORIGIN"
# X-XSS-Protection# حماية XSS للمتصفحHeader always set X-XSS-Protection "1; mode=block"
# Referrer-Policy# تحكم معلومات ReferrerHeader always set Referrer-Policy "strict-origin-when-cross-origin"
# Content-Security-Policy# تحكم تحميل المواردHeader always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'"أمان لوحة التحكم
Section titled “أمان لوحة التحكم”إعادة تسمية مجلد المسؤول
Section titled “إعادة تسمية مجلد المسؤول”حمِ مجلد المسؤول بإعادة تسميته:
# أعد تسمية مجلد المسؤولmv /var/www/html/xoops/admin /var/www/html/xoops/myadmin123
# حدّث عنوان الوصول للمسؤول# القديم: http://your-domain.com/xoops/admin/# الجديد: http://your-domain.com/xoops/myadmin123/قم بتكوين XOOPS لاستخدام المجلد المعاد تسميته:
عدّل mainfile.php:
// غيّر هذا السطرdefine('XOOPS_ADMIN_PATH', '/var/www/html/xoops/myadmin123');قائمة بيضاء IP لوصول المسؤول
Section titled “قائمة بيضاء IP لوصول المسؤول”قيّد وصول المسؤول إلى IPs محددة:
الملف: /var/www/html/xoops/myadmin123/.htaccess
# السماح لـ IPs محددة فقط<RequireAll> Require ip 192.168.1.100 # IP مكتبك Require ip 203.0.113.50 # IP منزلك Deny from all</RequireAll>أو مع Apache 2.2:
Order Deny,AllowDeny from allAllow from 192.168.1.100 203.0.113.50بيانات اعتماد مسؤول قوية
Section titled “بيانات اعتماد مسؤول قوية”فرض كلمات مرور قوية للمسؤولين:
- استخدم 16+ حرف على الأقل
- امزج أحرف كبيرة وصغيرة وأرقام ورموز
- غيّر كلمة المرور بانتظام (كل 90 يومًا)
- استخدم مدير كلمات مرور
- فعّل المصادقة متعددة العوامل إن أمكن
مراقبة نشاط المسؤول
Section titled “مراقبة نشاط المسؤول”فعّل تسجيل دخول المسؤول:
لوحة التحكم > System > Preferences > User Settings
تسجيل دخول المسؤول: نعمتسجيل محاولات الدخول الفاشلة: نعمتنبيه البريد الإلكتروني عند دخول المسؤول: نعمراجع السجلات بانتظام:
# تحقق من قاعدة البيانات لمحاولات الدخولmysql -u xoops_user -p xoops_db << EOFSELECT uid, uname, DATE_FROM_UNIXTIME(user_lastlogin) as last_loginFROM xoops_users WHERE uid = 1;EOFالصيانة المنتظمة
Section titled “الصيانة المنتظمة”تحديث XOOPS والوحدات
Section titled “تحديث XOOPS والوحدات”احفظ XOOPS والوحدات محدثة:
# تحقق من التحديثات في لوحة التحكم# Admin > Modules > Check for Updates
# أو عبر سطر الأوامرcd /var/www/html/xoops# حمّل وثبّت الإصدار الأحدث# اتّبع دليل الترقيةفحص أمان آلي
Section titled “فحص أمان آلي”#!/bin/bash# سكريبت تدقيق الأمان
# تحقق من أذونات الملفاتecho "التحقق من أذونات الملفات..."find /var/www/html/xoops -type f ! -perm 644 ! -name "*.htaccess" | head -10
# تحقق من الملفات المريبةecho "التحقق من الملفات المريبة..."find /var/www/html/xoops -type f -name "*.php" -newer /var/www/html/xoops/install/ 2>/dev/null
# تحقق من قاعدة البيانات للنشاط المريبecho "التحقق من محاولات الدخول الفاشلة..."mysql -u xoops_user -p xoops_db << EOFSELECT count(*) as attempts FROM xoops_audittrail WHERE action LIKE '%login%' AND status = 0;EOFالنسخ الاحتياطية المنتظمة
Section titled “النسخ الاحتياطية المنتظمة”أتمتة النسخ الاحتياطية اليومية:
#!/bin/bash# سكريبت النسخة الاحتياطية اليومية
BACKUP_DIR="/backups/xoops"RETENTION=30 # احفظ 30 يومًا
# نسخ احتياطي لقاعدة البياناتmysqldump -u xoops_user -p xoops_db | gzip > $BACKUP_DIR/db_$(date +%Y%m%d).sql.gz
# نسخ احتياطي للملفاتtar -czf $BACKUP_DIR/files_$(date +%Y%m%d).tar.gz /var/www/html/xoops --exclude=cache --exclude=templates_c
# احذف النسخ الاحتياطية القديمةfind $BACKUP_DIR -type f -mtime +$RETENTION -delete
echo "اكتملت النسخة الاحتياطية في $(date)"جدول مع cron:
# عدّل crontabcrontab -e
# أضف سطر (يعمل يوميًا في الساعة 2 صباحًا)0 2 * * * /usr/local/bin/xoops-backup.sh >> /var/log/xoops_backup.log 2>&1قالب قائمة فحص الأمان
Section titled “قالب قائمة فحص الأمان”استخدم هذا القالب لعمليات تدقيق الأمان المنتظمة:
قائمة فحص الأمان الأسبوعية========================
التاريخ: ___________فحصها: ___________
نظام الملفات:[ ] الأذونات صحيحة (644/755)[ ] مجلد التثبيت محذوف[ ] لا توجد ملفات مريبة[ ] mainfile.php محمي
أمان الويب:[ ] HTTPS/SSL يعمل[ ] رؤوس الأمان موجودة[ ] لوحة التحكم مقيدة[ ] تقييد تحميل الملفات نشط[ ] محاولات الدخول مسجلة
التطبيق:[ ] إصدار XOOPS محدث[ ] جميع الوحدات محدثة[ ] لا رسائل خطأ في السجلات[ ] قاعدة البيانات محسّنة[ ] التخزين المؤقت مسح
النسخ الاحتياطية:[ ] نسخة احتياطية لقاعدة البيانات[ ] نسخة احتياطية للملفات[ ] تم اختبار النسخة الاحتياطية[ ] تم التحقق من النسخة خارج الموقع
مشاكل عُثِرَ عليها:1. ___________2. ___________3. ___________
الإجراءات المتخذة:1. ___________2. ___________موارد الأمان
Section titled “موارد الأمان”- متطلبات الخادم
- التكوين الأساسي
- تحسين الأداء
- أفضل 10 نقاط ضعف OWASP: https://owasp.org/www-project-top-ten/
علامات: #security #ssl #https #hardening #best-practices
المقالات ذات الصلة:
- ../Installation/Installation
- ../../06-Publisher-Module/User-Guide/Basic-Configuration
- System-Settings
- ../Installation/Upgrading-XOOPS