Seguridad en Websockets

Siguiendo con nuestra serie sobre WebSockets, debes estar de acuerdo que en el desarrollo web es imprescindible hablar sobre seguridad. Es cierto que la web está creciendo y evolucionando cada día más rápido, y sobretodo lo hacen las aplicaciones que involucran a personas. Estas aplicaciones piden tecnologías que, por ejemplo, sepan lidiar con la “baja latencia de comunicaciones”, como es el caso de los websockets, pero también se incrementa la preocupación sobre la seguridad.

Si no recuerdas qué son los websockets, te animo a leer los siguientes artículos:

En este artículo quiero discutir contigo sobre algunos de los elementos sobre seguridad y websockets que debes tener en cuenta a la hora de desarrollar, o desplegar tus aplicaciones.

¿Cómo garantizar la máxima seguridad para tu Websocket?

SSL sobre Websockets

A día de hoy, ya no se puede pensar de otra forma. Pensar en seguridad y en websockets es lo mismo que utilizar “wss://” envés de transportes no encriptados en “ws://”. Como en HTTP(S), el objetivo de WSS (Websockets sobre SSL/TLS)  es añadir una capa de seguridad sobre tus comunicaciones.

Puedes utilizar, por ejemplo un servidor tipo Nginx para websockets de proxy inverso y habilitar SSL, protegiendo así tu sistema de ataques de intermediarios, en los que una persona envía mensajes a otros como intermediario invisible para tu comunicación.

Validación adecuada de las entradas procedentes del cliente

Es buena idea asumir que en Websockets puedes lidiar con datos arbitrarios, ya que se pueden establecer conexiones Websocket fuera de un navegador. Por eso debes validar cualquier - todas - entrada que provenga de un cliente.

Recuerda que los ataques por inyección SQL no son solamente una cuestión de HTTP, también son posibles en los WebSockets. Por cierto, también es buena idea validar los datos que retorna el servidor. ;)

Autorización y Autenticación

Websocket y su protocolo no se encargan de la autenticación de forma automática. Eso significa que te toca a ti tomar medidas para asegurar la conexión Websocket. Por eso es recomendable autenticar a los usuarios antes que se establezca la conexión WS. Siempre puedes utilizar alguna biblioteca para el mismo efecto.

Una forma de asegurar la conexión, es utilizar el mismo mecanismo de autenticación de HTTP, que ya conoces, en tus conexiones Websocket. De hecho es común tener un servidor que se encarga de los WebSockets completamente separado del que se encarga de las peticiones HTTP normales.

CORS y encabezado de origen (Origin)

Cualquier aplicación puede conectarse a otra aplicación que tenga conexión por websocket, y comunicarse entre sí sin ninguna restricción, como hemos leído anteriormente. Esto pasa porque WebSocket no viene con CORS de forma nativa. Una forma de “arreglarlo”, es verificando el campo de encabezado “Origin” en el “apretón de manos” de websocket.

El encabezado Origin sería análogo al encabezado X-Requested-With que ya utilizas en tus peticiones AJAX. Como este encabezado puede ser definido por clientes que no son navegadores, no se puede confiar como fuente de autenticación.

Lo mismo pasa con el encabezado Origin. Por lo tanto, es mejor utilizarlo como diferenciador de peticiones Websocket - de diferentes hosts - y no basarse en él como fuente de autenticación. De toda las formas, vale la pena referir también que los navegadores modernos no permiten cambiar el header Origen mediante Javascript.

Ataque de denegación de servicio

Los ataques de denegación de servicio, Denial of Service (DoS),  son de los más comunes, como bien sabes. Son un intento de hacer que la máquina, o los recursos de red estén indisponibles para los usuarios que los soliciten.

Por eso, vale la pena implementar “Rate limiting”, e implementar así un control para bloquear visitantes sospechosos. El Rate Limiting te permite configurar umbrales, definir respuestas y obtener información específica, o puntos de conexión. De esta manera puedes completar la protección DoS, y evitar intentos de sesión por "fuerza bruta" u otros comportamientos abusivos.

Conclusión

Estos son solamente algunos de los puntos sobre seguridad en el diseño web que debes tener en cuenta sobre la seguridad en Websockets. Si quieres entrar en detalles, o necesitas algún tipo de aclaración, ya sabes donde encontrarnos.

La seguridad es un elemento que no podrás dejar para después si quieres tener un aplicación desarrollada con Websockets, u otro sistema. Te animo a recordar que el CORS se aplica solamente al esquema HTTP URI, los atacantes pueden conectarse a los servidores de WS sin autenticación/autorización, y que puede ser muy buena idea utilizar los controles de seguridad incorporados en los frameworks y bibliotecas de Websockets existentes.

¿Cómo haces el control de seguridad de tus conexiones WebSocket?

Fotografía: TheDigitalWay en Pixabay

Fuentes: