top of page

Alojamiento web seguro en S3 con AWS CloudFront

  • Foto del escritor: Damian Gitto Olguin
    Damian Gitto Olguin
  • 25 jul
  • 3 Min. de lectura

ree

A veces necesitamos proteger nuestro sitio web (o parte de él) contra accesos no autorizados. Esto puede ser complicado, ya que suele requerir desarrollar un módulo de autenticación personalizado o integrar una plataforma de terceros, además de preocuparnos por la disponibilidad y el rendimiento de este servicio a medida que escala.

En este TeraTip, vamos a descubrir una forma eficiente de desplegar contenido web estático en un servicio de alta disponibilidad como AWS S3, usando CloudFront como CDN para distribuir contenido de forma rápida y confiable. Como mencionamos, también necesitamos proteger el acceso, así que vamos a implementar AWS Cognito como servicio de autenticación, gestionando sesiones mediante JWT y Lambda@Edge.


Sitio web de alta disponibilidad


Primero, definimos si deseamos alojar un nuevo sitio en S3 o utilizar uno existente. Podemos desplegar contenido estático en un bucket privado de S3 y acceder a él a través de CloudFront utilizando OAI (Origin Access Identity). Nuestro módulo de Terraform te permitirá configurar tu dominio y aliases, y luego creará automáticamente la distribución de CloudFront, el bucket S3 e incluso los certificados SSL (utilizando ACM – Amazon Certificate Manager).


ree


Proceso de autenticación

Una vez que tenemos el sitio web funcionando, notamos que cualquiera puede acceder. Pero no te preocupes: nuestro módulo incluye un proceso de autenticación que será activado por CloudFront cada vez que un usuario intente acceder al sitio.


Lambda@Edge

Lambda@Edge permite ejecutar funciones de AWS Lambda en ubicaciones cercanas al cliente, como respuesta a eventos de CloudFront. Tu código puede ser activado por eventos como solicitudes de contenido por parte de usuarios o llamadas de CloudFront al origen. Con esto, es posible modificar solicitudes y respuestas en distintos puntos del flujo.

ree

Autenticación con JWT

JWT (JSON Web Token) es un estándar abierto basado en JSON para crear tokens de acceso que representan afirmaciones como objetos JSON.

El uso de Lambda@Edge para operaciones de autorización tiene varios beneficios. Primero, mejora el rendimiento al ejecutar funciones de autorización cerca del cliente, lo que reduce la latencia. Además, reduce la carga en los servidores de origen al mover operaciones de verificación de firmas JWT a la capa perimetral.


Implementaremos este proceso de autenticación JWT mediante funciones Lambda escritas en NodeJS 14.x.


ree


Amazon Cognito

AWS Cognito permite agregar registro, inicio de sesión y control de acceso de forma sencilla a tus aplicaciones web o móviles. Escala hasta millones de usuarios y admite proveedores de identidad sociales como Apple, Facebook, Google, Amazon, así como proveedores empresariales vía SAML 2.0 y OpenID Connect.


ree

Nuestro módulo de Terraform crea automáticamente un User Pool de Cognito y agrega la URL de inicio de sesión de Cognito a la respuesta de CloudFront en caso de que el usuario no esté autenticado. A partir de ahí, podemos registrar nuevos usuarios vía esa URL o administrar el pool directamente desde AWS: gestionar usuarios, cambiar políticas de contraseña, integrar nuevos proveedores de autenticación, etc.


ree

Flujo de acceso:


1. Acceso inicial sin autenticación:Se redirige al usuario a Cognito para autenticarse.

2. Luego de autenticarse con un usuario de Cognito:El usuario obtiene acceso autorizado al contenido del sitio web.

ree

Prueba de concepto (PoC)

Módulo de Terraform

La solución es fácil de desplegar porque desarrollamos un módulo de Terraform que, con pocas variables, configura toda la infraestructura. A continuación, un ejemplo de cómo desplegar el sitio:


module "cloudfront-s3-cognito" {

source="git::git@github.com:teracloud-io/terraform_modules//services/web-cloudfront-s3-cognito"
  
#Region which S3 website and Cognito services will be stored - default is us-east-1
region = "us-west-2"

#Name of the service that will be used as a subdomain for your website
service = "cloudfront-s3-cognauth"

#Name of the domain that will be used in web URL (this domain must exist in Route53)
domain = "sandbox.teratest.net"

#The name of the Lambda function that will handle the JWT Authentication process
lambda_name = "cognito-jwt-auth"

#If you want to create an index.html for S3 website this variable must be untagged
index_example = true

#In order to add a logo to Cognito login page you need to set the path/filename
logo = "logo.png"
}

ree

Conclusión

¡Eso es todo!

Con unas pocas líneas de Terraform, hemos creado una aplicación frontend en S3, protegida con CloudFront, certificados SSL y autenticación por Cognito.

Proteger tanto frontend como backend nunca ha sido tan fácil. Hacerlo a nivel de infraestructura te permite enfocarte en lo que realmente importa: tu aplicación.


Referencias:

ree




Nicolas Balmaceda

DevOps

Teracloud






 
 
bottom of page