Skip to main content

Cómo aumentar la observabilidad, el monitoreo y la seguridad de Serverless

Escrito por

15 de julio de 2019

0 minutos de lectura

Las funciones suelen tener una vida corta, se implementan en grandes cantidades y se invocan cada vez con más frecuencia a medida que escalas. Por estas razones, es fácil perder el rastro del flujo de eventos o identificar la causa raíz de un error.

Además, a medida que una organización adopta Serverless, también se vuelve más complicado monitorear los flujos inseguros y los intentos maliciosos de atacantes que buscan forzar una función a seguir una ruta de código insegura.

Para implementar funciones y mantener la seguridad al mismo tiempo, te recomendamos:

En una publicación anterior compartí más información sobre la seguridad de Serverless: 10 prácticas recomendadas de seguridad para Serverless. Te recomendamos guardarla para leerla más adelante, pero por ahora sigamos con las siguientes prácticas de monitoreo y registro que puedes aplicar en tus proyectos Serverless basados en la nube.

Aumenta la visibilidad de los entornos a los que pertenecen las funciones

Las funciones son prácticamente gratis, ya que solo generan costos cuando se invocan; por eso, implementamos muchas. Sin embargo, con el tiempo, cada función representa un riesgo de seguridad que podría permitir el acceso a nuestra red y nuestros datos. Además, con el tiempo, las bibliotecas que usa cada función pueden quedar obsoletas y volverse vulnerables. Asimismo, una vez implementada, es difícil eliminar una función porque la propiedad y la responsabilidad de la organización sobre cada una pueden no estar claras o no haberse definido.

Para no perder de vista las funciones, su propósito y los entornos correspondientes, define:

  • reglas estrictas para las funciones que implementas, de modo que sea fácil saber cuáles son de producción a largo plazo y cuáles son experimentales, administrativas, etc.

  • pautas claras para determinar cuándo se debe eliminar una función

AWS introdujo recientemente la posibilidad de etiquetar las funciones Lambda para que sea fácil hacerles seguimiento y agruparlas. Con el framework Serverless, podemos etiquetar funciones en sus archivos yaml, ya sea de forma global (para todas las funciones del archivo serverless.yml) o para funciones individuales:


1 service:
2  name: hello-world
3
4 provider:
5  name: aws
6  runtime: nodejs8.10
7  stage: ${opt:stage, 'dev'}
8  region: ${opt:region, 'us-east-1'}
9  profile: production
10  tags:
11    foo: bar
12    baz: qux
13  functions:
14    helloWorld:
15      handler: helloworld.get
16      name: helloworld
17      description: My function
18      tags:
19        foo: bar

El código anterior muestra dos tipos de etiquetas disponibles para las funciones Lambda en AWS:

  • La línea 10 muestra las etiquetas globales de la implementación serverless.yml, asociadas con todas las funciones

  • La línea 18 muestra una etiqueta foo asociada únicamente con la función helloWorld

Monitorear las funciones en busca de vulnerabilidades de seguridad

Hay muchas maneras de implementar funciones, y la cantidad de funciones implementadas puede salirse de control fácilmente. Con el tiempo, el código y las dependencias de esas funciones pueden quedar obsoletos y volverse vulnerables, a medida que disminuyen las tareas de mantenimiento y la atención se centra en otros proyectos.

Necesitas una solución que se integre con tu proveedor de función como servicio (FaaS) para monitorear las funciones implementadas y mantenerlas bajo control. Esto te permite abordar las vulnerabilidades de seguridad conocidas durante todo el ciclo de vida del desarrollo de software, en lo que respecta a las funciones y al uso que hacen de dependencias de código abierto.

En la siguiente imagen, vemos el proyecto de GitHub lirantal/bazz-serverless después de analizarlo. El proyecto incluye varias vulnerabilidades de gravedad alta, media y baja. Este es el código fuente de mi proyecto Serverless, que implementa varias funciones. Debajo del repositorio del proyecto de GitHub, vemos las seis funciones Lambda de AWS que implementé. Estas son las funciones reales tal como AWS las implementa y ejecuta.

Snyk analizó todas estas funciones individuales en busca de vulnerabilidades de seguridad conocidas. Como todas usan el mismo árbol de dependencias, podemos ver que están implementadas con bibliotecas vulnerables.

Curiosamente, podemos ver que se encontraron cuatro vulnerabilidades de gravedad baja en el repositorio del proyecto, pero no aparecen en las funciones individuales. Esto se debe a que la versión implementada es diferente de la versión almacenada en el repositorio de Git: específicamente, la función implementada está desactualizada y no incluye una biblioteca que agregué al código fuente.

Si no hubiera hecho un seguimiento de la seguridad de mi proyecto, podría haber implementado más bibliotecas vulnerables en producción y, así, haber aumentado la superficie de ataque de la aplicación que estoy desarrollando.

Interfaz de Snyk que muestra la selección de un repositorio de GitHub para un proyecto sin servidor, junto con una lista de funciones de AWS Lambda y la cantidad de vulnerabilidades.

Monitorear el acceso a los recursos

Imagina que un atacante logra explotar una vulnerabilidad en una función de Node.js y bloquear el bucle de eventos al obligarla a dedicar mucho tiempo a cálculos que requieren un uso intensivo de CPU. Esto puede ser difícil de detectar debido a la naturaleza del modelo de función como servicio, en el que las funciones se inician según sea necesario para atender nuevas solicitudes. Aunque parece una gran ventaja —y probablemente lo sea en ciertos aspectos—, la contrapartida es que tu factura de la nube se dispara debido al costo por uso de las funciones.

Crea una estrategia de monitoreo: implementa políticas, alertas y mecanismos de cumplimiento para identificar y bloquear las invocaciones de funciones no deseadas. Considera monitorear los siguientes recursos:

  • CPU

  • Memoria

  • Consumo y operaciones de entrada y salida

  • Acceso a archivos, como lectura y escritura

  • Tiempo de ejecución de las funciones

  • Flujos de invocación de funciones y anomalías respecto de las fuentes de invocación esperadas

  • Ejecuciones de procesos secundarios

Los proveedores de servicios en la nube suelen incluir herramientas de monitoreo para las aplicaciones y los recursos de las funciones, con el fin de proporcionar esta información. Microsoft ofrece Azure Monitoring y Amazon, AWS X-Ray. Como ejemplo, según la documentación oficial de AWS, podemos ver una imagen de la consola de AWS X-Ray, que ofrece información sobre el flujo de datos a través de las funciones y otros recursos de la nube, así como métricas, como el tiempo de ejecución.

Diagrama del flujo de una aplicación sin servidor que conecta clientes, funciones de AWS Lambda, SNS, Elastic Beanstalk y tablas de DynamoDB con métricas de latencia.

Una vez implementado el monitoreo, establece límites relacionados con las funciones para prevenir aún más el agotamiento de los recursos financieros.

Registro de funciones

Los registros se agrupan lógicamente por conjuntos de funciones, lo que proporciona información valiosa adicional; sin embargo, si no se manejan correctamente, también pueden generar riesgos de seguridad.

Para aprovechar al máximo los registros:

  • Prefiere un registro detallado de los eventos, su contexto y la información sobre fallas

  • Aprovecha las herramientas de registro en la nube

  • Implementa un sistema centralizado de administración de registros para que tu equipo pueda depurar problemas y encontrar eventos fácilmente

  • Asocia los registros y los eventos especiales con umbrales y alertas para que, además de servir como pista de auditoría, los registros también generen alertas cuando los problemas requieran atención inmediata

Teniendo esto en cuenta, procura no registrar información confidencial, como credenciales, ni datos excesivos, como variables de entorno. Además, asegúrate de cumplir con el RGPD local y de no registrar información de identificación personal.

Resumen

Te invito a leer una lista más detallada de 10 prácticas recomendadas de seguridad para Serverless para conocer más aspectos de seguridad que debes tener en cuenta al crear e implementar funciones Serverless.