Checklist de Hardening WordPress

42 controles de seguridad · 7 categorías · 3 niveles de dificultad

Asentic www.asentic.cl
Ciberseguridad · Chile
Usa este checklist para auditar la seguridad de tu instalación WordPress. Marca cada control que ya tienes implementado. Los controles sin marcar son tu plan de trabajo. Nivel de dificultad: Fácil = sin conocimientos técnicos avanzados · Medio = requiere acceso al servidor o panel de hosting · Avanzado = requiere configuración técnica o desarrollo.
42controles totales
7categorías
__/42tu score (completa al auditar)
01

Headers HTTP

8 controles
ControlDificultad
Content-Security-Policy (CSP) configuradoSin unsafe-eval. Idealmente sin unsafe-inline en script-src. Ver artículo CSP en WordPress en el blog de Asentic. Avanzado
Strict-Transport-Security (HSTS) activomax-age ≥ 31536000 (1 año). Agrega includeSubDomains si aplica. Medio
X-Frame-Options: DENY o SAMEORIGINPreviene clickjacking. DENY si no usas iframes propios. Fácil
X-Content-Type-Options: nosniffEvita que el navegador adivine el MIME type de las respuestas. Fácil
Referrer-Policy configuradostrict-origin-when-cross-origin es el valor recomendado para la mayoría de los sitios. Fácil
Permissions-Policy sin accesos innecesariosRestringe geolocation, microphone, camera, interest-cohort según lo que el sitio realmente necesita. Fácil
Header Server oculto o genéricoNo debe revelar versión exacta de Apache/nginx. Configurable en .htaccess o nginx.conf. Medio
X-Powered-By eliminadoNo debe revelar versión de PHP. Se puede eliminar con Header unset X-Powered-By en Apache. Fácil
02

Autenticación y acceso wp-admin

7 controles
ControlDificultad
Autenticación de dos factores (2FA) activa para administradoresPlugins recomendados: WP 2FA, Two Factor. Usar TOTP (app como Google Authenticator o Authy). Fácil
URL de login cambiadaNo usar /wp-admin/ ni /wp-login.php públicamente accesibles. Plugin: WPS Hide Login. Fácil
Límite de intentos de login configuradoBloquear IP tras N fallos consecutivos (recomendado: 5 intentos). Plugin: Limit Login Attempts Reloaded. Fácil
XML-RPC deshabilitado si no se usaVector de ataques de fuerza bruta y DDoS. Si no usas Jetpack o apps móviles WP, desactívalo. Fácil
Enumeración de usuarios bloqueada/?author=1 no debe redirigir ni revelar nombres de usuario. Bloquear en .htaccess o con plugin. Medio
Ningún usuario administrador se llama "admin"Es el primer usuario que los atacantes prueban en ataques de fuerza bruta. Renombrar si existe. Fácil
Contraseñas de administradores ≥ 16 caracteresUsar el generador de contraseñas de WordPress o un gestor (Bitwarden, 1Password). Sin reutilización. Fácil
03

Plugins y temas

6 controles
ControlDificultad
Sin plugins inactivos instaladosLos plugins desactivados siguen siendo código ejecutable. Eliminar los que no se usen. Fácil
Todos los plugins actualizados a la última versiónLa mayoría de compromisos de WordPress ocurren por plugins desactualizados con CVEs conocidos. Fácil
Sin temas inactivos instaladosMantener solo el tema activo (y Twenty Twenty-X si es el parent theme). Eliminar el resto. Fácil
Plugins instalados solo desde fuentes oficialesWordPress.org o el desarrollador original. Sin plugins "nulled" ni de fuentes desconocidas. Fácil
Ningún plugin activo con CVE público sin parcheVerificar en WPScan Vulnerability Database (wpscan.com) o Wordfence Intelligence. Revisar mensualmente. Medio
Plugin de seguridad activo y configuradoWordfence (gratuito), iThemes Security o Solid Security. Configurar al menos escaneo de archivos y alertas. Fácil
04

