Mejores prácticas para administrar secretos en aplicaciones sin servidor
13 de junio de 2019
0 minutos de lecturaSi estás desarrollando una aplicación sin servidor, es probable que tus funciones necesiten acceder a secretos u otros tipos de información confidencial que almacenas, como claves de API, tokens o contraseñas. Sin embargo, administrar estos secretos de forma adecuada puede resultar difícil en ocasiones.
Cuando los usuarios no adoptan un servicio de administración de claves, estos secretos, lamentablemente, terminan almacenados en el código fuente o en archivos de manifiesto. Esto puede tener consecuencias devastadoras, como la filtración de secretos por la exposición y manipulación del código fuente, o una mayor complejidad al administrar secretos, por ejemplo, al rotar y dar de baja claves.
Puedes descargar el PDF de la guía rápida sobre seguridad sin servidor o leer la versión en línea del blog.
A continuación, se muestra un ejemplo de una forma insegura de manejar secretos:
Primero, revisemos los aspectos positivos de esta estructura. La función helloWorld aprovecha bien el principio de aislamiento de funciones. La variable de entorno GITHUB_API_KEY solo está disponible para la función que se invoca y no para ninguna otra función del código, en este caso, goodbyeWorld.
Por otro lado, el token secreto de GITHUB_API_KEY está codificado directamente en el archivo de manifiesto serverless.yml, que combina los problemas de configuración y de secretos. Esto puede exponer información si el archivo de manifiesto se publica o se comparte con otros usuarios.
En el siguiente ejemplo se usa AWS Simple Systems Manager, diseñado para recuperar secretos cifrados de forma segura por AWS Parameter Store. En nuestro ejemplo, la variable de SSM se usa para acceder a un valor específico que se creó previamente, de modo que una función pueda acceder a él mediante una variable de entorno:
Ten en cuenta que ${ssm:/github/api-key} devuelve el valor cifrado de esa clave. Si quisiéramos descifrarla y devolver el valor real, tendríamos que especificar ${ssm:/github/api-key~true}.
Encontrarás más información sobre Parameter Store y Key Management Service (KMS) en la documentación de Parameter Store de Amazon.
Para mejorar aún más la seguridad y la flexibilidad al administrar secretos en tus aplicaciones, considera acceder a los secretos y a otra información de configuración durante la ejecución, en lugar de usar variables de entorno que requieren reiniciar el proceso para aplicar la nueva configuración.
Rota las claves y credenciales con regularidad
Aunque almacenar tus secretos reduce la posibilidad de que se filtre una clave, no la elimina por completo. Por suerte, si usas almacenamiento de secretos en tu función, a nadie le importa cuál es la clave... ¡así que puedes rotarla con regularidad! De este modo, si la clave se filtra o la roban, solo se podrá usar durante poco tiempo antes de que venza.
Rotar claves es sencillo y puedes hacerlo de forma rutinaria si usas un KMS. Sin embargo, puede ser un poco más complicado al integrarlo con otros sistemas. Si necesitas la clave para acceder a un sistema de terceros, revisa la API que ofrece ese tercero para encontrar una forma de rotarla automáticamente. Si existe, crea una tarea programada que genere una clave nueva, actualice el token en el KMS y venza o incluya la clave anterior en una lista de bloqueo en la siguiente iteración. De esta manera, solo habrá dos claves activas en un momento dado. Como tus funciones tienen una vida muy corta, adoptan la nueva clave rápidamente, lo que te permite vencer la anterior y volver a rotarla con frecuencia, incluso a diario o cada hora.
Resumen
En conclusión, te recomendamos usar una solución de almacenamiento seguro para tus secretos y credenciales confidenciales, compatible con los principales proveedores de nube y FaaS. Como alternativa, puedes implementar tus propias soluciones, como Vault de HashiCorp. Almacenar claves en un servicio de almacenamiento de secretos mitiga los riesgos asociados con guardar información confidencial en archivos estáticos dentro de un repositorio de código fuente o en variables de entorno, y reduce considerablemente la posibilidad de que esta información quede expuesta. Para obtener más información sobre herramientas de administración de secretos y mejores prácticas, haz clic aquí.
Crea ahora una cuenta gratuita de Snyk para mejorar la seguridad de tus proyectos.
Empieza con los retos de Capture the Flag
Aprende a resolver retos de Capture the Flag viendo nuestro taller virtual de nivel básico a pedido.
