Konfigurace zabezpečení
XOOPS Konfigurace zabezpečení
Sekce “XOOPS Konfigurace zabezpečení”Komplexní průvodce zabezpečením vaší instalace XOOPS proti běžným webovým zranitelnostem.
Kontrolní seznam zabezpečení
Sekce “Kontrolní seznam zabezpečení”Před spuštěním webu implementujte tato bezpečnostní opatření:
- Správně nastavená oprávnění k souboru (644/755)
- Instalační složka odstraněna nebo chráněna
- mainfile.php chráněno před úpravami
- SSL/HTTPS povoleno na všech stránkách
- Složka správce přejmenována nebo chráněna
- Citlivé soubory nejsou přístupné z webu
- Jsou zavedena omezení .htaccess
- Automatické pravidelné zálohování
- Nakonfigurována záhlaví zabezpečení
- Ochrana CSRF povolena
- Ochrany vstřikování SQL aktivní
- Aktualizováno Modules/extensions
Zabezpečení souborového systému
Sekce “Zabezpečení souborového systému”Oprávnění k souboru
Sekce “Oprávnění k souboru”Správná oprávnění k souborům jsou pro zabezpečení zásadní.
Pokyny pro povolení
Sekce “Pokyny pro povolení”| Cesta | Oprávnění | Majitel | Důvod |
|---|---|---|---|
| mainfile.php | 644 | kořen | Obsahuje přihlašovací údaje DB |
| *.php files | 644 | root | Prevent unauthorized modification |
| Adresáře | 755 | kořen | Povolit čtení, zabránit zápisu |
| cache/ | 777 | www-data | Webový server musí psát |
| templates_c/ | 777 | www-data | Kompilované šablony |
| uploady/ | 777 | www-data | Uživatelské uploady |
| var/ | 777 | www-data | Proměnné údaje |
| nainstalovat/ | Odebrat | - | Smazat po instalaci |
| configs/ | 755 | kořen | Čitelné, nelze zapisovat |
Nastavení skriptu oprávnění
Sekce “Nastavení skriptu oprávnění”#!/bin/bashXOOPS_PATH="/var/www/html/xoops"WEB_USER="www-data"
# Set ownershipecho "Setting ownership..."chown -R $WEB_USER:$WEB_USER $XOOPS_PATH
# Set restrictive default permissionsecho "Setting base permissions..."find $XOOPS_PATH -type d -exec chmod 755 {} \;find $XOOPS_PATH -type f -exec chmod 644 {} \;
# Make specific directories writableecho "Setting writable directories..."chmod 777 $XOOPS_PATH/cachechmod 777 $XOOPS_PATH/templates_cchmod 777 $XOOPS_PATH/uploadschmod 777 $XOOPS_PATH/var
# Protect sensitive filesecho "Protecting sensitive files..."chmod 644 $XOOPS_PATH/mainfile.phpchmod 444 $XOOPS_PATH/mainfile.php.dist # If it exists (read-only)
# Verify permissionsecho "Verifying permissions..."ls -la $XOOPS_PATH | grep -E "mainfile|cache|uploads|var|templates_c"
echo "Security hardening completed!"Spusťte skript:
chmod +x /usr/local/bin/xoops-secure.sh/usr/local/bin/xoops-secure.shOdebrat instalační složku
Sekce “Odebrat instalační složku”CRITICAL: Po instalaci je nutné odstranit instalační složku!
# Option 1: Delete completelyrm -rf /var/www/html/xoops/install/
# Option 2: Rename and keep for referencemv /var/www/html/xoops/install/ /var/www/html/xoops/install.bak/
# Verify removalls -la /var/www/html/xoops/ | grep installChraňte citlivé adresáře
Sekce “Chraňte citlivé adresáře”Vytvářejte soubory .htaccess pro blokování přístupu webu k citlivým složkám:
Soubor: /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>Soubor: /var/www/html/xoops/templates_c/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar)$"> Deny from all</FilesMatch>
Options -IndexesSoubor: /var/www/html/xoops/cache/.htaccess
Options -Indexes<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>Chránit adresář pro nahrávání
Sekce “Chránit adresář pro nahrávání”Zabránit spouštění skriptů při nahrávání:
Soubor: /var/www/html/xoops/uploads/.htaccess
# Prevent script execution<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar|pl|py|jsp|asp|aspx|cgi|sh|bat|exe)$"> Deny from all</FilesMatch>
# Prevent directory listingOptions -Indexes
# Additional protection<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /xoops/uploads/
# Block suspicious files RewriteCond %{REQUEST_URI} \.(php|phtml|php3|php4|php5|php6|php7)$ [NC] RewriteRule ^.*$ - [F,L]</IfModule>Konfigurace SSL/HTTPS
Sekce “Konfigurace SSL/HTTPS”Šifrujte veškerý provoz mezi uživateli a vaším serverem.
Získejte certifikát SSL
Sekce “Získejte certifikát SSL”Možnost 1: Bezplatný certifikát od Let’s Encrypt
# Install Certbotapt-get install certbot python3-certbot-apache
# Obtain certificate (auto-configures Apache)certbot certonly --apache -d your-domain.com -d www.your-domain.com
# Verify certificate installedls /etc/letsencrypt/live/your-domain.com/Možnost 2: Komerční certifikát SSL
Kontaktujte poskytovatele nebo registrátora SSL:
- Kupte si certifikát SSL
- Ověřte vlastnictví domény
- Nainstalujte soubory certifikátů na server
- Nakonfigurujte webový server
Konfigurace Apache SSL
Sekce “Konfigurace Apache SSL”Vytvořte virtuální hostitele HTTPS:
Soubor: /etc/apache2/sites-available/xoops-ssl.conf
<VirtualHost *:443> ServerName your-domain.com ServerAlias www.your-domain.com DocumentRoot /var/www/html/xoops
# SSL Configuration 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
# Security Headers 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>
# Restrict install folder <Directory /var/www/html/xoops/install> Deny from all </Directory>
# Logging ErrorLog ${APACHE_LOG_DIR}/xoops_ssl_error.log CustomLog ${APACHE_LOG_DIR}/xoops_ssl_access.log combined</VirtualHost>
# Redirect HTTP to HTTPS<VirtualHost *:80> ServerName your-domain.com ServerAlias www.your-domain.com Redirect 301 / https://your-domain.com/</VirtualHost>Povolit konfiguraci:
# Enable SSL modulea2enmod ssl
# Enable sitea2ensite xoops-ssl
# Disable non-SSL site if existsa2dissite 000-default
# Test configurationapache2ctl configtest# Should output: Syntax OK
# Restart Apachesystemctl restart apache2Konfigurace Nginx SSL
Sekce “Konfigurace Nginx SSL”Soubor: /etc/nginx/sites-available/xoops
# HTTP to HTTPS redirectserver { listen 80; listen [::]:80; server_name your-domain.com www.your-domain.com;
location / { return 301 https://$server_name$request_uri; }}
# HTTPS serverserver { 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 Certificate Configuration ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# Modern SSL Configuration 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 Header add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Security Headers 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;
# Restrict install folder location ~ ^/(install|upgrade)/ { deny all; }
# Deny access to sensitive files location ~ /\. { deny all; }
# PHP-FPM backend 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; }
# Static files caching location ~* \.(js|css|png|jpg|gif|ico|svg)$ { expires 30d; add_header Cache-Control "public, immutable"; }
# URL rewriting location / { try_files $uri $uri/ /index.php?$query_string; }
# Logging access_log /var/log/nginx/xoops_access.log; error_log /var/log/nginx/xoops_error.log;}Povolit konfiguraci:
ln -s /etc/nginx/sites-available/xoops /etc/nginx/sites-enabled/nginx -tsystemctl restart nginxOvěřte instalaci HTTPS
Sekce “Ověřte instalaci HTTPS”# Test SSL configurationopenssl s_client -connect your-domain.com:443 -tls1_2
# Check certificate validityopenssl x509 -in /etc/letsencrypt/live/your-domain.com/cert.pem -noout -text
# SSL/TLS test online# https://www.ssllabs.com/ssltest/# https://www.testssl.sh/Automatické obnovení Let’s Encrypt Certificate
Sekce “Automatické obnovení Let’s Encrypt Certificate”# Enable auto-renewalsystemctl enable certbot.timersystemctl start certbot.timer
# Test renewal processcertbot renew --dry-run
# Manual renewal if neededcertbot renew --force-renewalZabezpečení webových aplikací
Sekce “Zabezpečení webových aplikací”Chraňte před vstřikováním SQL
Sekce “Chraňte před vstřikováním SQL”XOOPS používá parametrizované dotazy (ve výchozím nastavení bezpečné), ale vždy:
// UNSAFE - Never do this!$query = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
// SAFE - Use prepared statements$database = XOOPSDatabaseFactory::getDatabaseConnection();$sql = "SELECT * FROM " . $database->prefix('users') . " WHERE name = ?";$result = $database->query($sql, array($_GET['name']));Cross-Site Scripting (XSS) Prevence
Sekce “Cross-Site Scripting (XSS) Prevence”Vždy dezinfikujte uživatelský vstup:
// UNSAFEecho $_GET['user_input'];
// SAFE - Use XOOPS sanitization functionsecho htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');
// Or use XOOPS functions$text_sanitizer = new xoops_text_sanitizer();echo $text_sanitizer->stripSlashesGPC($_GET['user_input']);Prevence padělání požadavků napříč stránkami (CSRF)
Sekce “Prevence padělání požadavků napříč stránkami (CSRF)”XOOPS obsahuje ochranu tokenu CSRF. Vždy zahrňte žetony:
<!-- In forms --><form method="post"> {xoops_token form=update} <input type="text" name="field"> <input type="submit"></form>Zakázat spuštění PHP ve složce pro nahrání
Sekce “Zakázat spuštění PHP ve složce pro nahrání”Zabránit útočníkům v nahrávání a spouštění PHP:
# Create .htaccess in uploads foldercat > /var/www/html/xoops/uploads/.htaccess << 'EOF'<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>php_flag engine offEOF
# Alternative: Disable execution globally in uploadschmod 444 /var/www/html/xoops/uploads/ # Read-onlyBezpečnostní záhlaví
Sekce “Bezpečnostní záhlaví”Nakonfigurujte důležité bezpečnostní hlavičky HTTP:
# Strict-Transport-Security (HSTS)# Forces HTTPS for 1 yearHeader always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# X-Content-Type-Options# Prevents MIME type sniffingHeader always set X-Content-Type-Options "nosniff"
# X-Frame-Options# Prevents clickjacking attacksHeader always set X-Frame-Options "SAMEORIGIN"
# X-XSS-Protection# Browser XSS protectionHeader always set X-XSS-Protection "1; mode=block"
# Referrer-Policy# Controls referrer informationHeader always set Referrer-Policy "strict-origin-when-cross-origin"
# Content-Security-Policy# Controls resource loadingHeader 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'"Zabezpečení panelu administrátora
Sekce “Zabezpečení panelu administrátora”Přejmenovat složku správce
Sekce “Přejmenovat složku správce”Chraňte složku admin jejím přejmenováním:
# Rename admin foldermv /var/www/html/xoops/admin /var/www/html/xoops/myadmin123
# Update admin access URL# Old: http://your-domain.com/xoops/admin/# New: http://your-domain.com/xoops/myadmin123/Nakonfigurujte XOOPS pro použití přejmenované složky:
Upravit mainfile.php:
// Change this linedefine('XOOPS_ADMIN_PATH', '/var/www/html/xoops/myadmin123');Seznam povolených IP adres pro správce
Sekce “Seznam povolených IP adres pro správce”Omezit přístup správce na konkrétní IP adresy:
Soubor: /var/www/html/xoops/myadmin123/.htaccess
# Allow only specific IPs<RequireAll> Require ip 192.168.1.100 # Your office IP Require ip 203.0.113.50 # Your home IP Deny from all</RequireAll>Nebo s Apache 2.2:
Order Deny,AllowDeny from allAllow from 192.168.1.100 203.0.113.50Silné pověření správce
Sekce “Silné pověření správce”Vynutit správcům silná hesla:
- Použijte alespoň 16 znaků
- Mixujte velká, malá písmena, čísla, symboly
- Pravidelně měňte heslo (každých 90 dní)
- Použijte správce hesel
- Povolte dvoufaktorové ověřování, pokud je k dispozici
Monitorujte aktivitu správce
Sekce “Monitorujte aktivitu správce”Povolit protokolování přihlášení správce:
Panel správce > Systém > Předvolby > Uživatelská nastavení
Log Admin Logins: YesLog Failed Login Attempts: YesAlert Email on Admin Login: YesPravidelně kontrolujte protokoly:
# Check database for login attemptsmysql -u xoops_user -p xoops_db << EOFSELECT uid, uname, DATE_FROM_UNIXTIME(user_lastlogin) as last_loginFROM xoops_users WHERE uid = 1;EOFPravidelná údržba
Sekce “Pravidelná údržba”Aktualizujte XOOPS a moduly
Sekce “Aktualizujte XOOPS a moduly”Udržujte XOOPS a všechny moduly aktualizované:
# Check for updates in admin panel# Admin > Modules > Check for Updates
# Or via command linecd /var/www/html/xoops# Download and install latest version# Follow upgrade guideAutomatické bezpečnostní skenování
Sekce “Automatické bezpečnostní skenování”#!/bin/bash# Security audit script
# Check file permissionsecho "Checking file permissions..."find /var/www/html/xoops -type f ! -perm 644 ! -name "*.htaccess" | head -10
# Check for suspicious filesecho "Checking for suspicious files..."find /var/www/html/xoops -type f -name "*.php" -newer /var/www/html/xoops/install/ 2>/dev/null
# Check database for suspicious activityecho "Checking for failed login attempts..."mysql -u xoops_user -p xoops_db << EOFSELECT count(*) as attempts FROM xoops_audittrail WHERE action LIKE '%login%' AND status = 0;EOFPravidelné zálohováníAutomatizace denních záloh:
Sekce “Pravidelné zálohováníAutomatizace denních záloh:”#!/bin/bash# Daily backup script
BACKUP_DIR="/backups/xoops"RETENTION=30 # Keep 30 days
# Backup databasemysqldump -u xoops_user -p xoops_db | gzip > $BACKUP_DIR/db_$(date +%Y%m%d).sql.gz
# Backup filestar -czf $BACKUP_DIR/files_$(date +%Y%m%d).tar.gz /var/www/html/xoops --exclude=cache --exclude=templates_c
# Remove old backupsfind $BACKUP_DIR -type f -mtime +$RETENTION -delete
echo "Backup completed at $(date)"Plán s cronem:
# Edit crontabcrontab -e
# Add line (runs daily at 2 AM)0 2 * * * /usr/local/bin/xoops-backup.sh >> /var/log/xoops_backup.log 2>&1Šablona kontrolního seznamu zabezpečení
Sekce “Šablona kontrolního seznamu zabezpečení”Tuto šablonu použijte pro pravidelné audity zabezpečení:
Weekly Security Checklist========================
Date: ___________Checked by: ___________
File System:[ ] Permissions correct (644/755)[ ] Install folder removed[ ] No suspicious files[ ] mainfile.php protected
Web Security:[ ] HTTPS/SSL working[ ] Security headers present[ ] Admin panel restricted[ ] File upload restrictions active[ ] Login attempts logged
Application:[ ] XOOPS version current[ ] All modules updated[ ] No error messages in logs[ ] Database optimized[ ] Cache cleared
Backups:[ ] Database backed up[ ] Files backed up[ ] Backup tested[ ] Offsite copy verified
Issues Found:1. ___________2. ___________3. ___________
Actions Taken:1. ___________2. ___________Bezpečnostní zdroje
Sekce “Bezpečnostní zdroje”- Požadavky na server
- Základní konfigurace
- Optimalizace výkonu
- OWASP Top 10: https://owasp.org/www-project-top-ten/
Štítky: #security #ssl #https #hardening #best-practices
Související články:
- ../Installation/Installation
- ../../06-Publisher-Module/User-Guide/Basic-Configuration
- Nastavení systému
- ../Installation/Upgrading-XOOPS