Terug

OpenTofu state versleutelen met OVHcloud KMS

Aurélie Vache, Elena Luoto6 min leestijd

OpenTofu state versleutelen met OVHcloud KMS

OVHcloud-gebruikers kunnen blij zijn: Encryptie van OpenTofu state werkt nu met OVHcloud KMS, dus je kunt je state- en planbestanden beschermen met beheerde sleutels.

Wanneer mensen aan Infrastructure as Code denken, is Terraform vaak de eerste tool die in hun opkomt. Na de fork waaruit OpenTofu in ontstaan, is het project echter aanzienlijk geëvolueerd en zijn er features geïntroduceerd waarmee het zich duidelijk onderscheidt.

Een van de meest opvallende toevoegingen is encryptie van state en plan, een functionaliteit waar de community al jaren om vroeg.

OpenTofu ondersteunt nu encryptie van state- en planbestanden in rust, ongeacht of ze lokaal of in een externe backend zijn opgeslagen. Dit helpt teams bij het beschermen van gevoelige infrastructuurmetadata, inloggegevens en configuratiedetails die anders via state-bestanden zouden kunnen worden blootgesteld. Om encryptiesleutels te beheren, integreert OpenTofu met verschillende Key Management Services (KMS), waaronder OpenBao, AWS KMS, Google Cloud KMS en Azure Key Vault.

OVHcloud-gebruikers hebben nu ook die optie, dankzij de OpenTofu externe sleutelprovider voor OVHcloud KMS, die door OVHcloud wordt onderhouden. Hiermee kunnen ze gemanagede encryptiesleutels gebruiken om hun infrastructuurstate te beveiligen.

In dit blogbericht laat ik zien hoe je OVHcloud KMS gebruikt om je OpenTofu state- en planbestanden te versleutelen, waardoor de beveiliging van je Infrastructure as Code-workflows wordt verbeterd.

Waartegen beschermt encryptie?

Wanneer het is ingeschakeld, versleutelt OpenTofu statedata in rust, wat helpt om gevoelige informatie in het state-bestand te beschermen tegen ongeautoriseerde toegang.

Encryptie is echter geen vervanging voor back-up-, versiebeheer- of statemanagementmechanismen. Het voorkomt geen gegevensverlies en kan op zichzelf niet beschermen tegen alle vormen van state-corruptie of replay-aanvallen waarbij oudere state- of planbestanden betrokken zijn. Het kan ook niet voorkomen dat gebruikers die het tofu-commando uitvoeren toegang krijgen tot gevoelige waarden, aangezien zij de ontsleutelde state moeten kunnen lezen.

⚠️ Houd er rekening mee dat wanneer je encryptie inschakelt, je state- en planbestanden onherstelbaar worden zonder de juiste encryptiesleutel.

Vereisten

Voordat u begint, moet u ervoor zorgen dat u aan de volgende vereisten voldoet:

  • Een OVHcloud-account
  • Een OKMS (OVHcloud Key Management Service)-domein (“305db938-1234-5678-9012-3a0a29291661” als voorbeeld in dit blogbericht)
  • Een Service Key van het type “AES” met het “Wrap/Unwrap”-gebruik (“16491ef8-aaaa-bbbb-cccc-50ac90ab8e56” als voorbeeld in dit blogbericht)
  • Een IAM (Identity and Access Management) lokale gebruiker (“kms-305db938-1234-5678-9012-3a0a29291661” als voorbeeld in dit blogbericht)
  • De OVHcloud CLI, geïnstalleerd
  • De OpenTofu CLI, geïnstalleerd (v1.13+, waarbij externe sleutelproviders niet langer experimenteel zijn)

💡 De OVHcloud KMS-sleutelprovider ondersteunt zowel token- als mutual TLS (mTLS)-authenticatie. In dit blogbericht gebruiken we de token-authenticatiemodus. Volg de officiële handleiding voor sleutelproviders als u de mTLS-authenticatiemodus wilt gebruiken.

De sleutelprovider instellen

De sleutelprovider installeren

Installeer de sleutelprovider lokaal:

bash
curl -fsSL https://raw.githubusercontent.com/ovh/opentofu-kms-ovhcloud/main/install.sh | sh

⚠️ Het binaire bestand wordt standaard geïnstalleerd in $HOME/.local/bin (aangemaakt als dit nog niet bestaat). Zorg ervoor dat deze directory in uw PATH staat.

Of volg de andere installatiemethoden.

Nu kun je de OVHcloud KMS-sleutelprovider gebruiken 🎉.

Vind je OKMS-ID

Toon de OKMS-domeinen in een lijst:

bash
$ ovhcloud okms list
┌──────────────────────────────────────┬─────────────┐
│ id │ region │
├──────────────────────────────────────┼─────────────┤
│ 305db938-1234-5678-9012-3a0a29291661 │ eu-west-par │
│ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │ eu-west-par │
└──────────────────────────────────────┴─────────────┘

Sla het OKMS-ID op in een omgevingsvariabele:

bash
export KMS_RESTAPI_OKMSID="305db938-1234-5678-9012-3a0a29291661"

Genereer een token (alleen token-authenticatie)

De OpenTofu-encryptiefunctie vereist toestemming om toegang te krijgen tot en gebruik te maken van sleutels van OVHcloud KMS.

Als je token-authenticatie wilt gebruiken, heb je een personal access token (PAT) nodig. Je kunt de OVHcloud CLI gebruiken om dat te doen:

