Blog de Amazon Web Services (AWS)

Protegiendo su transmisión de vídeo con autenticación por tokens

Por Osmar Bento, Arquitecto de Soluciones AWS Brasil
Arturo Velasco, Arquitecto de Soluciones AWS Brasil
Gustavo Barbosa, Arquitecto de Soluciones AWS Brasil

 

Cada día, más compañías están construyendo flujos de trabajo multimedia, transmisiones de vídeo en vivo o bajo demanda. Las transmisiones de vídeo se han convertido en una herramienta estándar en el mercado para llegar a un público objetivo, dejando de ser exclusivas del conglomerado de medios. Escuelas, empresas tecnológicas, bancos, tiendas minoristas, empresas pequeñas, medianas y grandes están creando contenido multimedia y lo distribuyen directamente a los espectadores.  Con el crecimiento exponencial del contenido multimedia, así como su valor, la creación de estrategias para protegerlo se ha convertido cada vez más en una tarea de suma importancia, tanto para proteger los derechos de autor, como para garantizar la entrega unicamente al público al que va dirigido.

 

Métodos de autorización de Amazon CloudFront

Las empresas que distribuyen contenido a través de Internet necesitan proteger su contenido, y evitar la redistribución no autorizada en medios digitales. Amazon CloudFront permite distribuir contenido privado por medio de URLs o cookies firmadas. También puede integrar la autenticación por token en su distribución a través de Lambda @Edge. Lambda @Edge es una función de Amazon CloudFront que le permite ejecutar código cerca de los usuarios de la aplicación, reduciendo así la latencia y permitiendo con ello aumentar el rendimiento.

Como se describió previamente, Amazon CloudFront ofrece diferentes estrategias para proteger el contenido:

  • Puede restringir el acceso a contenido privado mediante el uso de URLs o cookies firmadas en la distribución de CloudFront.
  • Asegurar que el usuario acceda unicamente al contenido mediante una URL de CloudFront en lugar de permitir que acceda directamente a una URL desde el origen (como puede ser una URL de un bucket de Amazon Simple Storage Service (Amazon S3)). No es necesario utilizar una URL de CloudFront, pero recomendamos que evite que los usuarios crucen los controles de seguridad que han sido creadas, como URLs o cookies firmadas.
  • Puede activar una función Lambda para autorizar cada solicitud de visualización llamando un servicio de administración y autenticación de usuarios, como Amazon Cognito.

En esta publicación, implementaremos la autorización por tokens web en la distribución de CloudFront usando Lambda @Edge, protegiendo la transmisión de vídeo en vivo u OTT bajo demanda.

 

JSON Web Tokens (JWT) con Lambda @Edge

Lambda @Edge es una función de Amazon CloudFront que le permite ejecutar el código más cercano a los usuarios de la aplicación, lo que mejora el rendimiento y reduce la latencia. Con Lambda @Edge, no es necesario aprovisionar o administrar infraestructura en multiples ubicaciones alrededor del mundo. Sólo paga por el tiempo de cálculo que utilice. No habrá cargos cuando el código no se esté ejecutando.

Podemos aplicar funciones de Lambda @Edge para interceptar solicitudes y respuestas de Amazon CloudFront en los siguientes términos:

  • Después de que CloudFront reciba una solicitud del visor.
  • Antes de que CloudFront reenvíe la solicitud al origen (solicitud de origen).
  • Después de que CloudFront reciba la respuesta de origen (respuesta de origen).
  • Antes de que CloudFront reenvíe la respuesta del visor.

 

Architectura propuesta

 

 

Componentes de la solución

En esta sesión profundizaremos en la implementación de la aplicación WEB (en el repositorio de GitHub), así como en la implementación de los componentes de la nube para la autenticación, validación de tokens y almacenamiento en caché en la CDN.

Para implementar y mantener el back-end y el front-end en AWS, utilizaremos AWS Amplify, una solución integral que permite a los desarrolladores de aplicaciones web y móviles crear y automatizar la implementación de una manera segura y escalable. Puede configurar el back-end en cuestión de minutos, conectarlo todo a su aplicación con tan sólo unas pocas líneas de código. Además, puede implementar sitios estáticos en tres pasos.

