
Temos grandes notícias para os nossos clientes: a encriptação de estado no OpenTofu já funciona com o KMS da OVHcloud, para que possa proteger os seus ficheiros de estado e de plano com chaves geridas.
Quando as pessoas pensam em Infrastructure-as-Code, o Terraform costuma ser a primeira ferramenta que lhes ocorre. No entanto, desde o fork que deu origem ao OpenTofu, o projeto evoluiu significativamente e introduziu funcionalidades que o ajudam a destacar-se.
Uma das maiores novidades é a encriptação de estado e de plano, uma funcionalidade que a comunidade já solicitava há anos.
O OpenTofu passa a suportar a encriptação de ficheiros de estado e de plano em repouso, quer sejam armazenados localmente ou num backend remoto. Isto ajuda as equipas a proteger metadados sensíveis da infraestrutura, credenciais e detalhes de configuração que, de outra forma, poderiam ficar expostos através dos ficheiros de estado. Para gerir chaves de encriptação, o OpenTofu integra-se com vários Key Management Services (KMS), incluindo OpenBao, AWS KMS, Google Cloud KMS e Azure Key Vault.
Os nossos clientes também têm agora essa opção, graças ao fornecedor de chaves externas do OpenTofu para o KMS da OVHcloud, que a OVHcloud mantém. Assim, podem usar chaves de encriptação geridas para proteger o estado da sua infraestrutura.
Neste artigo, mostramos como utilizar o KMS da OVHcloud para encriptar os seus ficheiros de estado e de plano no OpenTofu, melhorando a segurança dos seus fluxos de trabalho de Infrastructure-as-Code.
Contra o que protege a encriptação?
Quando ativada, o OpenTofu encripta os dados de estado em repouso, ajudando a proteger informações sensíveis no ficheiro de estado contra acessos não autorizados.
Contudo, a encriptação não substitui mecanismos de backup, controlo de versões ou gestão de estado. Não evita a perda de dados e, por si só, não é capaz de proteger contra todas as formas de corrupção de estado ou ataques de repetição que envolvam ficheiros de estado ou de plano mais antigos. Também não impede que os utilizadores que executam o comando tofu acedam a valores sensíveis, uma vez que têm de conseguir ler o estado desencriptado.
⚠️ Tenha em atenção que, ao ativar a encriptação, os seus ficheiros de estado e de plano tornam-se irrecuperáveis sem a devida chave de encriptação.
Pré-requisitos
Antes de começar, certifique-se de que cumpre os seguintes pré-requisitos:
- Uma conta OVHcloud
- Um domínio OKMS (OVHcloud Key Management Service; o exemplo neste artigo é «305db938-1234-5678-9012-3a0a29291661»)
- Uma Service Key do tipo AES com a utilização Wrap/Unwrap (o exemplo neste artigo é «16491ef8-aaaa-bbbb-cccc-50ac90ab8e56»)
- Um utilizador local de IAM (Identity and Access Management; o exemplo neste artigo é «kms-305db938-1234-5678-9012-3a0a29291661»)
- A CLI OVHcloud instalada
- A CLI OpenTofu instalada (v1.13+, em que os fornecedores de chaves externas já não são experimentais)
💡 O fornecedor de chaves KMS da OVHcloud suporta autenticação por token e autenticação mútua TLS (mTLS). Neste artigo, usamos o modo de autenticação por token. Siga o guia oficial do fornecedor de chaves se desejar recorrer ao modo de autenticação mTLS.
Configure o fornecedor de chaves
Instale o fornecedor de chaves
Instale o fornecedor de chaves localmente:
curl -fsSL https://raw.githubusercontent.com/ovh/opentofu-kms-ovhcloud/main/install.sh | sh⚠️ O binário é instalado em $HOME/.local/bin por predefinição (criado se não existir). Certifique-se de que este diretório está no seu PATH.
Ou siga os outros métodos de instalação.
Agora pode utilizar o fornecedor de chaves KMS da OVHcloud 🎉.
Encontre o seu ID OKMS
Liste os domínios OKMS:
$ ovhcloud okms list
┌──────────────────────────────────────┬─────────────┐
│ id │ region │
├──────────────────────────────────────┼─────────────┤
│ 305db938-1234-5678-9012-3a0a29291661 │ eu-west-par │
│ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │ eu-west-par │
└──────────────────────────────────────┴─────────────┘Guarde o ID OKMS numa variável de ambiente:
export KMS_RESTAPI_OKMSID="305db938-1234-5678-9012-3a0a29291661"Gere um token (apenas autenticação por token)
A funcionalidade de encriptação do OpenTofu requer permissão para aceder e utilizar chaves do KMS da OVHcloud.
Se pretender usar a autenticação por token, precisará de um token de acesso pessoal (PAT). Pode utilizar a CLI OVHcloud para o fazer:
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_TOKENDeverá obter um resultado como este:
$ 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-BwGuardar as informações do KMS
Armazene as definições em variáveis de ambiente. Por exemplo:
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)Apresente as informações guardadas:
$ 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...BIoHCAAtive a encriptação do estado do OpenTofu
Crie um ficheiro provider.tf com o seguinte conteúdo:
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
}
}
}
Neste exemplo, vamos criar um ficheiro my-null-resource.tf com o seguinte conteúdo:
resource "null_resource" "test" {}💡 Nota: num projeto real, use os seus ficheiros *.tf existentes, em vez deste recurso de exemplo.
Inicie o projeto OpenTofu:
$ 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.Aplique-o:
$ 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.
Apresente o ficheiro de estado:
$ 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"
}O estado já está encriptado 🎉.
💡 Tenha em atenção que, de cada vez que executa os comandos tofu plan ou tofu apply, é gerada uma nova chave de dados efémera, protegida pela sua Service Key OVHcloud.
Conclusão
Este artigo mostrou como configurar a encriptação de estado no OpenTofu com o KMS da OVHcloud, para que tanto os seus ficheiros de estado como os de plano fiquem protegidos.
Com o fornecedor de chaves KMS da OVHcloud, pode integrar chaves de encriptação geridas diretamente nos seus fluxos de trabalho de Infrastructure-as-Code.
As nossas equipas encontram-se a trabalhar em várias outras integrações. Entretanto, teste o fornecedor de chaves e, como sempre, partilhe o seu feedback no repositório do GitHub!