¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Mantener los secretos fuera del código de infraestructura

Después de esta lección: Puedo mantener un secreto fuera de los archivos de OpenTofu y decir dónde acaba aun así.

Lección de 60 min10 comandosLaboratorio de OpenTofu: la infraestructura como código, con plan, apply y estado, en una VM

La clave en la portada

Una estudiante sube un proyecto a un repositorio público. Un archivo lleva una clave de acceso, porque con ella funcionó la primera prueba.

Programas que leen repositorios públicos todo el día la encuentran en minutos. Una clave en un archivo la puede usar cualquiera y se queda en el historial aunque se cambie el archivo.

Al final de esta lección

Nota

Puedo mantener un secreto fuera de los archivos de OpenTofu y decir dónde acaba aun así.

Palabras clave

PalabraQué significaEjemplo
Secretoun valor que nadie más debe ver, como una clave
Sensitivemarcado para que la herramienta lo oculte en pantallasensitive = true
Variable de entornoun valor que el shell pasa a un comandoTF_VAR_token
Estadoel archivo donde OpenTofu anota lo que creó
Archivo de exclusiónuna lista de archivos que el control de versiones omite.gitignore

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un secreto no va en archivos versionados

Un valor escrito en un archivo .tf se guarda con el proyecto, se copia en cada clon y se conserva en el historial. Por eso un secreto se entrega a OpenTofu desde fuera.

La forma habitual es una variable de entorno. Una variable llamada token se fija con TF_VAR_token. Marcarla como sensitive la oculta después en pantalla.

Crea una carpeta y entra

Comando
mkdir -p ~/iac-demo/vault && cd ~/iac-demo/vault

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe un proyecto que recibe un secreto

Comando
printf '%s\n' 'variable "token" {' '  type      = string' '  sensitive = true' '}' '' 'resource "terraform_data" "login" {' '  input = var.token' '}' '' 'output "shown" {' '  value     = terraform_data.login.output' '  sensitive = true' '}' > main.tf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Prepara la carpeta

Comando
tofu init -no-color | grep successfully

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Planifica con el secreto en el entorno

Comando
TF_VAR_token=moon42 tofu plan -no-color | grep -E "input|^Plan"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Aplícalo

Comando
TF_VAR_token=moon42 tofu apply -auto-approve -no-color | grep -E "Apply complete|shown"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lista las salidas

Comando
tofu output

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sensitive solo oculta un valor

sensitive solo cambia lo que se imprime. El estado sigue guardando cada valor en claro, porque OpenTofu lo necesita para comparar la próxima vez.

El archivo de estado es tan secreto como el secreto. Mantenlo fuera del control de versiones y, en trabajo real, en un almacén cifrado con acceso limitado.

Cuenta dónde el estado guarda el valor

Comando
grep -c moon42 terraform.tfstate

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pide la salida en bruto

Comando
tofu output -raw shown; echo

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que sensitive cifra un valor. No lo hace. Oculta el valor en el plan y en la salida, y quien lea el estado o ejecute tofu output -raw lo sigue viendo. Protege también el estado.

Un archivo de exclusión deja fuera el estado

Un .gitignore lista los archivos que el control de versiones nunca añade. Cuatro líneas cubren un proyecto de OpenTofu: el estado, su copia de seguridad, cualquier archivo .tfvars y la carpeta .terraform.

Si te olvidas de una, un estado con un secreto puede acabar subido al repositorio.

Escribe un archivo de exclusión

Comando
printf '%s\n' 'terraform.tfstate' 'terraform.tfstate.backup' '*.tfvars' '.terraform/' > .gitignore

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Planta un secreto y búscalo

Comando
printf '%s\n' 'locals {' '  api_token = "moon42"' '}' > leak.tf; grep -nE '(token|secret|password|key)[a-z_]* *= *"' *.tf; rm leak.tf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una búsqueda de secretos en Python

Código: python
# Busca líneas que dan valor a un secreto en el propio archivo.
lines = [
    'region = "eu-west-2"',
    'api_token = "moon42"',
    'api_token = var.api_token',
]
words = ["token", "secret", "password", "key"]
number = 0
for line in lines:
    number = number + 1
    name = line.split("=")[0].strip().lower()
    value = line.split("=")[1].strip()
    suspicious = False
    for word in words:
        if word in name:
            suspicious = True
    if suspicious and value.startswith('"'):
        print("línea", number, "da valor a", name)
# Cambia la tercera línea por un valor entre comillas y mira otra vez.

Para ir más lejos: un archivo de variables

Escribe la línea token = "sun77" en un archivo llamado secret.tfvars. Ejecuta tofu plan -no-color -var-file=secret.tfvars | grep -E "input|^Plan" y borra el archivo después.

¿Se ve el valor nuevo en el plan? ¿Por qué *.tfvars está en el archivo de exclusión?

Sobre este laboratorio y su código: Laboratorio de OpenTofu: la infraestructura como código, con plan, apply y estado, en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.