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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Secreto | un valor que nadie más debe ver, como una clave | |
| Sensitive | marcado para que la herramienta lo oculte en pantalla | sensitive = true |
| Variable de entorno | un valor que el shell pasa a un comando | TF_VAR_token |
| Estado | el archivo donde OpenTofu anota lo que creó | |
| Archivo de exclusión | una 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
mkdir -p ~/iac-demo/vault && cd ~/iac-demo/vaultSe 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
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.tfSe 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
tofu init -no-color | grep successfullySe 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
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
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
tofu outputSe 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
grep -c moon42 terraform.tfstateSe 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
tofu output -raw shown; echoSe 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
printf '%s\n' 'terraform.tfstate' 'terraform.tfstate.backup' '*.tfvars' '.terraform/' > .gitignoreSe 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
printf '%s\n' 'locals {' ' api_token = "moon42"' '}' > leak.tf; grep -nE '(token|secret|password|key)[a-z_]* *= *"' *.tf; rm leak.tfSe 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
# 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?