¿Está sufriendo un ataque? Solicite respuesta a incidentes

info@angelforce.eu
WordPress

Lista práctica de comprobación de seguridad para WordPress

Doce pasos de bastionado de WordPress en un orden lógico: desde actualizaciones y plugins abandonados hasta 2FA, XML-RPC, copias, integridad y WAF.

También en:EnglishTürkçeDeutschFrançaisItalianoPolskiNederlandsEesti

Ilustración: Lista práctica de comprobación de seguridad para WordPress

Un sitio WordPress es tan sólido como su plugin, su cuenta o su copia de seguridad más débil. El núcleo de WordPress recibe versiones de seguridad con regularidad; lo que usted le añada y cómo lo gestione depende de usted. Esta lista recoge los controles más importantes, más o menos en el orden en que los aplicaríamos nosotros.

1. Mantenga actualizados el núcleo, los plugins y los temas

Las actualizaciones automáticas en segundo plano del núcleo existen desde WordPress 3.7 y, por defecto, cubren las versiones menores. Desde WordPress 5.5 también puede activar las actualizaciones automáticas de cada plugin y cada tema desde las pantallas de administración.

  • Active las actualizaciones automáticas de los plugins de desarrolladores de confianza y revise el resto cada semana.
  • Las actualizaciones automáticas dependen de WP-Cron. Revise Herramientas > Salud del sitio en busca de errores, porque si el cron falla, las actualizaciones se detienen sin avisar.
  • Asegúrese de que puede volver atrás antes de confiar en las actualizaciones automáticas. La documentación de WordPress recomienda lo mismo.

2. Elimine los plugins abandonados y los que no use

La guía de bastionado de WordPress es clara: mantenga los plugins actualizados y borre los que no use. Desactivarlos no basta, porque el código sigue en el servidor.

El directorio de plugins de WordPress.org le ofrece dos señales de alarma:

  • Un aviso amarillo que indica que un plugin «no se ha probado con las 3 últimas versiones principales de WordPress».
  • Un aviso rojo que indica que un plugin se ha cerrado y ya no se puede descargar. Pasados 60 días se muestra el motivo, y «problema de seguridad» es uno de los motivos posibles.

Un plugin cerrado no recibirá actualizaciones a través de WordPress.org. Sustitúyalo. No instale nunca copias «nulled» (pirateadas) de plugins premium, e instale solo desde WordPress.org o desde proveedores de confianza.

3. Revise las cuentas de administrador

Haga una lista de todas las cuentas con el rol de administrador y elimine las que nadie sepa explicar. Con WP-CLI:

wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

Dé a cada persona su propia cuenta nominal, nunca un usuario admin compartido. Use el rol más bajo que permita hacer el trabajo: la mayoría de los editores de contenido no necesitan ser administradores. Exija contraseñas robustas y únicas, idealmente guardadas en un gestor de contraseñas.

4. Active la autenticación de dos factores

Active la 2FA para todos los administradores. El núcleo de WordPress no incluye 2FA, así que necesita un plugin o un proveedor de inicio de sesión único que la imponga. Dé preferencia a métodos como las llaves de seguridad o las llaves de acceso (passkeys) si su plugin los admite, y guarde los códigos de recuperación en un lugar seguro.

5. Limite los intentos de inicio de sesión y decida qué hacer con XML-RPC

La documentación de WordPress describe wp-login.php y xmlrpc.php como objetivos habituales de los ataques de fuerza bruta. Recomienda limitar los intentos de inicio de sesión en el perímetro (un WAF o una CDN) o en el servidor web. Un plugin de seguridad también puede limitarlos, pero se ejecuta en PHP, así que la opción a nivel de servidor resiste mejor cuando hay mucho tráfico.

Si no usa XML-RPC, desactívelo. Algunas aplicaciones móviles y servicios como Jetpack lo necesitan, así que compruébelo antes. Tenga en cuenta que el filtro xmlrpc_enabled solo desactiva los métodos que requieren autenticación. Los pingbacks y otros métodos sin autenticación siguen funcionando. Para desactivarlo por completo, bloquee el archivo en el servidor web. En nginx:

location = /xmlrpc.php {
    deny all;
}

6. Desactive el editor de archivos integrado

El editor de temas y plugins del escritorio permite a cualquiera con una sesión de administrador modificar código PHP. Desactívelo en wp-config.php:

define( 'DISALLOW_FILE_EDIT', true );

Según la documentación de wp-config.php, DISALLOW_FILE_MODS va más allá y también bloquea la instalación y la actualización de plugins y temas desde el escritorio. Úselo solo si despliega los cambios de otra forma, por ejemplo con Git o WP-CLI.

7. Guarde las copias de seguridad fuera del servidor y fuera de la raíz web

La guía de bastionado recomienda copias de seguridad periódicas tanto de los archivos como de la base de datos, varias instantáneas y un lugar de almacenamiento de confianza. Proteja su integridad con cifrado, hashes registrados o soportes de solo lectura.

De ahí se derivan dos reglas prácticas. Una copia dentro de la raíz web, como un archivo zip en wp-content, puede descargarla cualquiera que adivine su nombre. Una copia en el mismo servidor puede borrarla el mismo atacante. Guarde al menos una copia en un lugar al que no lleguen las credenciales del sitio y pruebe una restauración completa.

8. Compruebe la integridad de los archivos