La aplicación web se basa en React y utiliza Video.JS como player de video.

Una vez que la autenticación es correcta, Amazon Cognito devuelve los tokens del grupo de usuarios (user pool) a su aplicación. Posteriormente, estos tokens pueden ser usados para garantizar el acceso a los recursos del backend. En este escenario, el token se usará para iniciar la sesión de aquellos que soliciten contenido multimedia privado, esta solicitud será analizada por la función en Lambda @Edge y validada con los parámetros de autenticación de Cognito.

 

Implementación de la solución

1. Dependencias del proyecto

Para la integración con componentes de AWS y el alojamiento de nuestra aplicación web, utilizaremos AWS Amplify. Para verificar un tutorial completo sobre la instalación y configuración de AWS Amplify, visite la documentación (Amplify for React).

npm install -g @aws-amplify/cli
amplify configure

2. Clonar el repositorio

git clone https://github.com/osmarbento-AWS/secure-url-cf.git
cd secure-url-cf
npm install
amplify init --app https://github.com/osmarbento-AWS/secure-url-cf.git
amplify init
amplify push

3. Inicie el entorno local

npm start

Esto debería permitirle acceder a la página de autenticación. Ahora cree su cuenta en la página de inicio de sesión. Después de iniciar sesión, debe cargar el sitio a continuación:

 

 

4. Preparar el entorno para depositar y transcodificar vídeos

Utilizaremos Amplify Video para habilitar la infraestructura en la nube requerida para almacenar y transcodificar contenido bajo demanda (VOD). Amplify Video es una herramienta de código abierto de Amplify CLI, lo que facilita la incorporación de streaming de vídeo en sus aplicaciones web o aplicaciones móviles. Desarrollado por el equipo de AWS Media Services. Amplify Video también es compatible con contenido en vivo. Para obtener más información y ejemplos, visite amplify-video GitHub.

npm i amplify-category-video -g
amplify add video
? Please select from one of the below mentioned services: Video-On-Demand
? Provide a friendly name for your resource to be used as a label for this category in the project: vod-wf-jwt
? Select a system-provided encoding template, specify an already-created template name:  Default HLS Adaptive Bitrate
? Is this a production enviroment? Yes
? Do you want to protect your content with signed urls? No
? Do you want Amplify to create a new GraphQL API to manage your videos? (Beta) No
✔ All resources built.

amplify push

Amplify Video creará un bucket de S3 para almacenar los archivos de vídeo de origen y destino, también implementará una distribución de CloudFront. A continuación se muestra el resultado de amplify push

Video on Demand:

Input Storage bucket:
vodcfjwt-dev-input-SOMEID

Output URL for content:
https://someid.cloudfront.net (https://someid.cloudfront.net/

Nota: Amplify Video también ofrece la opción de proteger el contenido por medio de una URL firmada, puede encontrar más información sobre cómo usar URLs firmadas con amplify video en los primeros pasos con VOD.

 

Pruebas de transcodificación

Navegue hasta la consola de S3. Tenga en cuenta que Amplify Video ha creado dos buckets en su entorno de desarrollo (cuenta de aws). Busque el bucket de entrada y cargue un archivo .mp4 que tenga almacenado en su equipo local.

Una vez que el archivo esté en el bucket, vaya a la consola de MediaConvert y vea los trabajos de transcodificación. Esta tarea lleva los archivos de origen y transcodifica al protocolo de transmisión en vivo HTTP de Apple (HLS), los archivos posterior a la transcodificación son almacenados en el bucket de salida, que son el origen de la distribución de CloudFront.

 

Pruebas de reproducción

Después de que MediaConvert haya completado la transcodificación, vuelva a la consola S3 y busque el bucket de salida. A continuación, localice el archivo con el mismo prefijo (nombre) que cargó originalmente. Verá los archivos de salida creados por MediaConvert. Localice el manifiesto HLS, será el archivo con la extensión .m3u8 y, a continuación, reemplace el dominio S3 con la URL de la distribución de CloudFront.

