Terraform admite agregar un archivo adicional con variables durante la invocación.
documentación: https://www.terraform.io/intro/getting-started/variables.html#from-a-file
Estamos utilizando esa función para proporcionar un secrets.tfvars
archivo en cada invocación de Terraform. También usamos un script para ajustar el comando de modo que su invocación sea consistente y todos los miembros del equipo eviten tener que cometer los mismos errores. El reiniciador se sincroniza .tfstate
con S3 antes de una ejecución y .tfstate
regresa a S3 al final. También escuché de personas que hacen lo mismo con el estado almacenado en Cónsul, incluso agregando una especie de semáforo en cónsul para evitar que dos personas inicien Terraform al mismo tiempo.
Cuando evita establecer un valor predeterminado en un variables.tf
archivo, obliga al usuario a ingresar el valor. Se puede ingresar manualmente o usando la -var-file
opción de comando como se describe anteriormente. No establecer un valor predeterminado en sus secretos es una buena manera de aplicar los cambios que requieren un cambio en los secretos.
El secrets.tfvars
archivo es un enlace simbólico a uno de los archivos con secretos que no están almacenados en el control de versiones. Tenemos varios, uno por el medio ambiente, así como secrets-prod.tfvars
, secrets-dev.tfvars
, secrets-stg.tfvars
, etc ...
Una práctica aún mejor sería generar estos archivos de secretos durante la secuencia de comandos del contenedor basándose en los datos de Vault u otra forma de compartir secretos. Dado que actualmente el formato de los secretos cambia, o los secretos en sí mismos, necesitamos comunicarlo al equipo fuera del canal de control de versiones, y esto no siempre funciona bien, para ser honesto. Pero los secretos cambian con poca frecuencia.
Evitamos que Terraform maneje nuestros secretos. Incluso si logra inyectar secretos mediante un archivo var "secrtes.tfvars" como se indicó anteriormente, estos secretos se almacenarán en su estado de terraformación (remota).
Puede proteger los archivos de estado remoto utilizando, por ejemplo, la autorización S3, o puede ignorar los archivos de estado locales, pero decidimos no confiar en este tipo de protección.
fuente
Si está en AWS, eche un vistazo a "La forma correcta de administrar secretos" de Segment.io en el Blog de AWS. Recomendamos utilizar
chamber
a todos nuestros clientes para administrar secretos. Funciona al aprovechar el almacén de parámetros de AWS Systems Manager (SSM) junto con las claves KMS. Esto garantiza que los secretos se cifren en reposo (y en tránsito), protegidos con IAM, auditables con CloudTrails y solo expuestos como variables de entorno en tiempo de ejecución.Después de configurar la cámara y configurar la clave KMS, escribimos los secretos en el almacén de parámetros.
Luego usa esos secretos cuando llames terraform.
Esto supone que ha definido una variable llamada
DB_USER
yDB_PASS
en su código HCL.Por ejemplo, podría agregar esto a
variables.tf
NOTA:
chamber
siempre exportará variables de entorno en mayúsculasProporcionamos un módulo de terraforma llamado
terraform-aws-kms-key
para facilitar el aprovisionamiento de la clave KMS. Consulte nuestra documentación detallada con ejemplos de cómo usarchamber
con múltiples espacios de nombres, así como cómo usar la cámara con terraform para administrar secretos. Vea nuestro ejemplo de referencia completo para aprovisionar dependencias de la cámara.En cuanto a
.tfstate
, traes un punto realmente bueno sobre la existencia de secretos de texto sin formato en el archivo de estado. Realmente no hay forma de evitar esto. Para que Terraform calcule los cambios para construir un plan, necesita conocer el estado "antes" y "después". Por este motivo, recomendamos utilizar un bucket S3 cifrado con versiones obligatorias. Utilice elterraform-aws-tfstate-backend
módulo para aprovisionar un cubo y una mesa de bloqueo DynamoDB de acuerdo con las mejores prácticas.fuente
Para importar secretos en archivos .tf, también puede usar una fuente de datos externa . Esto podría ser, por ejemplo, un script que descifra tus secretos.
fuente
Miré algunas formas diferentes, pero me gustó especialmente git-crypt para hacer algo ad hoc antes de implementar algo más grande como Vault.
fuente