Infraestructura como Código en AWS con CloudFormation y Secrets Manager
Clase 33 de 38 • Curso de Infraestructura Como Código en AWS
Creando infraestructura como código en AWS a través de Cloudformation es una buena práctica para cualquier tipo de proyecto, sin embargo debemos tener en cuenta diferentes aspectos que nos permitirán asegurar todo el proceso de despliegue de recursos y servicios.
Secrets Manager Link: https://docs.aws.amazon.com/es_es/secretsmanager/latest/userguide/intro.html
AWS Secrets Manager es un servicio de AWS que permite administrar secretos y su ciclo de vida dentro de AWS. Pueden ser de diferentes tipos, puede controlarlos, rotarlos y cifrarlos.
Como vemos en la imagen podemos almacenar 4 tipos de secretos que se integran directamente con servicios de AWS como: 1- RDS → Bases de datos relacionales (puedes ver más en nuestro curso de bases de datos en AWS). 2- **Redshift Cluster **→ Servicio de Datalake en AWS(puedes ver más en nuestro curso de BigData en AWS) 3- DocumentDB → Base de datos de documentos (parecida a Mongo DB). 4- Otras bases de datos.
Por último se puede guardar otro tipo de secreto.
Para cifrar tokens de github o información importante en nuestros templates de cloudformation utilizaremos la opción "Other type of secrets", adicionalmente debemos seleccionar la llave KMS con la que ciframos el secreto.
EJEMPLO Necesitamos crear un Codepipeline usando Cloudformation y en una de las fases del pipeline tiene que leer el código de AWS, para esto debemos utilizar un token de conexión a Github, este token debe permanecer oculto por seguridad.
Para este fin debemos crear un secret en AWS Secrets Manager.
Este secreto almacenará un token de conexión a GitHub.
Una vez almacenemos el secreto nos pedirá un nombre visible para guardarlo, en este caso lo pondremos como SecretGithub.
Cuando necesitemos utilizar este secreto en cloudformation tenemos que hacerlo de la siguiente forma:
OAuthToken:"{{resolve:secretsmanager:SecretGithub:SecretString:TokenGithub}}"
En esta definición se puede observar dónde se utilizarán los nombre del secreto y la llave del mismo.
Llave del secreto: TokenGithub **Nombre del secreto: **SecretGithub
De esta forma podremos poner todo el código del template de Cloudformation en un repositorio y no tendremos expuesto ninguna información confidencial. Es importante aclarar que el role de Codepipeline debe tener permisos sobre secrets manager específicamente sobre GetSecretValue.
PRICING **Por secreto: ** $0.40 dólares por mes. **Por llamadas a la API: ** $0.05 dólares por cada 10.000 llamadas.
AWS KMS Link: https://docs.aws.amazon.com/es_es/kms/latest/developerguide/overview.html
Este servicio permite controlar las llaves de cifrado que se utilizan para el cifrado de información en AWS. Cuando se cree una llave KMS se deben especificar 2 niveles de permisos:
1- Quienes pueden usar la llave. 2- Quienes son los administradores de la llave.
Adicionalmente este servicio se integra con Cloudtrail en AWS el cual registra todas las llamadas a la API, es decir, nos permite identificar quién, cuándo y cuántas veces han usado o intentado utilizar la llave.
Cuando utilizamos secrets manager podemos ver que el secreto termina siendo cifrado por KMS, podemos entonces elegir entre la llave predeterminada o alguna que nosotros hayamos creado.
EJEMPLO Necesitamos realizar el cifrado de una cadena de conexión, para este fin tendremos diferentes alternativas como:
- AWS CLI → https://docs.aws.amazon.com/cli/latest/reference/kms/encrypt.html
- AWS SDK PYTHON → https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kms.html#KMS.Client.encrypt
Adicionalmente podemos utilizar otros lenguajes de programación soportados por AWS, para utilizar estas cadenas cifradas debemos garantizar que el servicio que accederá a él, tenga permisos para hacer actividades de Decrypt.