Securizando contenido mediante el uso de tokens

Los invisibles de la CDN

Las redes de entrega de contenido desempeñan un papel fundamental en la difusión de vídeo y, más precisamente, en la securización de la propia transmisión. En los últimos años hemos tenido la oportunidad de trabajar mucho este punto mediante el uso de tokens junto a uno de nuestros clientes. En el post de hoy os cuento lo que hemos logrado juntos.

A diferencia de otros recursos susceptibles de ser suministrados por una CDN, los vídeos presentan una característica diferenciadora: pesan, pesan mucho. De acuerdo con nuestra monitorización de tráfico en tiempo real, más del 30% del tráfico entregado diariamente por nuestra CDN corresponde a recursos de vídeo a pesar de ser estos solo un 1% del total de peticiones o requests

Sirva este dato simplemente para ilustrar el peso del que hablo porque influye de forma directa en el ancho de banda y en el coste que supone el tráfico saliente o egress. Dimensionar correctamente estas dos variables es imprescindible para garantizar la calidad del servicio (disponibilidad, tiempo de respuesta, baja latencia, etc.) y la experiencia de usuario.

Así distribuimos los vídeos en este equipo

En Transparent Edge – y con permiso de Julio César– seguimos un enfoque dívide et ímpera. Esta aproximación nos invita a dividir un problema complejo en subproblemas de naturaleza equivalente aunque más sencilla y, en consecuencia, abarcables con mayor facilidad. Así pues, realizamos la transmisión de manera escalonada y progresiva, en pequeños fragmentos más livianos que reciben el nombre de chunks.

Pasamos de tener un único recurso, un vídeo de cierta duración, a tener una multitud de pequeños recursos. Para determinar el orden en el que se reproducen estos chunks, utilizamos un índice. A estos índices los llamamos manifiestos o manifests

En caso de un vídeo bajo demanda, su manifiesto podría ser el índice de todos los chunks que constituyen dicho vídeo, de principio a fin; por el contrario, ante una emisión en directo, este manifiesto se irá refrescando paulatinamente a medida que avanza la emisión. 

En términos de políticas de caché, en el primer caso podríamos fijar tiempos relativamente altos de persistencia, por ejemplo, con un ‘max-age‘ de una semana en la cabecera ‘Cache-Control‘. Sin embargo, en el segundo, la política de caché debería ser radicalmente distinta: con una persistencia mínima, de unos pocos segundos, dependiendo de la duración de estos chunks.

Cómo securizar el contenido con tokens

Podemos imaginar un token como una especie de firma dinámica que genera la aplicación desde la que el usuario reproduce el contenido y que es verificada por el origen del cliente. Decimos que es dinámica porque se va actualizando a medida que avanza la reproducción, siendo válida tan sólo durante cierto periodo de tiempo.

Para generar un token necesitamos ciertas variables: la dirección IP del usuario, el inicio y fin del periodo de validez del token, una clave secreta, etc. Las variables concretas dependen en cada caso de las necesidades particulares de cada cliente. 

En cualquier caso, estas variables se concatenan de una determinada forma (ej. [<IP address>][<valid from>][<valid until>][<secret key>]) y se les aplica una función criptográfica o hash. Esta función convertirá la cadena de entrada en una secuencia ininteligible de caracteres, como si el gato de Schrödinger hubiese podido escapar de su caja y, enfurecido (y zombi, quizá), se hubiera puesto a pegar saltos sobre el teclado del ordenador.

El hash resultante, junto con las variables públicas (la dirección IP del usuario y el inicio y fin del periodo de validez del token), nos permitirá componer el token en sí, que será remitido al origen (backend) del cliente, por ejemplo: <IP address>-<hash>-<valid from>-<valid until>

La petición recibida por el origen recogerá este token y extraerá los distintos campos que lo conforman. Tomará las variables y, junto con la clave secreta, repetirá los mismos pasos ejecutados con anterioridad del lado del usuario y comparará los hashes resultantes. Para que el token recibido sea válido, necesariamente ambos deberán coincidir.

En este punto, nos podemos encontrar distintos escenarios: 

  • si el origen no recibe ningún token o si éste no es válido, el origen podría responder con un status code 401 (Unauthorized)
  • si el periodo de validez del token aún no ha comenzado, el origen podría devolver un 404 (Not Found); 
  • si el periodo de validez ha expirado, el origen podría entregar un 410 (Gone).

El reto desde el punto de vista de una CDN

El uso de token afecta irremediablemente a la clave de caché. Cada petición será distinta de todas las demás, aunque hagan referencia al mismo recurso o asset (chunk o manifest), desplomando el hit ratio y la eficiencia de la propia caché.

Para afrontar este problema podemos seguir dos estrategias:

  1. Implementar una verificación previa o preflight request para que al recibir una petición de contenido securizado con token se invoque a un servicio externo en el origen (backend) del cliente para que nos indique si el token es o no válido y, en caso afirmativo, devolver el objeto en caché. Para ello, Varnish Enterprise nos proporciona herramientas muy interesantes, como es el caso del VMOD http. Esta aproximación es similar a la que seguimos en otros casos de uso y escenarios de naturaleza muy distinta a la que ahora nos ocupa, como puede ser la implementación de muros de pago o paywalls.
  2. Delegar el mecanismo de verificación del token en la propia CDN. Para ello es necesario que el cliente comparta con nosotros la forma en la que se genera la firma. Esta es la estrategia que hemos utilizado en el caso que os expongo hoy.  En Transparent Edge proporcionamos una solución out-of-the-box para proteger contenido mediante token y que puede ser integrada sin mayor complicación en la configuración VCL de nuestros clientes. Aquí, Varnish Enterprise pone a nuestra disposición el VMOD crypto, que nos facilita la vida a la hora de llevar a cabo las operaciones criptográficas de las que hablábamos antes.

La principal ventaja que aporta el enfoque elegido es, no ya sólo garantizar una adecuada eficiencia de caché, sino también liberar al origen (backend) del cliente de toda la computación que requiere validar uno tras otro los distintos tokens remitidos en las peticiones subyacentes. Además, ejecutar estos cálculos en el edge favorece la experiencia de usuario gracias a la red de nodos distribuida estratégicamente por el mundo. 

En el caso que abordamos en este post hemos trabajado junto a nuestro cliente durante los últimos años, es un honor seguir caminando a su lado y adaptando nuestras funcionalidades a las necesidades particulares de cada proyecto.

Como recitaba Antonio Machado, «Caminante, son tus huellas el camino y nada más; caminante, no hay camino, se hace camino al andar».

Seguimos caminando.

Alberto Suárez López es administrador de sistemas en Transparent Edge.

Más asturiano que la sidra, Alberto estudió Ingeniería Técnica en Informática de Gestión y un Posgrado en Ingeniería Web en la Universidad de Oviedo. Desde entonces, se ha enfrentado con todos los tipos de infraestructura UNIX posibles y ha doblegado a todos gracias a sus vastos conocimientos que hacen de él un todoterreno ante cualquier problema técnico.