Terraform prend en charge l' ajout d'un fichier supplémentaire avec des variables lors de l'appel.
documentation: https://www.terraform.io/intro/getting-started/variables.html#from-a-file
Nous utilisons cette fonctionnalité pour fournir un secrets.tfvars
fichier à chaque appel de Terraform. Nous utilisons également un script pour encapsuler la commande afin que son invocation soit cohérente et que tous les membres de l'équipe évitent de devoir faire les mêmes erreurs. Le wrapper se synchronise .tfstate
avec S3 avant une exécution et .tfstate
revient à S3 à la fin. J'entends aussi parler de gens qui font la même chose avec state stocké dans Consul, ajoutant même une sorte de sémaphore dans consul pour empêcher deux personnes de démarrer Terraform en même temps.
Lorsque vous évitez de définir une valeur par défaut dans un variables.tf
fichier, l'utilisateur est obligé de saisir cette valeur. Il peut être saisi manuellement ou à l'aide de l' -var-file
option de commande décrite ci-dessus. Ne pas définir une valeur par défaut sur vos secrets est un bon moyen d'appliquer des modifications qui nécessitent une modification des secrets.
Le secrets.tfvars
fichier est un lien symbolique vers l'un des fichiers contenant des secrets qui ne sont pas stockés dans le contrôle de version. Nous avons plusieurs, l' un par l' environnement, comme si secrets-prod.tfvars
, secrets-dev.tfvars
, secrets-stg.tfvars
, etc ...
Une pratique encore meilleure serait de générer ces fichiers secrets lors du script d'encapsidation en fonction des données de Vault ou d'une autre manière de partager des secrets. Depuis le moment où le format des secrets change, ou les secrets eux-mêmes, nous devons le communiquer à l'équipe en dehors du canal de contrôle de version - et cela ne fonctionne pas toujours bien, pour être honnête. Mais les secrets changent rarement.
Nous évitons terraform gérer nos secrets. Même si vous parvenez à injecter des secrets via un fichier var "secrtes.tfvars" comme indiqué ci-dessus, ces secrets seront stockés dans votre état terraform (remote-).
Vous pouvez protéger des fichiers d'état distants en utilisant, par exemple, une autorisation S3, ou vous pouvez créer des fichiers d'état locaux, mais nous avons décidé de ne pas compter sur ce type de protection.
la source
Si vous êtes sur AWS, consultez «Le bon moyen de gérer les secrets» par Segment.io sur le blog AWS. Nous recommandons
chamber
à tous nos clients de gérer leurs secrets. Il fonctionne en exploitant le SSM (AWS Systems Manager Parameter Store) avec les clés KMS. Cela garantit que les secrets sont cryptés au repos (et en transit), sécurisés avec IAM, contrôlables avec CloudTrails et exposés uniquement en tant que variables d'environnement au moment de l'exécution.Après avoir configuré la chambre et la clé KMS, nous écrivons les secrets dans le magasin de paramètres.
Ensuite, utilisez ces secrets lorsque vous appelez terraform.
Cela suppose que vous avez défini une variable appelée
DB_USER
etDB_PASS
dans votre code HCL.Par exemple, vous pouvez ajouter ceci à
variables.tf
REMARQUE:
chamber
exportera toujours les variables d’environnement en majusculesNous fournissons un module terraform appelé
terraform-aws-kms-key
pour faciliter le provisioning de la clé KMS. Consultez notre documentation détaillée avec des exemples d'utilisationchamber
de plusieurs espaces de noms ainsi que de l'utilisation de chamber avec terraform pour gérer les secrets. Voir notre exemple de référence complet pour les dépendances de la chambre d'approvisionnement.En ce qui concerne
.tfstate
, vous soulevez un très bon point sur l'existence de secrets en texte brut dans le fichier d'état. Il n'y a vraiment aucun moyen de contourner cela. Pour que terraform calcule les modifications nécessaires à la création d'un plan, il doit connaître l'état "avant" et "après". Pour cette raison, nous vous recommandons d'utiliser un compartiment S3 crypté avec la gestion des versions obligatoire. Utilisez leterraform-aws-tfstate-backend
module pour provisionner un compartiment et une table de verrouillage DynamoDB conformément aux meilleures pratiques.la source
Pour importer des secrets dans des fichiers .tf, vous pouvez également utiliser une source de données externe . Cela pourrait être par exemple un script qui déchiffre vos secrets.
la source
J'ai examiné différentes manières, mais j'ai particulièrement aimé git-crypt pour une tâche ad hoc avant de mettre en œuvre quelque chose de plus grand, comme Vault.
la source