¿Cómo desactivo la capacidad de iniciar sesión?

14 nov 2015, 18:36:58
Vistas: 14.4K
Votos: 5

Durante un gran ataque de fuerza bruta, me gustaría desactivar por completo la capacidad de iniciar sesión en WordPress. La única cuenta en el sitio es la mía, así que no hay razón para que los visitantes inicien sesión y no afectaría su experiencia en el sitio.

Cuando necesite iniciar sesión, puedo eliminar el código. Alternativamente, puedo limitar los inicios de sesión solo a mi dirección IP.

Estoy intentando lograr esto capturando un intento de inicio de sesión lo antes posible con el siguiente código:

if (isset($_POST['pwd']) || isset($_GET['pwd'])) {
    header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
    echo 'los inicios de sesión están deshabilitados en este sitio';
    die();
}

Esto es rudimentario pero debería funcionar. Sin embargo, todavía hay algunos intentos de inicio de sesión que logran pasar y no sé de dónde podrían venir.

¿De qué otra manera WordPress acepta inicios de sesión, si no es con el campo 'pwd'?

¿Existe alguna convención existente para desactivar los inicios de sesión?

Edición: además de detener wp-login.php, eliminé xmlrpc.php que se estaba utilizando como otra entrada para forzar inicios de sesión. Mi configuración actual no lo necesita, pero la tuya podría. Asegúrate de no necesitarlo antes de deshabilitarlo.

10
Comentarios

Pensaría que una contraseña fuerte sería suficiente, a menos que el tráfico esté saturando tu sitio debido a un gran número de procesos PHP + verificaciones de base de datos. En ese caso, podrías probar autenticación HTTP para evitar que los bots accedan a tus archivos wp-login.php o xmlrpc.php (sin procesos PHP + base de datos).

birgire birgire
14 nov 2015 18:48:57

@jas - Intenté eliminar completamente el archivo wp-login.php. Todavía recibo alertas de "login fallido". Pueden iniciar sesión a través de otros métodos, diferentes a la página wp-login.php.

Michael Khalili Michael Khalili
14 nov 2015 22:42:16

@birgire - Tengo contraseñas seguras pero este es un ataque de tamaño considerable. Espero que esto sea algo que pueda implementar en caso de un ataque más grande también. ¿Son wp-login.php y xmlrpc.php los únicos lugares donde alguien puede autenticarse en el sitio?

Michael Khalili Michael Khalili
14 nov 2015 22:44:28

Creo que el plugin Wordfence ofrece la capacidad de bloquear por IP. Los ataques de fuerza bruta son bastante comunes en sitios de cualquier tamaño. También ofrece la capacidad de limitar los intentos de inicio de sesión

cameck cameck
15 nov 2015 02:18:16

@cameck - Ya tengo un plugin que bloquea automáticamente una IP por ataques de fuerza bruta. Mi pregunta está relacionada con bloquear el proceso de inicio de sesión por completo. Antes de que siquiera intente una autenticación.

Michael Khalili Michael Khalili
15 nov 2015 18:05:33

@MichaelKhalili Bueno, podrías usar este plugin: https://wordpress.org/plugins/restricted-site-access/ o existe una forma de editar el archivo .htaccess para lograr esto: http://www.inmotionhosting.com/support/website/wordpress/lock-down-wordpress-admin-login-with-htaccess

cameck cameck
15 nov 2015 18:58:18

@cameck - Restricted Site Access parece restringir el acceso a todo el sitio, no bloquear inicios de sesión. Puedo bloquear wp-admin y wp-login, pero birgire mencionó bloquear xmlrpc.php ¿Ese archivo también permite acceso para iniciar sesión?

Michael Khalili Michael Khalili
16 nov 2015 02:17:01

@MichaelKhalili Hmm tienes razón. Ese enlace es solo para bloquear wp-login mediante .htaccess. No lo he probado personalmente, lo siento, pero ¡yo le daría una oportunidad! ¡Háznos saber qué sucede!

cameck cameck
16 nov 2015 03:14:10

@cameck Finalmente dejé de recibir intentos de inicio de sesión fallidos cuando eliminé el archivo xmlrpc.php. Parece que lo estaban usando como una forma más programática de iniciar sesión.

Michael Khalili Michael Khalili
20 nov 2015 07:18:20
Mostrar los 5 comentarios restantes
Todas las respuestas a la pregunta 3
6

Fallar en la autenticación debería funcionar para todo tipo de posibles métodos de autenticación: formulario de inicio de sesión, XMLRPC, AJAX, etc.

Edición: de hecho, me di cuenta de que hay una manera de evitar enviar la consulta relacionada con el usuario a la base de datos.

function wpse208677_authenticate($user,$username,$pass) {
  // Eliminar el filtro de autenticación por nombre de usuario y contraseña predeterminado
  remove_filter('authenticate','wp_authenticate_username_password',20,3);
  // Devolver null para denegar cualquier intento de autenticación
  return null;
  // Si deseas permitir una IP específica, verifícala aquí y retorna $user
}

// Añadir el filtro personalizado con prioridad 10
add_filter('authenticate','wpse208677_authenticate', 10,3)
14 nov 2015 18:43:46
Comentarios

Eso es útil, pero estoy buscando una forma de cortocircuitar el inicio de sesión desde el principio. Tengo Sucuri y otro plugin instalados que me alertan sobre ataques de fuerza bruta. Me preocupa que esto aún active las acciones en esos plugins.

Michael Khalili Michael Khalili
14 nov 2015 22:40:53

@MichaelKhalili, realmente no puedes hacer eso ya que los intentos de inicio de sesión pueden provenir de todo tipo de fuentes. Si estás interesado en bloquear solo wp-login.php o xmlrpc.php, deberías hacerlo a nivel de configuración del servidor web (htaccess en Apache puede hacer el truco también) y no dejar que se ejecute PHP en absoluto. El único código PHP comparable (en términos de rendimiento) necesitaría una modificación de wp-config.php, que es un archivo que deberías evitar tocar tanto como sea posible. Cualquier otra solución basada en PHP no será mejor en términos de rendimiento que la respuesta.

Mark Kaplun Mark Kaplun
20 nov 2015 07:44:42

Lo he resuelto desde que publiqué la pregunta y actualicé mi publicación. Puedo colocar el código que busca $_POST['pwd'] en un plugin de uso obligatorio (mu-plugins) y deshabilitar xmlrpc.php. Eso parece estar funcionando. Detuve la mayoría de los ataques con $_POST['pwd'] y el resto se detuvo después de deshabilitar xmlrpc.php.

Michael Khalili Michael Khalili
20 nov 2015 18:21:36

El problema con eliminar archivos es que volverán cuando actualices. Es mejor bloquearlos en el htaccess si no usas xmlrpc

Mark Kaplun Mark Kaplun
20 nov 2015 19:20:01

Excelente observación Mark. Creo que también hay una configuración para desactivar el soporte de xmlrpc dentro de WordPress. Necesito reservar tiempo para probar eso. Ni siquiera estoy seguro de cuál es el mecanismo de inicio de sesión dentro de ese archivo.

Michael Khalili Michael Khalili
20 nov 2015 23:41:41

En cuanto a desactivar XML-RPC de forma segura, descubrí que puedes deshabilitarlo usando un filtro add_filter('xmlrpc_enabled', '__return_false'); También hay varios plugins que hacen esto por ti. Yo usé este https://wordpress.org/plugins/disable-xml-rpc/

Michael Khalili Michael Khalili
20 ene 2016 03:25:24
Mostrar los 1 comentarios restantes
2

La respuesta principal aquí es un código PHP horrible, completamente roto. Aquí hay una versión correcta. Mis puntos de reputación son demasiado bajos para comentar en la respuesta original.

Este código se puede colocar al final del archivo wp-config.php en caso de necesidad.

function wpse208677_authenticate($user,$username,$pass) {
  // Elimina el filtro de autenticación por defecto de WordPress
  remove_filter('authenticate','wp_authenticate_username_password',20,3);
  return null;
  // Si deseas permitir el acceso desde ciertas IPs, verifica y retorna $user
}
// Añade el filtro de autenticación personalizado con alta prioridad
add_filter('authenticate','wpse208677_authenticate', 1,3)

Otra opción es prevenir el acceso a las páginas de login/registro. Esto funciona incluso si tienes una URL de login oculta en WordPress. Este código puede colocarse al inicio de wp-config.php (después de la etiqueta <?php).

if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
    // Muestra un mensaje de mantenimiento y detiene la ejecución
    die('Sitio en modo mantenimiento.');
}
19 mar 2018 10:27:08
Comentarios

Lo siento, pero es una muy mala idea poner el código en el archivo wp-config.php. Además, no veo en qué se diferencia tu código de la otra respuesta.

Johansson Johansson
19 mar 2018 10:39:27

La respuesta anterior de Mark K fue actualizada por ti, Jack, ayer, corrigiendo el error tipográfico que yo había arreglado.

Es mala idea poner código en wp-config, esto fue para un escenario de emergencia para alguien que sabe lo que está haciendo. Cuanto antes intervengamos, menos recursos necesita cargar WP para bloquear inicios de sesión.

Branndon Branndon
20 mar 2018 16:17:10
5
-3

puedes solucionar estos problemas usando

cambia el directorio "wp-admin" y protege este directorio usando contraseña con .htaccess

14 nov 2015 19:02:59
Comentarios

Cualquiera que esté considerando esto debe recordar que las solicitudes ajax públicas aún se hacen al directorio wp-admin. Si tu sitio usa ajax, deberías desbloquear la ruta a admin-ajax.php

Michael Khalili Michael Khalili
14 nov 2015 23:14:30

Y como WP usa AJAX en el núcleo, esto no debería hacerse en ningún lugar.

kaiser kaiser
14 nov 2015 23:45:47

Estoy de acuerdo en que no es la solución para "deshabilitar" el registro de usuarios/login, que es la pregunta aquí. Pero @kaiser, ¿por qué dices que esto no debería hacerse? Lo hago en dos sitios web que administro personalmente donde no hay registro de usuarios habilitado. También uso protección con contraseña en .htaccess para el archivo wp-login.php. Si está configurado correctamente, las solicitudes Ajax y otras cosas de wp-admin (JS, CSS, imágenes) no son un problema en absoluto y puede reducir drásticamente las posibilidades de éxito de ataques de fuerza bruta.

cybmeta cybmeta
25 nov 2015 08:01:12

@cybmeta ¿renombraste wp-admin?

kaiser kaiser
25 nov 2015 13:25:34

No, no lo hice. Esa es otra opción pero es menos segura, la URL de administración del sitio puede descubrirse fácilmente, sin importar qué nombre le hayas dado. De cualquier forma, eso no explica por qué bloquear el acceso a esa ubicación no debería hacerse en absoluto. Además, no veo cómo cambiar el nombre es mejor que bloquear el acceso a cierta ubicación. Ten en cuenta que el contexto es que nadie excepto tú va a acceder allí, ¿por qué bloquear el acceso a cualquier otro es malo? Actualmente, en el caso de que solo tú tengas permitido acceder a wp-admin, bloquearía wp-admin con .htaccess incluso si el nombre está cambiado.

cybmeta cybmeta
25 nov 2015 14:06:05