El formato de la URL debe ser, la URL de la distribución de CloudFront + /nombre del archivo/+ nombre del archivo.m3u8

Ejemplo: https://someid.cloudfront.net/BigBuckBunny/BigBuckBunny.m3u8

5. Agregue autenticación JSON Web Token a su distribución de CloudFront

a. Instale las dependencias de autenticación en la función Lambda @Edge

cd amplify/backend/function/jwtauth/src/
npm install

b. Edite la función del archivo index.js y agregue los atributos del grupo de usuarios (user pool) de Cognito

Abra el archivo config.js, ubicado en:

amplify/backend/function/jwtauth/src/config.js

Liste los recursos de autorización creados por Cognito User Pool ID

amplify auth console
Using service: Cognito, provided by: awscloudformation
? Which console User Pool
User Pool console:
https://us-east-1.console.aws.amazon.com/cognito/users/?region=us-east-1#/pool/us-east-SomeID/details
Current Environment: dev

El ID del grupo de usuarios (user pool) se puede encontrar en la URL devuelta al ejecutar amplify auth console

https://us-east-1.console.aws.amazon.com/cognito/users/?region=us-east-1#/pool/us-east-SomeID/details

Copie el ID del grupo y sustituyalo en la variable USERPOOLID

var USERPOOLID = 'US-EAST-1_SOMEID';

c. Descargue y almacene la llave JSON web Key (JWK) correspondiente con su grupo de usuarios (user pool).  

Está disponible como parte del conjunto de llaves JSON Web Key (JWKS), y puede encontrarla en:

https://cognito-idp.us-east-1.amazonaws.com/us-east-SomeID/.well-known/jwks.json

Para obtener más información sobre como implementar JWT y JWK, visite la página de Cognito de Verificación de un JSON Web Token (JWT) y JSON Web Key (JWK).

Puede ver mas ejemplos de jwks.json  en la documentación de JSON Web Token.  Ahora reemplace la variable JWKS con sus credenciales de grupo de usuarios (user pool) de Cognito.

var JWKS = '{"keys":[{"alg":"RS256","e":"AQAB","kid":"1234exemple=","kty"::"RSA"....}]}

Ahora, implemente su función lambda simplemente ejecutando el siguiente comando en la carpeta de inicio de la aplicación:

amplify push

6. Implementar Lambda @Edge

Ahora que la función realiza el análisis JWT en la nube, ha implementado su distribución.

a. Vaya a la consola de CloudFront y copie el ARN de la distribución que se creó en el paso 5

 

 

b. vaya a la consola de Lambda e implemente la función en Lambda @Edge

 

 

Bien, ahora podemos contibuar con pruebas de extremo a extremo.

7. Pruebas de extremo a extremo

En un navegador abra su aplicación web y pruebe con algunos contenidos.

En el campo URL de vídeo, agregue la URL completa de la salida que se creó en el paso 5.

 

 

Conclusión

En este blog, discutimos estrategias de protección de contenido multimedia mediante la autenticación por token JWT. Esto ayuda a reducir el acceso no autorizado a su contenido digital. Para obtener más información, consulte la documentación de Amazon CloudFront y encuentre formas adicionales de como proteger su contenido.

 

Enlaces adicionales:

 

 


Sobre los autores

Osmar Bento es un Arquitecto de Soluciones especializado en Medios y Entretenimiento. Ayuda a los clientes de AWS a crear soluciones innovadoras mediante la plataforma de AWS.

 

 

 

 

Arturo Velasco es un Arquitecto de Soluciones especializado en Medios y Entretenimiento, con más de 9 años de experiencia en la industria. Sus objetivos son ayudar a los clientes a comprender cómo pueden utilizar los servicios de AWS, las prácticas recomendadas y evangelizar las soluciones multimedia y de entretenimiento de AWS.

 

 

 

Gustavo Barbosa es Arquitecto de Soluciones de AWS para pymes. Ayuda a sus clientes a crear aplicaciones resistentes y de alta disponibilidad con los servicios que ofrece la plataforma de AWS.