Přeskočit na obsah

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”

Správná oprávnění k souborům jsou pro zabezpečení zásadní.

CestaOprávněníMajitelDůvod
mainfile.php644kořenObsahuje přihlašovací údaje DB
*.php files644rootPrevent unauthorized modification
Adresáře755kořenPovolit čtení, zabránit zápisu
cache/777www-dataWebový server musí psát
templates_c/777www-dataKompilované šablony
uploady/777www-dataUživatelské uploady
var/777www-dataProměnné údaje
nainstalovat/Odebrat-Smazat po instalaci
configs/755kořenČitelné, nelze zapisovat

Nastavení skriptu oprávnění

Sekce “Nastavení skriptu oprávnění”
/usr/local/bin/xoops-secure.sh
#!/bin/bash
XOOPS_PATH="/var/www/html/xoops"
WEB_USER="www-data"
# Set ownership
echo "Setting ownership..."
chown -R $WEB_USER:$WEB_USER $XOOPS_PATH
# Set restrictive default permissions
echo "Setting base permissions..."
find $XOOPS_PATH -type d -exec chmod 755 {} \;
find $XOOPS_PATH -type f -exec chmod 644 {} \;
# Make specific directories writable
echo "Setting writable directories..."
chmod 777 $XOOPS_PATH/cache
chmod 777 $XOOPS_PATH/templates_c
chmod 777 $XOOPS_PATH/uploads
chmod 777 $XOOPS_PATH/var
# Protect sensitive files
echo "Protecting sensitive files..."
chmod 644 $XOOPS_PATH/mainfile.php
chmod 444 $XOOPS_PATH/mainfile.php.dist # If it exists (read-only)
# Verify permissions
echo "Verifying permissions..."
ls -la $XOOPS_PATH | grep -E "mainfile|cache|uploads|var|templates_c"
echo "Security hardening completed!"

Spusťte skript:

Terminál
chmod +x /usr/local/bin/xoops-secure.sh
/usr/local/bin/xoops-secure.sh

Odebrat instalační složku

Sekce “Odebrat instalační složku”

CRITICAL: Po instalaci je nutné odstranit instalační složku!

Terminál
# Option 1: Delete completely
rm -rf /var/www/html/xoops/install/
# Option 2: Rename and keep for reference
mv /var/www/html/xoops/install/ /var/www/html/xoops/install.bak/
# Verify removal
ls -la /var/www/html/xoops/ | grep install

Chraň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 -Indexes

Soubor: /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 listing
Options -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>

Š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

Terminál
# Install Certbot
apt-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 installed
ls /etc/letsencrypt/live/your-domain.com/

Možnost 2: Komerční certifikát SSL

Kontaktujte poskytovatele nebo registrátora SSL:

  1. Kupte si certifikát SSL
  2. Ověřte vlastnictví domény
  3. Nainstalujte soubory certifikátů na server
  4. Nakonfigurujte webový server

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:

Terminál
# Enable SSL module
a2enmod ssl
# Enable site
a2ensite xoops-ssl
# Disable non-SSL site if exists
a2dissite 000-default
# Test configuration
apache2ctl configtest
# Should output: Syntax OK
# Restart Apache
systemctl restart apache2

Soubor: /etc/nginx/sites-available/xoops

# HTTP to HTTPS redirect
server {
listen 80;
listen [::]:80;
server_name your-domain.com www.your-domain.com;
location / {
return 301 https://$server_name$request_uri;
}
}
# HTTPS server
server {
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:

Terminál
ln -s /etc/nginx/sites-available/xoops /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx

Ověřte instalaci HTTPS

Sekce “Ověřte instalaci HTTPS”
Terminál
# Test SSL configuration
openssl s_client -connect your-domain.com:443 -tls1_2
# Check certificate validity
openssl 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”
Terminál
# Enable auto-renewal
systemctl enable certbot.timer
systemctl start certbot.timer
# Test renewal process
certbot renew --dry-run
# Manual renewal if needed
certbot renew --force-renewal

Zabezpeč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:

// UNSAFE
echo $_GET['user_input'];
// SAFE - Use XOOPS sanitization functions
echo 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:

Terminál
# Create .htaccess in uploads folder
cat > /var/www/html/xoops/uploads/.htaccess << 'EOF'
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$">
Deny from all
</FilesMatch>
php_flag engine off
EOF
# Alternative: Disable execution globally in uploads
chmod 444 /var/www/html/xoops/uploads/ # Read-only

Bezpeč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 year
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# X-Content-Type-Options
# Prevents MIME type sniffing
Header always set X-Content-Type-Options "nosniff"
# X-Frame-Options
# Prevents clickjacking attacks
Header always set X-Frame-Options "SAMEORIGIN"
# X-XSS-Protection
# Browser XSS protection
Header always set X-XSS-Protection "1; mode=block"
# Referrer-Policy
# Controls referrer information
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Content-Security-Policy
# Controls resource loading
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'"

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:

Terminál
# Rename admin folder
mv /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 line
define('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,Allow
Deny from all
Allow from 192.168.1.100 203.0.113.50

Silné pověření správce

Sekce “Silné pověření správce”

Vynutit správcům silná hesla:

  1. Použijte alespoň 16 znaků
  2. Mixujte velká, malá písmena, čísla, symboly
  3. Pravidelně měňte heslo (každých 90 dní)
  4. Použijte správce hesel
  5. 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: Yes
Log Failed Login Attempts: Yes
Alert Email on Admin Login: Yes

Pravidelně kontrolujte protokoly:

Terminál
# Check database for login attempts
mysql -u xoops_user -p xoops_db << EOF
SELECT uid, uname, DATE_FROM_UNIXTIME(user_lastlogin) as last_login
FROM xoops_users WHERE uid = 1;
EOF

Aktualizujte XOOPS a moduly

Sekce “Aktualizujte XOOPS a moduly”

Udržujte XOOPS a všechny moduly aktualizované:

Terminál
# Check for updates in admin panel
# Admin > Modules > Check for Updates
# Or via command line
cd /var/www/html/xoops
# Download and install latest version
# Follow upgrade guide

Automatické bezpečnostní skenování

Sekce “Automatické bezpečnostní skenování”
#!/bin/bash
# Security audit script
# Check file permissions
echo "Checking file permissions..."
find /var/www/html/xoops -type f ! -perm 644 ! -name "*.htaccess" | head -10
# Check for suspicious files
echo "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 activity
echo "Checking for failed login attempts..."
mysql -u xoops_user -p xoops_db << EOF
SELECT count(*) as attempts FROM xoops_audittrail WHERE action LIKE '%login%' AND status = 0;
EOF

Pravidelné 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 database
mysqldump -u xoops_user -p xoops_db | gzip > $BACKUP_DIR/db_$(date +%Y%m%d).sql.gz
# Backup files
tar -czf $BACKUP_DIR/files_$(date +%Y%m%d).tar.gz /var/www/html/xoops --exclude=cache --exclude=templates_c
# Remove old backups
find $BACKUP_DIR -type f -mtime +$RETENTION -delete
echo "Backup completed at $(date)"

Plán s cronem:

Terminál
# Edit crontab
crontab -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. ___________

Š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