Configuración de Seguridad
Configuración de Seguridad de XOOPS
Sección titulada «Configuración de Seguridad de XOOPS»Guía integral para asegurar su instalación de XOOPS contra vulnerabilidades web comunes.
Lista de Verificación de Seguridad
Sección titulada «Lista de Verificación de Seguridad»Antes de lanzar su sitio, implemente estas medidas de seguridad:
- Permisos de archivo configurados correctamente (644/755)
- Carpeta de instalación eliminada o protegida
- mainfile.php protegido de modificación
- SSL/HTTPS habilitado en todas las páginas
- Carpeta de administración renombrada o protegida
- Archivos sensibles no accesibles por web
- Restricciones .htaccess en su lugar
- Copias de seguridad automáticas
- Encabezados de seguridad configurados
- Protección CSRF habilitada
- Protecciones contra inyección SQL activas
- Módulos/extensiones actualizados
Seguridad del Sistema de Archivos
Sección titulada «Seguridad del Sistema de Archivos»Permisos de Archivo
Sección titulada «Permisos de Archivo»Los permisos de archivo correctos son críticos para la seguridad.
Directrices de Permisos
Sección titulada «Directrices de Permisos»| Ruta | Permisos | Propietario | Razón |
|---|---|---|---|
| mainfile.php | 644 | root | Contiene credenciales de BD |
| Archivos *.php | 644 | root | Prevenir modificación no autorizada |
| Directorios | 755 | root | Permitir lectura, prevenir escritura |
| cache/ | 777 | www-data | El servidor web debe escribir |
| templates_c/ | 777 | www-data | Plantillas compiladas |
| uploads/ | 777 | www-data | Cargas de usuario |
| var/ | 777 | www-data | Datos variables |
| install/ | Eliminar | - | Eliminar después de la instalación |
| configs/ | 755 | root | Legible, no escribible |
Script de Establecimiento de Permisos
Sección titulada «Script de Establecimiento de Permisos»#!/bin/bashXOOPS_PATH="/var/www/html/xoops"WEB_USER="www-data"
# Establecer propiedadecho "Estableciendo propiedad..."chown -R $WEB_USER:$WEB_USER $XOOPS_PATH
# Establecer permisos restrictivos predeterminadosecho "Estableciendo permisos base..."find $XOOPS_PATH -type d -exec chmod 755 {} \;find $XOOPS_PATH -type f -exec chmod 644 {} \;
# Hacer escribibles directorios específicosecho "Estableciendo directorios escribibles..."chmod 777 $XOOPS_PATH/cachechmod 777 $XOOPS_PATH/templates_cchmod 777 $XOOPS_PATH/uploadschmod 777 $XOOPS_PATH/var
# Proteger archivos sensiblesecho "Protegiendo archivos sensibles..."chmod 644 $XOOPS_PATH/mainfile.phpchmod 444 $XOOPS_PATH/mainfile.php.dist # Si existe (solo lectura)
# Verificar permisosecho "Verificando permisos..."ls -la $XOOPS_PATH | grep -E "mainfile|cache|uploads|var|templates_c"
echo "¡Endurecimiento de seguridad completado!"Ejecutar el script:
chmod +x /usr/local/bin/xoops-secure.sh/usr/local/bin/xoops-secure.shEliminar Carpeta de Instalación
Sección titulada «Eliminar Carpeta de Instalación»CRÍTICO: ¡La carpeta de instalación debe ser eliminada después de la instalación!
# Opción 1: Eliminar completamenterm -rf /var/www/html/xoops/install/
# Opción 2: Renombrar y conservar para referenciamv /var/www/html/xoops/install/ /var/www/html/xoops/install.bak/
# Verificar eliminaciónls -la /var/www/html/xoops/ | grep installProteger Directorios Sensibles
Sección titulada «Proteger Directorios Sensibles»Crear archivos .htaccess para bloquear acceso web a carpetas sensibles:
Archivo: /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>Archivo: /var/www/html/xoops/templates_c/.htaccess
<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar)$"> Deny from all</FilesMatch>
Options -IndexesArchivo: /var/www/html/xoops/cache/.htaccess
Options -Indexes<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>Proteger Directorio de Carga
Sección titulada «Proteger Directorio de Carga»Prevenir ejecución de scripts en cargas:
Archivo: /var/www/html/xoops/uploads/.htaccess
# Prevenir ejecución de script<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7|phps|pht|phar|pl|py|jsp|asp|aspx|cgi|sh|bat|exe)$"> Deny from all</FilesMatch>
# Prevenir listado de directorioOptions -Indexes
# Protección adicional<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /xoops/uploads/
# Bloquear archivos sospechosos RewriteCond %{REQUEST_URI} \.(php|phtml|php3|php4|php5|php6|php7)$ [NC] RewriteRule ^.*$ - [F,L]</IfModule>Configuración de SSL/HTTPS
Sección titulada «Configuración de SSL/HTTPS»Encriptar todo el tráfico entre usuarios y su servidor.
Obtener Certificado SSL
Sección titulada «Obtener Certificado SSL»Opción 1: Certificado Gratuito de Let’s Encrypt
# Instalar Certbotapt-get install certbot python3-certbot-apache
# Obtener certificado (auto-configura Apache)certbot certonly --apache -d your-domain.com -d www.your-domain.com
# Verificar certificado instaladols /etc/letsencrypt/live/your-domain.com/Opción 2: Certificado SSL Comercial
Contactar proveedor de SSL o registrador:
- Comprar certificado SSL
- Verificar propiedad de dominio
- Instalar archivos de certificado en servidor
- Configurar servidor web
Configuración de SSL de Apache
Sección titulada «Configuración de SSL de Apache»Crear host virtual HTTPS:
Archivo: /etc/apache2/sites-available/xoops-ssl.conf
<VirtualHost *:443> ServerName your-domain.com ServerAlias www.your-domain.com DocumentRoot /var/www/html/xoops
# Configuración 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
# Encabezados de Seguridad 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>
# Restringir carpeta de instalación <Directory /var/www/html/xoops/install> Deny from all </Directory>
# Registro ErrorLog ${APACHE_LOG_DIR}/xoops_ssl_error.log CustomLog ${APACHE_LOG_DIR}/xoops_ssl_access.log combined</VirtualHost>
# Redirigir HTTP a HTTPS<VirtualHost *:80> ServerName your-domain.com ServerAlias www.your-domain.com Redirect 301 / https://your-domain.com/</VirtualHost>Habilitar la configuración:
# Habilitar módulo SSLa2enmod ssl
# Habilitar sitioa2ensite xoops-ssl
# Desactivar sitio no-SSL si existea2dissite 000-default
# Probar configuraciónapache2ctl configtest# Debe mostrar: Syntax OK
# Reiniciar Apachesystemctl restart apache2Configuración de SSL de Nginx
Sección titulada «Configuración de SSL de Nginx»Archivo: /etc/nginx/sites-available/xoops
# Redireccionamiento de HTTP a HTTPSserver { listen 80; listen [::]:80; server_name your-domain.com www.your-domain.com;
location / { return 301 https://$server_name$request_uri; }}
# Servidor 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;
# Configuración del Certificado SSL ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# Configuración SSL Moderna 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;
# Encabezado HSTS add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Encabezados de Seguridad 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;
# Restringir carpeta de instalación location ~ ^/(install|upgrade)/ { deny all; }
# Negar acceso a archivos sensibles location ~ /\. { deny all; }
# Backend 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; }
# Caché de archivos estáticos location ~* \.(js|css|png|jpg|gif|ico|svg)$ { expires 30d; add_header Cache-Control "public, immutable"; }
# Reescritura de URL location / { try_files $uri $uri/ /index.php?$query_string; }
# Registro access_log /var/log/nginx/xoops_access.log; error_log /var/log/nginx/xoops_error.log;}Habilitar la configuración:
ln -s /etc/nginx/sites-available/xoops /etc/nginx/sites-enabled/nginx -tsystemctl restart nginxVerificar Instalación de HTTPS
Sección titulada «Verificar Instalación de HTTPS»# Probar configuración SSLopenssl s_client -connect your-domain.com:443 -tls1_2
# Verificar validez del certificadoopenssl x509 -in /etc/letsencrypt/live/your-domain.com/cert.pem -noout -text
# Prueba SSL/TLS en línea# https://www.ssllabs.com/ssltest/# https://www.testssl.sh/Auto-Renovación del Certificado Let’s Encrypt
Sección titulada «Auto-Renovación del Certificado Let’s Encrypt»# Habilitar auto-renovaciónsystemctl enable certbot.timersystemctl start certbot.timer
# Probar proceso de renovacióncertbot renew --dry-run
# Renovación manual si es necesariocertbot renew --force-renewalSeguridad de Aplicación Web
Sección titulada «Seguridad de Aplicación Web»Proteger Contra Inyección SQL
Sección titulada «Proteger Contra Inyección SQL»XOOPS utiliza consultas parametrizadas (seguro por defecto), pero siempre:
// INSEGURO - ¡Nunca hagas esto!$query = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
// SEGURO - Usar declaraciones preparadas$database = XoopsDatabaseFactory::getDatabaseConnection();$sql = "SELECT * FROM " . $database->prefix('users') . " WHERE name = ?";$result = $database->query($sql, array($_GET['name']));Prevención de Cross-Site Scripting (XSS)
Sección titulada «Prevención de Cross-Site Scripting (XSS)»Siempre sanitizar entrada de usuario:
// INSEGUROecho $_GET['user_input'];
// SEGURO - Usar funciones de sanitización de XOOPSecho htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');
// O usar funciones de XOOPS$text_sanitizer = new xoops_text_sanitizer();echo $text_sanitizer->stripSlashesGPC($_GET['user_input']);Prevención de Cross-Site Request Forgery (CSRF)
Sección titulada «Prevención de Cross-Site Request Forgery (CSRF)»XOOPS incluye protección de token CSRF. Siempre incluir tokens:
<!-- En formularios --><form method="post"> {xoops_token form=update} <input type="text" name="field"> <input type="submit"></form>Deshabilitar Ejecución de PHP en Carpeta de Carga
Sección titulada «Deshabilitar Ejecución de PHP en Carpeta de Carga»Prevenir que atacantes suban y ejecuten PHP:
# Crear .htaccess en carpeta de cargascat > /var/www/html/xoops/uploads/.htaccess << 'EOF'<FilesMatch "\.(php|phtml|php3|php4|php5|php6|php7)$"> Deny from all</FilesMatch>php_flag engine offEOF
# Alternativa: Deshabilitar ejecución globalmente en cargaschmod 444 /var/www/html/xoops/uploads/ # Solo lecturaEncabezados de Seguridad
Sección titulada «Encabezados de Seguridad»Configurar encabezados HTTP de seguridad importantes:
# Strict-Transport-Security (HSTS)# Fuerza HTTPS por 1 añoHeader always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# X-Content-Type-Options# Previene olfateo de tipo MIMEHeader always set X-Content-Type-Options "nosniff"
# X-Frame-Options# Previene ataques de clickjackingHeader always set X-Frame-Options "SAMEORIGIN"
# X-XSS-Protection# Protección XSS del navegadorHeader always set X-XSS-Protection "1; mode=block"
# Referrer-Policy# Controla información del referrerHeader always set Referrer-Policy "strict-origin-when-cross-origin"
# Content-Security-Policy# Controla carga de recursosHeader 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'"Seguridad del Panel de Administración
Sección titulada «Seguridad del Panel de Administración»Renombrar Carpeta de Administración
Sección titulada «Renombrar Carpeta de Administración»Proteger carpeta de administración renombrándola:
# Renombrar carpeta de administraciónmv /var/www/html/xoops/admin /var/www/html/xoops/myadmin123
# Actualizar URL de acceso de administración# Antiguo: http://your-domain.com/xoops/admin/# Nuevo: http://your-domain.com/xoops/myadmin123/Configurar XOOPS para usar carpeta renombrada:
Editar mainfile.php:
// Cambiar esta líneadefine('XOOPS_ADMIN_PATH', '/var/www/html/xoops/myadmin123');Lista Blanca de IP para Administración
Sección titulada «Lista Blanca de IP para Administración»Restringir acceso de administración a IPs específicas:
Archivo: /var/www/html/xoops/myadmin123/.htaccess
# Permitir solo IPs específicas<RequireAll> Require ip 192.168.1.100 # Su IP de oficina Require ip 203.0.113.50 # Su IP de hogar Deny from all</RequireAll>O con Apache 2.2:
Order Deny,AllowDeny from allAllow from 192.168.1.100 203.0.113.50Credenciales Fuertes de Administrador
Sección titulada «Credenciales Fuertes de Administrador»Aplicar contraseñas fuertes para administradores:
- Usar al menos 16 caracteres
- Mezclar mayúsculas, minúsculas, números, símbolos
- Cambiar contraseña regularmente (cada 90 días)
- Usar un gestor de contraseñas
- Habilitar autenticación de dos factores si está disponible
Supervisar Actividad de Administración
Sección titulada «Supervisar Actividad de Administración»Habilitar registro de inicio de sesión de administración:
Panel de Administración > Sistema > Preferencias > Configuración de Usuario
Registrar Inicios de Sesión de Administración: SíRegistrar Intentos de Inicio de Sesión Fallidos: SíAlerta por Correo Electrónico en Inicio de Sesión de Administración: SíRevisar registros regularmente:
# Verificar base de datos para intentos de inicio de sesiónmysql -u xoops_user -p xoops_db << EOFSELECT uid, uname, DATE_FROM_UNIXTIME(user_lastlogin) as last_loginFROM xoops_users WHERE uid = 1;EOFMantenimiento Regular
Sección titulada «Mantenimiento Regular»Actualizar XOOPS y Módulos
Sección titulada «Actualizar XOOPS y Módulos»Mantener XOOPS y todos los módulos actualizados:
# Verificar actualizaciones en panel de administración# Admin > Módulos > Verificar Actualizaciones
# O por línea de comandocd /var/www/html/xoops# Descargar e instalar versión más reciente# Seguir guía de actualizaciónEscaneo de Seguridad Automatizado
Sección titulada «Escaneo de Seguridad Automatizado»#!/bin/bash# Script de auditoría de seguridad
# Verificar permisos de archivoecho "Verificando permisos de archivo..."find /var/www/html/xoops -type f ! -perm 644 ! -name "*.htaccess" | head -10
# Verificar archivos sospechososecho "Verificando archivos sospechosos..."find /var/www/html/xoops -type f -name "*.php" -newer /var/www/html/xoops/install/ 2>/dev/null
# Verificar base de datos para actividad sospechosaecho "Verificando intentos de inicio de sesión fallidos..."mysql -u xoops_user -p xoops_db << EOFSELECT count(*) as attempts FROM xoops_audittrail WHERE action LIKE '%login%' AND status = 0;EOFCopias de Seguridad Regulares
Sección titulada «Copias de Seguridad Regulares»Automatizar copias de seguridad diarias:
#!/bin/bash# Script de copia de seguridad diaria
BACKUP_DIR="/backups/xoops"RETENTION=30 # Mantener 30 días
# Copia de seguridad de base de datosmysqldump -u xoops_user -p xoops_db | gzip > $BACKUP_DIR/db_$(date +%Y%m%d).sql.gz
# Copia de seguridad de archivostar -czf $BACKUP_DIR/files_$(date +%Y%m%d).tar.gz /var/www/html/xoops --exclude=cache --exclude=templates_c
# Eliminar copias de seguridad antiguasfind $BACKUP_DIR -type f -mtime +$RETENTION -delete
echo "Copia de seguridad completada a $(date)"Programar con cron:
# Editar crontabcrontab -e
# Añadir línea (se ejecuta diariamente a las 2 AM)0 2 * * * /usr/local/bin/xoops-backup.sh >> /var/log/xoops_backup.log 2>&1Plantilla de Lista de Verificación de Seguridad
Sección titulada «Plantilla de Lista de Verificación de Seguridad»Usar esta plantilla para auditorías de seguridad regulares:
Lista de Verificación de Seguridad Semanal========================
Fecha: ___________Verificado por: ___________
Sistema de Archivos:[ ] Permisos correctos (644/755)[ ] Carpeta de instalación eliminada[ ] Sin archivos sospechosos[ ] mainfile.php protegido
Seguridad Web:[ ] HTTPS/SSL funcionando[ ] Encabezados de seguridad presentes[ ] Panel de administración restringido[ ] Restricciones de carga de archivo activas[ ] Intentos de inicio de sesión registrados
Aplicación:[ ] Versión de XOOPS actualizada[ ] Todos los módulos actualizados[ ] Sin mensajes de error en registros[ ] Base de datos optimizada[ ] Caché limpio
Copias de Seguridad:[ ] Base de datos respaldada[ ] Archivos respaldados[ ] Copia de seguridad probada[ ] Copia fuera del sitio verificada
Problemas Encontrados:1. ___________2. ___________3. ___________
Acciones Tomadas:1. ___________2. ___________Recursos de Seguridad
Sección titulada «Recursos de Seguridad»- Requisitos del Servidor
- Configuración Básica
- Optimización del Rendimiento
- OWASP Top 10: https://owasp.org/www-project-top-ten/
Etiquetas: #security #ssl #https #hardening #best-practices
Artículos Relacionados:
- ../Installation/Installation
- ../../06-Publisher-Module/User-Guide/Basic-Configuration
- System-Settings
- ../Installation/Upgrading-XOOPS