Actualizaciones

4 controles
ControlDificultad
WordPress core en última versión estableVerificar en el panel o con WP-CLI: wp core check-update. Actualizar si hay versión disponible. Fácil
Actualizaciones automáticas menores habilitadasLas actualizaciones de seguridad de parche (5.x.y) deben aplicarse automáticamente. Verificar en wp-config.php: define('WP_AUTO_UPDATE_CORE', 'minor'); Fácil
Revisión mensual de actualizaciones mayores agendadaLas versiones mayores (6.x) requieren revisión manual. Agendar revisión el primer lunes de cada mes. Fácil
Entorno de staging para probar actualizaciones antes de producciónEspecialmente importante antes de actualizaciones mayores. Muchos hostings ofrecen staging con un click. Medio
05

Base de datos

5 controles
ControlDificultad
Prefijo de tabla distinto al predeterminado wp_Cambiarlo reduce el impacto de ataques SQLi automatizados. Configurable en instalación o con plugin WP-DBManager. Medio
Usuario de base de datos con mínimos privilegiosSolo necesita SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER sobre su propia DB. No usar root. Medio
Base de datos no accesible desde internetMySQL/MariaDB debe hacer bind a 127.0.0.1. Verificar con netstat -tlnp | grep 3306. Medio
Backup de DB diario con retención mínima 30 díasPlugin UpdraftPlus o BackWPup. Almacenar en destino remoto (S3, Google Drive, Dropbox). Fácil
wp-config.php con permisos 600 y protegidoMover un directorio por encima del webroot si el hosting lo permite. Permisos: chmod 600 wp-config.php. Medio
06

Archivos y permisos

6 controles
ControlDificultad
Carpetas con permisos 755, archivos con 644El servidor web necesita leer los archivos pero no escribirlos. Verificar con find . -type f ! -perm 644. Medio
Edición de archivos desde el panel deshabilitadaAgregar a wp-config.php: define('DISALLOW_FILE_EDIT', true);. Previene edición en caso de compromiso de credenciales. Fácil
Versión de WordPress ocultaEliminar <meta name="generator"> del head y del feed RSS con remove_action en functions.php. Fácil
.htaccess protege wp-config.php y wp-includes/Bloquear acceso directo a wp-config.php y a archivos PHP dentro de wp-includes/ vía Apache rules. Medio
Directorio /wp-content/uploads/ sin ejecución PHPAgregar a .htaccess dentro de uploads: php_flag engine off. Evita que archivos subidos se ejecuten como scripts. Fácil
Instalación de plugins/temas deshabilitada desde el panelEn entornos de producción estables: define('DISALLOW_FILE_MODS', true);. Actualizar vía WP-CLI o staging. Avanzado
07

Backups y monitoreo

6 controles
ControlDificultad
Backup completo (DB + archivos) con frecuencia diariaUsar UpdraftPlus, BackWPup o snapshot del hosting. Al menos 1 backup completo por día para sitios activos. Fácil
Backup almacenado en ubicación remotaNo solo en el propio servidor. Si el servidor es comprometido o falla el disco, el backup local no sirve. Usar S3, Google Drive, Dropbox o Backblaze B2. Fácil
Restauración de backup probada en los últimos 90 díasUn backup no verificado no es un backup. Restaurar en staging y confirmar que el sitio funciona correctamente. Medio
Monitoreo de integridad de archivos activoWordfence o iThemes Security generan una firma de los archivos core y alertan si alguno cambia inesperadamente. Fácil
Alertas configuradas ante cambios en archivos coreEl monitoreo debe notificar por email (o Slack/webhook) cuando detecta cambios. Verificar que las alertas lleguen. Fácil
HTTPS forzado en todas las URLs del sitioSin mixed content (recursos HTTP en página HTTPS). Verificar con herramientas como Why No Padlock. Redirigir HTTP → HTTPS en .htaccess. Fácil