Chiffrer des secrets dans Terraform

Pour que Terraform puisse communiquer avec les fournisseurs de services (“providers”) sur lesquels il doit pouvoir créer ses ressources, il a besoin des identifiants des plateformes en questions. Il y a plusieurs manières de faire, la plus basique étant de les passer via des variables d’environnement.

Personnellement je trouve embêtant d’avoir une étape supplémentaire qui consiste à sourcer un éventuel fichier .env. Puis si on est parano ou imprudent on peut craindre de faire fuiter ses secrets, par exemple avec un programme qui planterait et souhaiterait envoyer un rapport de plantage avec le contenu des variables d’environnement.

Jusque-là j’utilisais donc le plugin terraform-sops qui permet d’utiliser sops pour chiffrer et déchiffrer des secrets statiques, en se reposant sur des outils tels que GPG (beurk) et Age (miam) entre autres. Sauf que ça nous fait une chaine de dépendances terraform > plugin > sops > age que je serais content de pouvoir raccourcir.

Ça tombe bien, Terraform fournit une fonction rsadecrypt qui devrait pouvoir nous y aider.

On commence par générer une clé :

$ openssl genrsa -out ./privkey.pem 4096

Ensuite on créer le fichier JSON qui va contenir nos identifiants :

$ cat /tmp/secrets.json
{
  "scaleway": {
    "access_key": "***",
    "secret_key": "***"
  }
}

On le chiffre à l’aide notre clé RSA :

$ openssl rsautl -encrypt -inkey ./privkey.pem -in /tmp/secrets.json -out ./secrets.json

Et ensuite on peut le charger dans nos fichiers Terraform :

$ cat ./main.tf
[...]

locals {
  secrets = jsondecode(rsadecrypt(filebase64("${path.module}/secrets.json"), file("${path.module}/privkey.pem")))
}

provider "scaleway" {
  region     = "fr-par"
  zone       = "fr-par-1"
  access_key = local.secrets.scaleway.access_key
  secret_key = local.secrets.scaleway.secret_key
}

[...]

On se retrouve donc maintenant avec une chaine de dépendances nettement plus courte : terraform > openssl. Une victoire de plus pour le minimalisme !

Bon après il se pourrait qu’utiliser RSA via OpenSSL soit moins sécurisé que AEAD via Age, toutefois je pense que c’est suffisant pour mon modèle de menace.


Articles de blogs que je lis

Notes from kernel hacking in Hare, part 1

One of the goals for the Hare programming language is to be able to write kernels, such as my Helios project. Kernels are complex beasts which exist in a somewhat unique problem space and have constraints that many userspace programs are not accustomed to. T…
Drew DeVault's blog · 2022-09-07

L’année du requin : l’éden amer

À voir l’affiche et la bande-annonce, l’année du requin s’annonce comme une comédie estivale des plus traditionnelles, sorte de croisement entre « Les gendarmes de Saint-Tropez à la pêche au requin » et « Les bronzés au camping 3 ». Heureusement, la lectu…
ploum.net · 2022-08-10

#54 : Le regard d'un forestier sur les incendies

Francisco de Goya, L'incendie de nuit, 1793. "Cette toile, sans le moindre paysage, ce néant noir face à la lueur intense du brasier, ces taches blanches qui disent la fuite en vêtements de nuit, cette houle humaine désarticulée, qui fuit éperdue …
Nourritures terrestres · 2022-07-31