WP-CLI puede comparar sus archivos con las sumas de comprobación oficiales de WordPress.org sin cargar WordPress:

wp core verify-checksums --include-root
wp plugin verify-checksums --all

El primer comando señala los archivos del núcleo modificados, y --include-root avisa de los archivos inesperados en el directorio raíz. El segundo compara los plugins con las sumas de comprobación de WordPress.org, así que solo sirve para los plugins alojados allí. Busque también archivos PHP en wp-content/uploads, que normalmente solo debería contener archivos multimedia.

9. Use un usuario de base de datos con privilegios mínimos

Dé a cada sitio su propia base de datos y su propio usuario de base de datos, con permisos solo sobre esa base de datos. No se conecte nunca como usuario root de la base de datos.

La guía de bastionado señala que el funcionamiento diario solo necesita SELECT, INSERT, UPDATE y DELETE. No recomienda revocar DROP, ALTER y GRANT, porque los plugins y las actualizaciones principales pueden necesitar cambiar el esquema. Si los elimina de todos modos, mantenga copias de seguridad probadas.

10. Fije los permisos de los archivos

El punto de partida de la guía es 755 para los directorios y 644 para los archivos. Los archivos del núcleo, wp-admin y wp-includes solo deberían poder modificarse con su cuenta de usuario, no desde el servidor web. wp-content es la excepción: el servidor web necesita escribir ahí para las subidas. Para wp-config.php, la guía sugiere 400 o 440.

find /var/www/example -type d -exec chmod 755 {} \;
find /var/www/example -type f -exec chmod 644 {} \;
chmod 440 /var/www/example/wp-config.php

Adapte las rutas y la propiedad de los archivos a su alojamiento antes de ejecutar estos comandos.

11. Envíe cabeceras de seguridad

Cabeceras como Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options y Referrer-Policy añaden protección en el navegador. Siempre que pueda, fíjelas en el servidor web o en la CDN en lugar de hacerlo con un plugin. Empiece con una Content Security Policy en modo report-only, porque los temas y los maquetadores visuales pueden depender de scripts en línea.

12. Ponga un WAF delante

La documentación de WordPress describe tres niveles: plugins de seguridad que filtran las peticiones dentro de WordPress, un cortafuegos a nivel de servidor como ModSecurity y servicios de proxy inverso que filtran el tráfico antes de que llegue a su servidor. Cuanto más lejos se haga el filtrado, menos carga llega a PHP. Un WAF no sustituye a las actualizaciones. Le da tiempo entre la publicación de una vulnerabilidad y la aplicación de su parche.

La versión corta

ÁreaMínimo
ActualizacionesActualizaciones automáticas menores del núcleo activadas, plugins revisados cada semana
PluginsNingún plugin cerrado, abandonado o sin usar instalado
CuentasCuentas nominales, pocos administradores, 2FA para todos ellos
Inicio de sesiónLímite de intentos en el servidor o en el perímetro, XML-RPC bloqueado si no se usa
Cambios de códigoDISALLOW_FILE_EDIT activado
Copias de seguridadFuera del servidor y de la raíz web, restauración probada
IntegridadSumas de comprobación verificadas, sin PHP en las subidas
Base de datosUn usuario por sitio, con permisos solo sobre su propia base de datos
NavegadorHSTS y una CSP probada
PerímetroWAF o proxy inverso delante

Por dónde empezar

Empiece por los cuatro primeros puntos. Llevan poco tiempo y no requieren cambios en su alojamiento. Después, compruebe sus cabeceras actuales con nuestro escáner de cabeceras de seguridad.

Si quiere que se lo comprueben, SecAudit analiza WordPress en busca de malware y web shells, verifica la integridad de los archivos con las sumas de comprobación oficiales y relaciona los plugins instalados con vulnerabilidades conocidas.

Cómo podemos ayudarle

SecAudit

Nuestro propio producto. SecAudit analiza sitios WordPress en busca de malware, código vulnerable, archivos modificados y vulnerabilidades conocidas, y convierte los resultados en informes vinculados a OWASP, el RGPD y NIS2.

Escáner de cabeceras HTTP

Califique cabeceras de seguridad, cookies y certificado TLS de una web, con la solución a cada hallazgo.

Contacte con nosotros
Equipo de AngelForce

Escrito por el equipo de AngelForce: consultores de seguridad con certificaciones CEH, LPT Master y CISA que prueban, supervisan y protegen los sistemas de organizaciones de toda Europa y Türkiye.

Redactado con ayuda de IA a partir de las fuentes públicas que se indican más abajo y revisado por el equipo de AngelForce antes de su publicación.

Fuentes

  1. developer.wordpress.org/advanced-administration/security/hardening/
  2. developer.wordpress.org/advanced-administration/security/brute-force/
  3. developer.wordpress.org/plugins/wordpress-org/alerts-and-warnings/
  4. developer.wordpress.org/reference/hooks/xmlrpc_enabled/
  5. developer.wordpress.org/cli/commands/core/verify-checksums/
  6. wordpress.org/documentation/article/plugins-themes-auto-updates/

Artículos sobre WordPress

Cuéntenos qué necesita proteger

Describa su entorno y lo que quiere conseguir. Le responderemos por correo electrónico.

Contacte con nosotros
info@angelforce.eu

AngelForce OÜ · Tallinn, Estonia