bash
KMS_RESTAPI_TOKEN=$(ovhcloud iam user token create <iam-local-user-name> --name pat-opentofu-<iam-local-user-name> --description "PAT opentofu for domain $KMS_RESTAPI_OKMSID" -o json | jq .details.token | tr -d '"')

echo $KMS_RESTAPI_TOKEN

Je zou ongeveer dit resultaat moeten krijgen:

bash
$ KMS_RESTAPI_TOKEN=$(ovhcloud iam user token create kms-305db938-1234-5678-9012-3a0a29291661 --name pat-opentofu-kms-305db938-1234-5678-9012-3a0a29291661 --description "PAT opentofu for domain 305db938-1234-5678-9012-3a0a29291661" -o json | jq .details.token | tr -d '"')
2026/05/07 08:48:34 Final parameters:
{
 "description": "PAT opentofu for domain 305db938-1234-5678-9012-3a0a29291661",
 "name": "pat-opentofu-kms-305db938-1234-5678-9012-3a0a29291661"
}

$ echo $KMS_RESTAPI_TOKEN
eyJhbGciOiJFZE...ASgXy55_DDFHdy4Z5uSq8lww-Bw

Sla de KMS-informatie op

Sla de instellingen op in omgevingsvariabelen. Bijvoorbeeld:

bash
export KMS_RESTAPI_TYPE=token
export KMS_KEY_ID="<your_service_key_id>"
export KMS_RESTAPI_ENDPOINT=$(ovhcloud okms get $KMS_RESTAPI_OKMSID -o json | jq .restEndpoint | xargs)

Geef de opgeslagen informatie weer:

bash
$ echo $KMS_RESTAPI_TYPE
token

$ echo $KMS_RESTAPI_ENDPOINT
https://eu-west-par.okms.ovh.net

$ echo $KMS_KEY_ID
16491ef8-aaaa-bbbb-cccc-50ac90ab8e56

$ echo $KMS_RESTAPI_TOKEN
eyJ...BIoHCA

Schakel encryptie van OpenTofu state in

Maak een provider.tf-bestand aan met de volgende inhoud:

bash
terraform {
  encryption {
    key_provider "external" "ovhcloud" {
      command = [
        "opentofu-kms-ovhcloud",
        # Key ID, of the service key used to wrap/unwrap the data key, will be automatically filled with the $KMS_KEY_ID environment variable
# RestAPI Token will be automatically filled with the $KMS_RESTAPI_TOKEN environment variable
        # OKMS ID will be automatically filled with $KMS_RESTAPI_OKMSID environment variable
      ]
    }
    method "aes_gcm" "ovhcloud" {
      keys = key_provider.external.ovhcloud
    }
    state {
      method = method.aes_gcm.ovhcloud
    }
    plan {
      method = method.aes_gcm.ovhcloud
    }
  }
}

In dit voorbeeld maken we een my-null-resource.tf-bestand aan met de volgende inhoud:

bash
resource "null_resource" "test" {}

💡 Let op: gebruik in een echt project je bestaande “*.tf”-bestanden in plaats van deze voorbeeldresource.

Initialiseer het OpenTofu-project:

bash
$ tofu init

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/null...
- Installing hashicorp/null v3.3.2...
- Installed hashicorp/null v3.3.2 (signed, key ID 0C0AF313E5FD9F80)

Providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://opentofu.org/docs/cli/plugins/signing/

OpenTofu has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that OpenTofu can guarantee to make the same selections by default when
you run "tofu init" in the future.

OpenTofu has been successfully initialized!

You may now begin working with OpenTofu. Try running "tofu plan" to see
any changes that are required for your infrastructure. All OpenTofu commands
should now work.

If you ever set or change modules or backend configuration for OpenTofu,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Pas het toe:

bash
$ tofu apply

OpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

OpenTofu will perform the following actions:

  # null_resource.test will be created
  + resource "null_resource" "test" {
      + id = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  OpenTofu will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

null_resource.test: Creating...
null_resource.test: Creation complete after 0s [id=5663203269009606061]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Geef het state-bestand weer:

bash
$ cat terraform.tfstate | jq
{
  "serial": 1,
  "lineage": "ba70b37d-aaaa-bbbb-cccc-25cd80b64d26",
  "meta": {
    "key_provider.external.ovhcloud": "eyJleHRlcm5………idyJ9fQ=="
  },
  "encrypted_data": "EXCFfXjgFmevAs..b……………………………fHz8mXkE/Oh3qMip7l3D7TX5vt",
  "encryption_version": "v0"
}

De state is nu versleuteld 🎉.

💡 Let op dat er elke keer dat je de tofu plan- of tofu apply-commando's uitvoert, een nieuwe tijdelijke datasleutel wordt gegenereerd die met je OVHcloud-servicesleutel wordt beveiligd.

Conclusie

Dit bericht liet zien hoe je encryptie van OpenTofu state instelt met OVHcloud KMS, zodat zowel je state- als planbestanden beschermd zijn.

Met de OVHcloud KMS-sleutelprovider kun je gemanagede encryptiesleutels rechtstreeks in je Infrastructure as Code (IaC)-workflows opnemen.

Ons team werkt aan diverse andere integraties. Probeer ondertussen de sleutelprovider en zoals altijd nodigen we je uit om je feedback te delen op de GitHub-repository!


Delen op: