¿Prevenir ataques de fuerza bruta en MySQL?

9

Necesito activar la red para MySQLd, pero cada vez que lo hago, el servidor se ve forzado al olvido. Algunos significan que el script de adivinación de contraseña comienza a martillear en el servidor, abriendo una conexión en el puerto 3306 e intentando contraseñas aleatorias para siempre.

¿Cómo puedo evitar que esto suceda?

Para SSH, uso denyhosts, que funciona bien. ¿Hay alguna manera de hacer que denyhosts funcione con MySQLd?

También he considerado cambiar el puerto en el que se ejecuta MySQL, pero esto es menos que ideal y solo una solución provisional (¿qué pasa si descubren el nuevo puerto?)

¿Alguien tiene alguna otra idea?

Si hace una diferencia, estoy ejecutando MySQL 5.x en FreeBSD 6.x.

Keith Palmer Jr.
fuente

Respuestas:

9

No conozco ningún paquete de software similar a denyhosts para MySQL, pero tengo un par de soluciones:

  • Limite el inicio de sesión a direcciones IP específicas. No use% para permitir que todos los hosts se conecten al servidor.
  • Aún más seguro, configure iptables para permitir solo el acceso a 3306 desde direcciones IP autorizadas.
  • Dirija su tráfico a la caja con ssh y luego conéctese a través de localhost
  • Modifique los scripts Denyhosts o BFD para analizar los registros de acceso de mysql y bloquear cualquier intento de fuerza bruta en el firewall

Editar :

Para responder a su comentario, intente esto :

iptables -A INPUT -p tcp -s 202.54.1.50 --sport 1024:65535 -d 202.54.1.20 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 202.54.1.20 --sport 3306 -d 202.54.1.50 --dport 1024

Donde .20 es su MySQL y .50 es la dirección IP de conexión remota.

Dave Drager
fuente
Algunas notas: ¿Cómo puedo restringir el acceso al puerto 3306 a un conjunto determinado de direcciones IP? Simplemente restringir a los usuarios de MySQL no funciona, ya que las máquinas remotas aún pueden conectarse y aplicar fuerza bruta para las contraseñas. Los túneles SSH parecen algo inconvenientes para el usuario final ... ¿Tiene un ejemplo de IPTables de hacer esto?
Keith Palmer Jr.
2

1: Cambie el puerto de 3306. No por razones de mejor seguridad, sino para tomar la carga del servidor para lidiar con ataques de inicio de sesión falsos

2: Cree un certificado SSL y habilítelo en su servidor MySQL (de todos modos es imprescindible encriptar la conexión cliente-servidor)

3: Cree uno o más certificados de cliente (todos los clientes deben tener el certificado y el software del cliente debe estar configurado para usarlo). Si sus clientes son .Net , necesita convertir el certificado del cliente al formato pkcs12, pero eso se hace fácilmente, vea esto guía.

4: Configure la cuenta de usuario de MySQL para que requiera el certificado de cliente x509, luego un atacante necesita las credenciales de inicio de sesión Y el certificado del cliente (incluso puede poner una contraseña en el certificado del cliente, entonces el atacante también debe solicitarlo).

Utilicé esta guía para hacer los certificados y los archivos clave, pero hay muchas guías disponibles.

Prefiero usar mi conexión SSH solo para acceder a mi Linux box para fines de administración, no para acceso de clientes.

Mr Calvin
fuente
Gracias por la respuesta.
Usé
1

Con MySQL Proxy, puede escribir un pequeño script LUA que tome una combinación usuario / pase pero espere X segundos para procesar el inicio de sesión si la solicitud de conexión proviene de un rango de IP no aprobado.

Además, podría agregar un poco de lógica adicional al script LUA para poner en la lista negra los rangos de IP después de tres intentos fallidos.

En general, es técnicamente factible, pero voy con las otras recomendaciones para hacer un túnel a través de SSH o una VPN a un rango de IP común, incluido en la lista blanca (a través de FW u otros medios).

Oscar
fuente
+1 otro uso más para MySQL Proxy :)
Andy
0

¿Por qué no permitir el acceso al puerto mysqld solo desde hosts seguros?

quaie
fuente
Lo consideré, pero eso significa que tendría que monitorear los cambios de dirección IP para más de 1,000 clientes. Eso sería un dolor gigantesco en el trasero ... ¿Cómo puedo hacer esto de todos modos? No sirve de ayuda para encerrarlos en el plazo de MySQL, debido a que todavía se puede conectar con el servidor MySQL, pero no realmente elegir cualquier base de datos ...
Keith Palmer Jr.
1
citando a Dave Drager arriba: "Modificar los scripts DenyHosts o BFD para analizar los registros de acceso de MySQL y bloquear cualquier intento de fuerza bruta en el firewall" parece la mejor idea o utilizar algunas contraseñas con jeroglíficos :)
Quaie
0

Si bien esta no es una respuesta "real", no sé por qué necesita exponerla directamente al mundo exterior.

¿No puedes habilitar ssh en ese cuadro y usar túneles para acceder al motor de db?

O cualquier otra solución VPN para acceder a ella (me viene a la mente openvpn).

Soleado
fuente
0

No es una solución real al problema, pero podría ayudar si solo ejecuta el servidor en un puerto diferente. La mayoría de esos bots de escaneo probablemente estén programados para verificar 3306. No resolverá el problema, pero probablemente obtendrá muchos menos escaneos simplemente cambiando el puerto.

Eric Petroelje
fuente
-1 por seguridad por oscuridad
thepocketwade
@thepocketwade: por eso dije que no es una solución real al problema. Pero aún podría ser útil.
Eric Petroelje
0

Creo que las conexiones deberían ser cortafuegos: rápido y agradable. Hay muchos tutoriales para iptables y lo que sea :)

También puede instalar un cronjob en los hosts de los clientes que ejecutará algo en un servidor para evitar que el firewall bloquee los hosts conocidos.

Kolypto
fuente
0

usar ssh para túneles sería lo mejor, pero podría intentar usar fail2ban en lugar de denyhosts porque creo que está dirigido a monitorear aplicaciones más diferentes, por lo que no debería ser un problema agregarle el registro mysql.

Jure1873
fuente
0

Sugerencia a tener en cuenta para su sección my.cnf-ini [mysqld]

max_connect_errors=10  # to limit hacker/cracker attempts to guess a password.

para evitar los cientos de intentos en 90 segundos. Cortarlos a los 10 intentos.

Considere una vez al día FLUSH HOSTS para borrar a las personas legítimas que intentan usar su sistema que simplemente NO PUEDEN recordar su contraseña. Tal vez en unos días, lo logren.

Wilson Hauck
fuente