Cómo aumentar la observabilidad, el monitoreo y la seguridad de Serverless
15 de julio de 2019
0 minutos de lecturaLas 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:
Mantener detalles sobre los entornos en los que se implementan las funciones
Monitorear las vulnerabilidades de seguridad y el acceso a los recursos
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:
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 funcionesLa línea 18 muestra una etiqueta
fooasociada únicamente con la funciónhelloWorld
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.

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.

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.