Seguridad del túnel del puerto del servidor web - opciones de seguridad

0

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.

  1. Elatacantepuedesimplementeescanear enlace (65k de ellos) y obtener el número de clientes actualmente conectados
  2. 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?

    
pregunta Mark 21.09.2016 - 13:30
fuente

3 respuestas

2

Me temo que ya ha fallado en el primer obstáculo, ya que está usando HTTP en todas partes. Esto significa que está enviando tráfico de inicio de sesión no cifrado a través de Internet que está sujeto a intercepción y uso indebido. Usted debe tener HTTPS al menos desde el cliente hasta el servidor perimetral.

Tampoco ha tenido en cuenta los ataques de denegación de servicio, aunque no ha dicho si le parece importante. Si todos los servicios están en puertos adivinables, un atacante puede simplemente comenzar a transmitir tráfico a esos.

El uso de múltiples puertos también dificulta que los clientes se conecten cuando están detrás de un firewall. Recomiendo usar un proxy inverso en el borde de la red de su servidor. Ese puede ser tanto el terminador HTTPS, el equilibrador de carga (si es necesario) como el redireccionamiento de las URL a los servicios de back-end apropiados.

En el front-end, los clientes deben usar una carpeta para identificar su origen:

https://myserver.com/servicea
https://myserver.com/serviceb
etc.

El proxy inverso puede redirigirlos a los puertos de back-end correctos.

No necesita nada inteligente con identificadores / contraseñas, aunque si desea reforzar aún más las cosas, puede usar el proxy inverso o un firewall en el extremo del servidor para restringir las conexiones por dirección IP de origen.

    
respondido por el Julian Knight 21.09.2016 - 14:00
fuente
0

Esto debería ser un comentario, pero es un poco largo.

Estoy luchando para descifrar tu descripción del problema. Creo que está intentando decir que tiene una gran cantidad de servidores web detrás de un servidor de seguridad al que desea permitir el acceso restringido a través de un dispositivo de puerta de enlace expuesto en Internet.

Supongo que los servidores web de origen no tienen direcciones IP públicas únicas y, por lo tanto, son clientes ssh para el dispositivo de puerta de enlace.

Lo siento, pero creo que este es un mal diseño y si quieres resolver estos problemas necesitas hacer una copia de seguridad un poco. Incluso si la escalabilidad no es un problema, ya se ha topado con limitaciones en cuanto a cómo enrutar la información al back-end, y es probable que sea bastante frágil.

Configuraré el dispositivo de puerta de enlace como un proxy HTTP directo transparente que requiere autenticación conectada a una VPN. El otro extremo de VPN estaría dentro de la red protegida en un proxy secundario capaz de enrutamiento basado en contenido. En este modelo, puede proporcionar un único certificado SSL en la puerta de enlace para todo el acceso (nunca mencionó SSL; esto es bastante esencial para que se lo considere "seguro"). Tiene la opción de implementar la autenticación de la puerta de enlace utilizando varios métodos (a través de una cookie o NTLM o nombre de usuario y contraseña) que los clientes podrían almacenar en forma segura.

    
respondido por el symcbean 21.09.2016 - 13:58
fuente
0

Puede implementar un servidor VPN conectado a la LAN de los servidores web y configurar los servidores web para permitir solo la conexión desde la VPN:

Client -> VPN -> Proxy -> Webserver

Sus clientes solo tienen un inicio de sesión y una contraseña, y nadie puede conectarse a los servidores web fuera de VPN. Y puedes desplegar HTTPS

No es necesario realizar una configuración demasiado complicada para esto.

    
respondido por el ThoriumBR 21.09.2016 - 17:20
fuente

Lea otras preguntas en las etiquetas