civil-and-structural-engineering
Implementar la autenticación y la autorización en aplicaciones sin servidor
Table of Contents
Por qué la autenticación y la autorización de las arquitecturas sin servidores
El cálculo sin servidor ha transformado la forma en que los equipos construyen y implementan aplicaciones mediante la gestión de infraestructuras abstractas, la reducción de la sobrecarga operacional y el escalado automático. Sin embargo, la naturaleza efímera y impulsada por eventos de funciones sin servidor introduce retos de seguridad únicos. Sin un servidor persistente para mantener el estado de sesión, cada invocación de funciones debe verificar independientemente quién es el destinatario y si se les permite realizar la acción solicitada.
A diferencia de las aplicaciones monolíticas donde la lógica de autenticación puede vivir dentro de un servidor central, las aplicaciones sin servidor distribuyen autenticación a través de las pasarelas API, servicios de identidad y funciones individuales. Esta distribución exige una estrategia clara que equilibra la seguridad, el rendimiento y la experiencia del desarrollador. En este artículo, exploramos los conceptos básicos, herramientas populares y patrones de implementación prácticos para asegurar aplicaciones sin servidor.
Autenticación vs. Autorización: Una clara distinción
Aunque a menudo se utiliza intercambiablemente, la autenticación y la autorización sirven diferentes propósitos. La autenticación responde a la pregunta “¿Quién eres?” — típicamente validando credenciales como un nombre de usuario y contraseña, un código de una sola vez, o un factor biométrico. La autorización responde a la pregunta “¿Qué se te permite hacer?” — comprobando permisos después de que se establezca la identidad.
En entornos sin servidor, la autenticación suele ocurrir en la puerta de la API o a través de un proveedor de identidad dedicado (IdP) antes de que se active una función. La autorización puede manejarse a nivel de la puerta de entrada a través de documentos de política, dentro de la función mediante código que inspecciona las reclamaciones en un JSON Web Token (JWT), o mediante una combinación de ambas.
Estrategias de autenticación para aplicaciones sin servidores
La autenticación sin servidor suele corresponder a tres categorías: servicios de terceros totalmente gestionados, autenticación personalizada dentro de funciones, y identidad federada usando OAuth2/OpenID Connect. Cada enfoque ofrece compensaciones entre facilidad de implementación, control y coste.
Proveedores de identidad de terceros
La mayoría de las aplicaciones sin servidor dependen de un IdP dedicado para manejar la autenticación. Estos servicios gestionan directorios de usuarios, contraseñas, gestión de sesión e integración con proveedores de acceso social.
- ]Amazon Cognito] — Un servicio totalmente gestionado que se integra nativamente con AWS API Gateway y Lambda. Cognito proporciona piscinas de usuarios para registrarse/sign-in, grupos de identidad para credenciales temporales de AWS, y admite MFA, autenticación adaptativa y flujos de trabajo personalizados a través de Lambda dispara. [[FLT][2]
- Auth0] — Una plataforma de identidad basada en la nube que ofrece acceso universal, conexiones sociales, acceso sin contraseña y amplia personalización. Auth0 proporciona SDKs para múltiples idiomas y puede integrarse con cualquier gateway de API. ]Documento de Auth0
- Firebase Authentication — Parte de la suite Firebase de Google, admite correo electrónico/password, teléfono y proveedores sociales populares. Firebase Auth se integra suavemente con Firebase Funciones y Cloud Run.
- Azure Active Directory B2C — Para aplicaciones empresariales que requieren integración Azure AD, B2C proporciona gestión de identidad para aplicaciones de uso de consumidores con el apoyo de estándares como OAuth2 y SAML.
Utilizando un IdP de terceros descarga la carga de almacenamiento seguro, cifrado y cumplimiento de credenciales. También simplifica la implementación de funciones avanzadas como MFA, recuperación de cuentas y protección de fuerza bruta.
Autenticación personalizada en funciones sin servidor
Cuando necesita un control completo sobre el flujo de autenticación —por ejemplo, al integrarse con una base de datos de usuario heredada o aplicar protocolos de autenticación patentados— puede implementar la lógica de autenticación directamente dentro de una función Lambda u otra función sin servidor. Este patrón se utiliza a menudo para los puntos de acceso de API que deben ser accesibles públicamente pero requieren una ficha personalizada, como claves de API para socios externos.
Sin embargo, la autenticación personalizada de cero es arriesgada. Las funciones sin servidor son apátridas, por lo que debe manejar de forma segura la contraseña (utilizando la bcrypt o Argon2), la generación de token y la gestión de sesión. Los arranques fríos pueden causar picos de latencia si la lógica de autenticación es pesada. Por estas razones, la autenticación personalizada es mejor reservada para servicios internos o bases de usuarios no críticas.
OAuth2 y OpenID Connect en Serverless
OAuth2 es el estándar de la industria para la autorización delegada, permitiendo a las aplicaciones acceder a recursos en nombre de un usuario sin compartir credenciales. OpenID Connect (OIDC) se basa en OAuth2 para agregar verificación de identidad. Muchas aplicaciones sin servidor utilizan flujos OAuth2/OIDC para permitir que los usuarios se inscriban con Google, GitHub o Facebook, y luego emitir JWTs que llevan reclamaciones de usuario.
Social Login and MFA
La conexión social es a menudo la forma más fácil de reducir la fricción durante el registro. Tanto Google como GitHub autenticación se pueden integrar a través de SDKs de plataforma o mediante la implementación manual del flujo de código de autorización OAuth2. La unión de la conexión social con MFA añade una capa extra de seguridad: incluso si una cuenta social está comprometida, el atacante no puede acceder a la aplicación sin servidor sin un segundo factor.
Autenticación de base token: La columna vertebral de la autenticidad sin servidor
Debido a que las funciones sin servidor son apátridas, fichas —especialmente JSON Web Tokens (JWT)— son el mecanismo preferido para transmitir información de autenticación y autorización entre los servicios. Un JWT es un token compacto, seguro de URL que consiste en un encabezado, una carga útil (reclamaciones) y una firma. La firma asegura que el token no ha sido manipulado.
Estructura y validación de JWT
Un JWT típico parece . La carga útil contiene las reclamaciones estándar (essujeto, sujeto, expiración) y las reclamaciones personalizadas (ruinas, permisos, ID de usuario). En un contexto sin servidor, las funciones validan la firma, vencimiento y emisor de la ficha antes de proceder. Muchos proveedores de nube ofrecen autorizadores de Lambda preconstruidos o Autorizadores de API Gateway JWT que manejan una política de validación de endpoint de IkenAM automáticamente
Por ejemplo, al utilizar Auth0 con AWS Lambda, configura un autor personalizado que verifica la señal contra el punto final JWKS de Auth0. El autor adjunta las reclamaciones decodificadas al contexto del evento, permitiendo que la Lambda tome decisiones de autorización fina sin realizar la validación de token de nuevo.
Sesión vs. Autenticación de Token
Las aplicaciones basadas en servidor tradicionales dependen de las cookies de sesión almacenadas en el servidor. En el caso de los usuarios, las sesiones se vuelven difíciles porque las funciones son efímeros y se escalan a cero se rompen en las tiendas de sesión de memoria. La autenticación basada en token cambia el estado al cliente: la ficha lleva toda la información necesaria, y el servidor sólo necesita validar su firma.
Modelos de autorización para sin servidores
Después de la autenticación establece la identidad, la autorización determina lo que puede hacer esa identidad. Tres modelos comunes son Control de Acceso Basado en Papel (RBAC), Control de Accesos Atributos-Basados (ABAC), y Control de Acceso Basado en Políticas (PBAC).
Control de acceso basado en roles (RBAC)
En RBAC, los permisos se agrupan en funciones (por ejemplo, admin, editor, visor). Se asignan a los usuarios uno o más roles, y el sistema comprueba si el papel del usuario permite la acción solicitada. RBAC es sencillo de implementar: después de decodificar el JWT, compruebe si la reclamación de rol contiene el papel requerido para el punto final. Esto funciona bien para aplicaciones con jerarquías de usuario bien definidas.
Control de acceso basado en atributos (ABAC)
ABAC evalúa el acceso basado en una combinación de atributos de usuario (por ejemplo, departamento, nivel de despacho), atributos de recursos (por ejemplo, clasificación de documentos), y condiciones ambientales (por ejemplo, hora del día, dirección IP). Por ejemplo, un usuario sólo puede ver documentos en su propio departamento durante horas de negocio. ABAC es más flexible que ROP pero introduce complejidad. En el caso de imprudencia, las políticas ABAC son evaluadas a menudo en la función autorizadora.
Control de acceso basado en políticas (PBAC)
PBAC centraliza las políticas de autorización fuera del código de aplicación. Servicios cloud como AWS Identity and Access Management (IAM) le permiten definir políticas JSON que especifican qué acciones se permiten en qué recursos. Estas políticas pueden ser anexadas a roles asumidos por la función o a la sesión del usuario. Cuando se combina con API Gateway, puede hacer cumplir la autorización sin código de escritura — la puerta de entrada evalúa la política antes de invocar la función.
Implementar la autorización en aplicaciones sin servidor
Hay tres capas primarias donde se puede aplicar la autorización: en la puerta de la API (antes de que la función funcione), dentro de un autorizador de Lambda, o dentro de la función misma.
Autorización de API Gateway (Built-in)
AWS API Gateway, Azure API Management y Google Cloud Endpoints apoyan la validación nativa de JWT y la autorización basada en políticas. Por ejemplo, API HTTP de API Gateway puede validar un JWT de un emisor especificado y luego mapear reclamaciones a permisos de ruta. Este enfoque es rápido porque la validación ocurre en el borde de red, reduciendo invocaciones de Lambda y coste. Sin embargo, sólo admite controles simples personalizados; condiciones complejas
Autorizadores de función de lambda
Un autorizador de Lambda (anteriormente conocido como autor de la costumbre) es una función que recibe la ficha (como un encabezado o parámetro de consulta) y devuelve una política de IAM que la API Gateway aplica. El autor puede decodificar el JWT, llamar un servicio externo, o pedir una base de datos para determinar los permisos del usuario.
Autorización directa dentro de las funciones
En algunas arquitecturas, especialmente las que no están en frente de una puerta de entrada de API (por ejemplo, funciones impulsadas por eventos, resolución de GraphQL), la autorización debe ocurrir dentro de la función. Este patrón implica decodificar el JWT y comprobar permisos contra una base de datos o caché. Si bien flexible, puede conducir a la lógica duplicada en todas las funciones. Para mantener la consistencia, utilice una biblioteca de middleware compartida que envuelve a sus manipuladores de funciones.
Por ejemplo, usando middleware para Lambda, puedes crear un middleware de autorización que pare el JWT, valida los roles, y devuelve una respuesta de 403 o pasa el control al manejador. Esto mantiene el código de función limpio y hace cumplir un solo punto de autorización.
Mejores prácticas para la autenticación y la autorización sin servidor seguros
Más allá de seleccionar las herramientas y patrones adecuados, una capa de auth segura sin servidor requiere la adhesión a las mejores prácticas operativas. Las siguientes recomendaciones se extraen de la documentación de proveedores de la nube y las directrices de OWASP.
Use HTTPS en todas partes
Toda la comunicación entre clientes, la pasarela de API y las funciones de backend debe ser cifrada con TLS. La fijación de certificados se puede agregar para clientes móviles, pero asegurar que los certificados se rotan regularmente.
Enforce Least Privilege
Cada función sólo debe concederse los permisos que necesita. Utilice funciones de IAM de gran calidad para funciones de Lambda, y evite asignar permisos amplios como . Asimismo, los autorizadores de la gateway API deben devolver políticas que limiten el acceso a recursos específicos.
Implementar la autenticación multifactor (MFA)
Permite MFA para cualquier operación sensible, especialmente los puntos finales de administración. Los IdPs como Cognito y Auth0 admiten MFA con TOTP o SMS. En el caso de los servidores, puede forzar la verificación MFA para rutas API específicas mediante la comprobación de una reclamación en el JWT (por ejemplo, ).
Validar las fichas en cada diario
No asuma que una señal pasada a una función ya ha sido validada por un servicio de corriente avanzada. Cada función debe verificar independientemente la firma, caducidad y emisor de la ficha. Esta defensa-en profundidad evita un solo punto de fracaso.
Gestionar secretos de forma segura
Nunca codificar claves de API, claves secretas o credenciales de bases de datos en el código de funciones. Utilice un gestor de secretos como AWS Secrets Manager, AWS SSM Parameter Store o HashiCorp Vault. Para el desarrollo local, utilice variables de entorno con precaución y nunca las comprometa a controlar la versión.
Claves rotativas regularmente
Rotar claves de firma, claves de API y secretos de cliente en un horario regular (por ejemplo, cada 90 días). Automatizar la rotación utilizando herramientas de proveedor de nube. Para JWTs, asegúrese de que la URL de clave pública (JWKS endpoint) se actualice antes de que las teclas viejas caduquen para evitar fallos de validación.
Acceso Log y Monitor
Permite la logging detallada para los registros de acceso de las gateway API y los registros de Lambda CloudWatch. Supervise patrones anormales como repetidos errores 401, ubicaciones geográficas inusuales o intentos de acceder a recursos no autorizados.
Ejecutar la limitación de tarifas y el ajuste
Utilice los planes de uso de las gateway API, el triturado o un WAF (Web Application Firewall) para proteger los puntos finales de autenticación (por ejemplo, /login) de ataques de fuerza bruta. Los límites de la función de la función de lambda también pueden prevenir un aumento repentino de las solicitudes de austeridad de los IdPs torrentes.
Prueba de Auth Logic Thoroughly
Escribe pruebas de unidad y pruebas de integración para tu código de autenticación y autorización. Incluye pruebas para fichas vencidas, fichas malformadas, reclamaciones desaparecidas, y intenta evitar autorización. Usa herramientas como para burlar eventos de gateway API.
Manténgase actualizado en Patches de Seguridad
El ecosistema sin servidor evoluciona rápidamente. Suscríbete a las asesorías de seguridad de tu proveedor de IdP y cloud. Aplica parches a versiones de Lambda y dependencias de tiempo de ejecución (por ejemplo, bibliotecas JWT, clientes HTTP) regularmente.
Conclusión
La autenticación y autorización no son extras opcionales en aplicaciones sin servidor, son fundamentales para construir confianza con los usuarios y proteger datos confidenciales. Al aprovechar a los proveedores de identidad gestionados, autenticación basada en token y modelos de autorización en capas, puede crear una base segura que escala a medida que crece su base de usuario. Los patrones descritos en este artículo — terceros IdPs, validación JWT, autorizadores de gateway API y adaptador.
Recuerde que la seguridad es una práctica continua, no una configuración única. Revisa regularmente sus políticas de austeridad, registros de auditoría y dependencias de actualización. Con el enfoque correcto, la autenticación y autorización sin servidor se convierten en habilitadores, no obstáculos, para construir aplicaciones rápidas, seguras y escalables. Para más lectura, consulte la [Prácticas más válidas [FLT]]