Cómo proteger el acceso a WordPress
Respuesta corta: da a cada administrador una contraseña larga y única y autenticación en dos pasos, limita cuántos intentos de acceso puede hacer una misma dirección y elimina las cuentas de administrador que nadie usa. El núcleo de WordPress no limita los intentos de acceso por sí mismo, así que añade un límite en el servidor web, en la CDN o con un plugin. Cambiar solo la URL de acceso no es protección.
Pasos rápidos
- Ordena las cuentas de administrador. Elimina los administradores que no se usan y da al resto el rol más bajo que les sirva.
- Activa el acceso en dos pasos. Usa una app TOTP con códigos de respaldo para cada administrador y editor.
- Limita wp-login.php. Limita los intentos por dirección IP en el servidor, en la CDN o con un plugin.
- Restringe o cierra otras puertas. Bloquea XML-RPC si no lo usas y revisa las contraseñas de aplicación.
- Cierra las sesiones robadas. Ante cualquier sospecha, cambia las claves secretas para que todas las sesiones terminen.
El código y la configuración se mantienen en inglés.
Por qué la página de acceso es la puerta principal
Los bots prueban contraseñas comunes y filtradas contra /wp-login.php y /xmlrpc.php todo el día en casi cualquier sitio WordPress. La mayoría no acierta por astucia, sino porque una contraseña se reutilizó en otro sitio que sufrió una filtración. Una sola contraseña de administrador robada basta para instalar un plugin malicioso, así que el acceso merece varias capas.
1. Ordena las cuentas de administrador
Lista a todas las personas con control total y elimina o rebaja a quien no lo necesite. Quienes escriben contenido rara vez necesitan más que el rol de Editor o Autor.
wp user list --role=administrator --fields=ID,user_login,user_email,user_registeredCada persona tiene su propia cuenta (nada de un acceso «admin» compartido) y una contraseña larga y única de un gestor de contraseñas. Si tu sitio aún tiene un usuario llamado literalmente admin, crea un nuevo administrador, pásale el contenido y borra el antiguo.
2. Activa la autenticación en dos pasos
El acceso en dos pasos frena la mayoría de los ataques con contraseñas robadas, porque el atacante también necesita un código del teléfono del usuario. El plugin gratuito Two Factor del directorio de plugins de WordPress.org admite apps de autenticación (TOTP), códigos por correo y códigos de respaldo. Instálalo y cada usuario lo activa en Usuarios → Perfil. Prefiere una app de autenticación a los códigos por correo, entrega a los usuarios sus códigos de respaldo y exígelo a cada administrador y editor. Muchas suites de seguridad ofrecen la misma función si ya usas una.
3. Limita los intentos de acceso
El núcleo de WordPress no limita los accesos fallidos, así que los bots pueden probar sin fin. El mejor sitio para frenarlos es antes de que se ejecute PHP. En nginx, un límite de peticiones en la página de acceso deja pasar a los usuarios reales y ralentiza a los bots:
# in the http { } block
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=10r/m;
# in the server { } block, above your general PHP location
location = /wp-login.php {
limit_req zone=wplogin burst=5 nodelay;
limit_req_status 429;
# then the same fastcgi lines as in your location ~ \.php$ block, e.g.:
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php-fpm.sock;
}Pruébalo en tu propio sitio; tras unas cuantas peticiones rápidas deberías ver 429:
for i in $(seq 1 20); do curl -s -o /dev/null -w '%{http_code} ' -X POST https://yourdomain.com/wp-login.php; done; echoDetrás de Cloudflare, una regla de rate limiting para la ruta /wp-login.php hace lo mismo en el borde. En un hosting compartido sin acceso al servidor, un plugin reconocido para limitar intentos de acceso es la opción práctica.
4. Permite el acceso solo desde direcciones conocidas (opcional)
Si todas las personas que acceden trabajan desde direcciones IP fijas, puedes cerrar la página de acceso a todos los demás. En Apache 2.4, en .htaccess:
<Files "wp-login.php">
Require ip 203.0.113.10 198.51.100.0/24
</Files>No bloquees /wp-admin/admin-ajax.php: muchos temas y plugins lo usan para los visitantes. Sáltate este paso si tu equipo accede desde redes cambiantes o si los clientes inician sesión en una tienda; usa 2FA y el límite de intentos en su lugar.
5. Cierra las otras puertas
XML-RPC es una API remota antigua que también acepta contraseñas. Si no usas la app móvil de WordPress ni Jetpack, bloquéalo como se describe en la lista de bastionado de WordPress. Las contraseñas de aplicación permiten a herramientas externas usar la API REST; revísalas en Usuarios → Perfil y revoca las que no reconozcas. Si nada las usa, desactiva la función con un pequeño plugin must-use:
<?php
// wp-content/mu-plugins/no-app-passwords.php
add_filter( 'wp_is_application_passwords_available', '__return_false' );6. Si sospechas que han robado una contraseña
Cambia la contraseña y después sustituye las claves secretas de wp-config.php. Eso cierra todas las sesiones en todos los dispositivos, incluida la del atacante:
wp config shuffle-saltsDespués busca administradores o plugins que no hayas añadido tú, como se explica en Cómo saber si tu WordPress está hackeado.
¿Y ocultar la URL de acceso?
Mover wp-login.php a una dirección secreta reduce el ruido de bots en tus registros, pero no es protección: la dirección se filtra a través de enlaces y plugins, y no sirve de nada contra una contraseña filtrada. Úsalo como extra, después de 2FA y del límite de intentos.
Qué comprueba HackGrade
El análisis gratuito señala los nombres de usuario que WordPress muestra públicamente, un endpoint XML-RPC abierto y el núcleo, plugins y temas de WordPress desactualizados con vulnerabilidades conocidas. Nunca intenta adivinar contraseñas, ni siquiera en el análisis profundo.
Preguntas frecuentes
¿WordPress limita los intentos de acceso por defecto?
No. El núcleo de WordPress no limita los accesos fallidos. Añade un límite en el servidor web, en tu CDN o con un plugin.
¿Qué método de dos pasos debo usar en WordPress?
Una app de autenticación (TOTP) con códigos de respaldo guardados. Los códigos por correo son mejor que nada, pero quien entre en el buzón también obtiene el código.
¿Debo cambiar la URL de wp-admin?
Reduce el ruido de bots, pero no frena a un atacante decidido ni una contraseña filtrada. Hazlo solo además de 2FA y del límite de intentos.
¿El límite de intentos bloqueará a mis clientes?
No con un límite razonable, como 10 intentos por minuto con un pequeño margen. Las personas reales casi nunca inician sesión más de unas pocas veces por minuto.