Estoy desarrollando un sistema que permite el acceso a dispositivos cliente detrás del firewall, utilizando un túnel de puerto a través de SSH. Cada cliente tiene un servidor dedicado basado en Linux, con el puerto 80 conectado al servidor público. De esa manera, los clientes pueden tener habilitadas la dirección IP dinámica y el firewall, no se necesita reenvío de puertos en el enrutador.
Cada cliente tiene su propio puerto, por ejemplo.
- Cliente A - > puerto 8888
- Cliente B - > puerto 8889
- Cliente C - > puerto 8890
Pueden conectarse desde cualquier lugar a su propio servidor web simplemente llamando a http://mypublicserver.com:[their_assigned_port_no]
Puedoveralgunosproblemasdeseguridad,aunque.
- Elatacantepuedesimplementeescanear
enlace (65k de ellos) y obtener el número de clientes actualmente conectados - Teniendo eso en cuenta, realiza cualquier ataque en su pantalla de inicio de sesión, DOS en su máquina, intenta acceder a PhpMyAdmin, fuerza bruta, etc.
También hay una limitación, ya que no puedo asignar más de ~ 60k clientes ... No es un problema en este momento ya que no espero alcanzar más de 10k de ellos. Sin embargo, tener que adivinar el número de puerto no es difícil en absoluto. También es propenso a un error, alguien podría estar intentando iniciar sesión con sus propias credenciales en la máquina de otra persona porque escribió 8989 en lugar de 8898.
Como defensa, pensé en un valor de cadena adicional (hash o algo) enviado con la solicitud de la página de inicio de sesión. Si falta o es incorrecto, devuelva 404. De esa manera, no podrá acceder a la página de inicio de sesión si no conoce el valor de la cadena, pero es casi imposible obtenerla sin tener este sitio marcado, porque una cadena corta sería más fácil para recordar, pero también más fácil de romper.
Otra forma (y esta es actualmente mi favorita) es iniciar sesión a través de la interfaz web de enlace . Inicia sesión con otro conjunto de credenciales que te redirige a enlace con la clave de autenticación (almacenada dentro de la base de datos de mypublicserver) enviada como datos POST . Una vez que la clave de inicio de sesión exitosa se invalida, se genera una nueva y se envía a mypublicserver desde el servidor web del cliente.
Pero esto también significa la necesidad de recordar 2 conjuntos de contraseña de inicio de sesión, lo que probablemente genere confusión ( "¿Por qué debo iniciar sesión dos veces ?!" )
Ya tengo:
- cambió la ubicación predeterminada de phpmyadmin
- introdujo el bloqueo de cuenta con más de 10 intentos de inicio de sesión fallidos
¿Qué piensas de eso? ¿Me perdí algo importante? ¿Cómo puedo asegurar ese sistema?