Inicio de sesión: contraseñas, verificación en dos pasos y fuerza bruta
Módulo 7: Seguridad · Tiempo de lectura: 9 minutos
Objetivo de aprendizaje: Después de esta lección podrá proteger el acceso a su sitio con contraseñas fuertes, verificación en dos pasos y limitación de intentos de inicio de sesión, y sabrá qué es xmlrpc.php.
Conceptos clave: gestor de contraseñas, frase de contraseña, contraseña única, verificación en dos pasos (2FA, TOTP), passkey, fuerza bruta, limitación de intentos de inicio de sesión, wp-login.php restringido por dirección IP, xmlrpc.php, nombres de usuario que se filtran (REST, ?author=), contraseñas de aplicación
La contraseña: larga y única
Una buena contraseña tiene dos propiedades:
- Larga: la longitud importa más que los caracteres extraños. Una frase de contraseña de cuatro o cinco palabras aleatorias (
tamiz-pinguino-octubre-farol) es más fuerte y más fácil de recordar queC0ntr4señ4!. Se recomienda una contraseña única de al menos 12 caracteres, preferiblemente una frase de contraseña. - Única: no se usa en ningún otro sitio. El relleno de credenciales (credential stuffing, lección 7.1) solo funciona si reutiliza una contraseña.
Nadie recuerda decenas de contraseñas largas y únicas. Por eso conviene usar un gestor de contraseñas: un programa que las crea, las guarda y las rellena por usted. Así solo tiene que recordar una: la del propio gestor, y esa también la protege con verificación en dos pasos.
Puede comprobar si una contraseña aparece en una filtración de datos conocida en haveibeenpwned.com. Si su dirección de correo electrónico aparece en una filtración, cambie la contraseña en cada servicio donde haya usado esa misma contraseña.
Verificación en dos pasos
Con la verificación en dos pasos (2FA) necesita, además de su contraseña, otra cosa al iniciar sesión: normalmente un código de seis cifras generado por una aplicación en su teléfono (un autenticador, según el estándar TOTP). Un intruso que tenga su contraseña aún no podrá entrar.
WordPress no tiene verificación en dos pasos integrada. La añade mediante un plugin. Hay muchos; uno sencillo es Two Factor, creado por colaboradores del propio proyecto WordPress. Los plugins de seguridad también suelen incluirla. Al elegir, tenga en cuenta:
- aplicaciones TOTP y códigos de respaldo (por si pierde el teléfono); los códigos por correo electrónico son más débiles, porque su buzón también puede ser hackeado;
- la posibilidad de hacerla obligatoria para administradores y editores;
- passkeys: iniciar sesión con su huella dactilar, su rostro o una llave de seguridad, sin contraseña. También existen plugins para esto. Las passkeys son resistentes al phishing, porque solo funcionan en el sitio auténtico.
Active también la verificación en dos pasos en todo lo que rodea a su sitio: su panel de alojamiento, su correo electrónico, su registrador de dominios y su gestor de contraseñas. Un intruso que tome el control de su panel de alojamiento no necesita su contraseña de WordPress.
Fuerza bruta y limitación de intentos de inicio de sesión
Un sitio WordPress abierto recibe intentos de inicio de sesión en wp-login.php durante todo el día, a menudo con admin y listas de contraseñas habituales. Con una contraseña larga y 2FA no logran entrar, pero cada intento consume recursos de su servidor (un arranque completo de WordPress). Con una oleada grande, su sitio se vuelve lento.
WordPress en sí no limita el número de intentos. Lo que ayuda, en orden de «detener cuanto antes»:
- En el servidor: muchos proveedores de alojamiento bloquean una dirección IP que realiza muchos intentos fallidos en poco tiempo, incluso antes de que arranque WordPress (con un cortafuegos o una función del servidor web). Consulte a su proveedor de alojamiento qué ocurre en su caso.
- wp-login.php restringido solo a su dirección IP: con unas líneas en
.htaccess(en LiteSpeed y Apache):
<Files wp-login.php>
Require ip 192.0.2.10
</Files>Esto funciona bien si tiene una dirección IP fija. Si no la tiene (en casa, en su teléfono), se bloqueará a sí mismo si su dirección cambia. Una alternativa es añadir una contraseña extra en la página de inicio de sesión (una «carpeta protegida», autenticación básica) con una contraseña distinta de la de WordPress.
- Un plugin que limita los intentos: tras cinco intentos fallidos, la dirección IP queda bloqueada durante un tiempo. Funciona, pero solo actúa cuando WordPress ya está en marcha, por lo que el consumo de recursos se mantiene.
Ocultar o renombrar la página de inicio de sesión (por ejemplo /mi-login en lugar de /wp-login.php) reduce el ruido en su registro. No es una medida de seguridad real, y algunos plugins y temas esperan la dirección estándar. Está bien como añadido, nunca en sustitución de una buena contraseña y 2FA.
xmlrpc.php
xmlrpc.php es una conexión antigua de la época anterior a la API REST, con la que aplicaciones y otros sitios se comunican con WordPress. Todavía lo utilizan algunas aplicaciones, Jetpack y algunas integraciones. Para la mayoría de los sitios resulta innecesario.
A los intrusos les gusta xmlrpc.php, porque permite probar cientos de contraseñas a la vez en una sola solicitud (con la función system.multicall), y porque puede utilizarse de forma indebida para atacar otros sitios (pingbacks). Qué puede hacer:
- Si no lo usa: bloquéelo. Algunos proveedores de alojamiento, entre ellos WebOké, bloquean xmlrpc.php de forma predeterminada en el servidor. En caso contrario, puede hacerlo con una regla en
.htaccesso con un plugin de seguridad. - Si sí lo usa (por ejemplo para una aplicación que lo necesita): déjelo abierto, pero asegúrese de tener contraseñas fuertes, 2FA y una limitación de intentos. Las aplicaciones modernas suelen usar la API REST con una contraseña de aplicación (lección 3.3).
Nombres de usuario que se filtran
En la lección 3.3 vio que WordPress muestra una derivación de los nombres de usuario:
https://example.com/?author=1redirige a/author/<nombre>/;https://example.com/wp-json/wp/v2/usersmuestra una lista con los slugs de todos los que han publicado algo.
¿Es esto grave? Un nombre de usuario no es una contraseña. Con una contraseña larga y única y 2FA, apenas importa. Pero da a un intruso la mitad de las credenciales de acceso y facilita el phishing dirigido. Medidas razonables:
- asigne a los administradores un nombre de usuario que no coincida con su nombre público, y no publique contenido con una cuenta de administrador (lección 3.3);
- limite la lista de usuarios en la API REST con un plugin de seguridad o unas líneas de código, si no la necesita. No cierre del todo la API REST: el editor de bloques y muchos plugins la necesitan.
Contraseñas de aplicación
Las contraseñas de aplicación (lección 3.3) son una forma segura de dar acceso a una aplicación o sistema, pero sortean su verificación en dos pasos: una aplicación con una contraseña de aplicación no necesita ningún código. Créelas solo cuando sea necesario, con una cuenta de rol bajo, y revóquelas cuando ya no use esa integración.
Resumen
- Utilice contraseñas largas y únicas (frases de contraseña) en un gestor de contraseñas.
- Active la verificación en dos pasos, con un plugin en WordPress y también en su panel de alojamiento, correo electrónico y registrador de dominios.
- Detenga los intentos de inicio de sesión lo antes posible: en el servidor, con una regla de IP o una contraseña extra, o con un plugin.
- Bloquee xmlrpc.php si no lo utiliza.
- Los nombres de usuario filtrados no son un desastre, pero sí una señal: no publique como administrador y limite la lista de usuarios de la API REST si no la necesita.
Cuestionario
Ejercicio
Ejercicio A7.3: ¿Qué muestra su sitio al iniciar sesión? Introduzca la dirección de su sitio y demuestre que es suyo (con el código del ejercicio, como registro TXT o como archivo). El programa comprueba tres cosas: si xmlrpc.php devuelve una lista de funciones (abierto) o está bloqueado, si /wp-json/wp/v2/users muestra nombres de usuario (slugs), y a dónde redirige /?author=1. Indique si necesita xmlrpc.php; si no es así, un xmlrpc.php abierto se marca en rojo. Los slugs filtrados se marcan en naranja con una explicación.
Ejercicio D7.3: Activar la verificación en dos pasos. Active la verificación en dos pasos para todos los administradores de su sitio WordPress, y también en su panel de alojamiento y su correo electrónico. Guarde los códigos de respaldo en su gestor de contraseñas. Marque por cada elemento que está activado y anote qué método utiliza (aplicación, passkey, correo electrónico) y dónde se encuentran los códigos de respaldo. Anote también cómo protege adicionalmente wp-login.php y por qué elige ese método.
Ejercicio D7.3: Activar la verificación en dos pasos
Este ejercicio lo hace usted mismo; nadie lo revisa. Marque lo que haya hecho y señale el ejercicio como realizado.
Para los administradores, utilice preferiblemente una aplicación o una passkey en lugar de solo el correo electrónico. Si tiene una IP fija, puede permitirla en wp-login.php; con direcciones variables, es mejor limitar los intentos de inicio de sesión.
Sus marcas y notas se quedan solo en este navegador; no las enviamos a ningún sitio. Si ha iniciado sesión, en Mis cursos solo guardamos que ha realizado el ejercicio.
Para saber más
Estos artículos describen los pasos en los paneles de WebOké; en otros paneles funcionan de forma similar.
- Manual de DirectAdmin 3.7: Contraseñas seguras y qué hacer en caso de filtración de una contraseña
- Verificación en dos pasos en Mi WebOké y configuración de una aplicación autenticadora
- WordPress: no funciona el acceso a xmlrpc.php
- Proteger wp-login.php de WordPress
- Manual de DirectAdmin 15.9: Carpetas protegidas con contraseña
- Inicio de sesión seguro (Veilig Internetten, administración pública neerlandesa): https://veiliginternetten.nl/veilig-inloggen/
- Ataques de fuerza bruta (developer.wordpress.org, en inglés): https://developer.wordpress.org/advanced-administration/security/brute-force/
