Uso seguro de variables y secretos en GCP con Go


Manejar secretos —como claves API, tokens y credenciales— de forma segura es esencial en cualquier aplicación moderna. Google Cloud Platform (GCP) ofrece una solución robusta para este desafío a través de Secret Manager, que permite almacenar, acceder y auditar secretos de manera segura y centralizada.

Este artículo muestra cómo acceder y gestionar secretos en GCP desde aplicaciones desarrolladas en Go, asegurando que tus variables sensibles estén protegidas sin necesidad de hardcodearlas o exponerlas en entornos inseguros.

¿Por qué usar Secret Manager?

Secret Manager de GCP es un servicio completamente gestionado que ofrece:

  • Cifrado automático con claves de Google o personalizadas (CMEK).
  • Versionado de secretos para revertir fácilmente a estados anteriores.
  • Control de acceso granular vía IAM.
  • Registros de auditoría con Cloud Audit Logs.
  • Integración nativa con entornos serverless, Compute Engine y GKE.

Requisitos previos

Antes de comenzar, asegurate de tener:

  • Un proyecto activo en Google Cloud.
  • El API de Secret Manager habilitada.
  • El SDK de Google Cloud (gcloud) configurado.
  • Una cuenta de servicio con permisos Secret Manager Accessor (roles/secretmanager.secretAccessor).
  • Go instalado (se recomienda Go 1.20+).
  • Módulos habilitados (go mod init en tu proyecto).

Paso 1: Crear y almacenar un secreto en GCP

Desde la consola o terminal:

gcloud secrets create DB_PASSWORD --replication-policy=automatic
echo -n "super-clave-secreta" | gcloud secrets versions add DB_PASSWORD --data-file=-

Esto crea el secreto DB_PASSWORD con una versión y lo almacena de forma segura.

Paso 2: Configurar permisos de acceso

Otorgá acceso a la cuenta de servicio usada por tu aplicación:

gcloud secrets add-iam-policy-binding DB_PASSWORD \
  --member="serviceAccount:mi-cuenta@mi-proyecto.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

Paso 3: Instalar dependencias en Go

En tu archivo go.mod:

go get cloud.google.com/go/secretmanager/apiv1
go get google.golang.org/api/option

Paso 4: Código para acceder al secreto en Go

package main

import (
	"context"
	"fmt"
	"log"

	secretmanager "cloud.google.com/go/secretmanager/apiv1"
	"google.golang.org/api/option"
	secretspb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
)

func main() {
	ctx := context.Background()

	client, err := secretmanager.NewClient(ctx, option.WithCredentialsFile("ruta/a/tu/clave.json"))
	if err != nil {
		log.Fatalf("Error creando cliente: %v", err)
	}
	defer client.Close()

	accessRequest := &secretspb.AccessSecretVersionRequest{
		Name: "projects/ID_PROYECTO/secrets/DB_PASSWORD/versions/latest",
	}

	result, err := client.AccessSecretVersion(ctx, accessRequest)
	if err != nil {
		log.Fatalf("Error accediendo al secreto: %v", err)
	}

	secret := string(result.Payload.Data)
	fmt.Println("Secreto accedido:", secret)
}

⚠️ Nunca imprimas el secreto en producción. Este ejemplo es solo para demostración.

Paso 5: Uso de secretos en variables de entorno

import (
	"os"
)

os.Setenv("DB_PASSWORD", secret)
fmt.Println(os.Getenv("DB_PASSWORD"))

Esto es útil para usar librerías que esperan configuraciones vía env.

Buenas prácticas

  • Nunca hardcodees secretos en el código fuente.
  • Evitá guardar secretos en archivos de configuración planos.
  • Usá versionado de secretos para rotaciones sin downtime.
  • Controlá el acceso con políticas IAM específicas para minimizar el riesgo.
  • Usá registros de auditoría para detectar accesos indebidos.
  • No loguees secretos accidentalmente.

Alternativas: acceso automático desde Cloud Run o GKE

Si desplegás en Cloud Run, App Engine o GKE, podés acceder a los secretos sin usar claves JSON, simplemente mediante la cuenta de servicio adjunta al entorno, lo que refuerza la seguridad y evita manejar archivos sensibles.

client, err := secretmanager.NewClient(ctx) // sin option.WithCredentialsFile

Este enfoque se recomienda en producción.

Conclusión

Secret Manager permite gestionar variables sensibles de forma segura, eficiente y auditada. Su integración con Go es directa gracias al SDK oficial, lo que permite eliminar configuraciones inseguras y mejorar la postura de seguridad general de cualquier aplicación backend.

Adoptar estas buenas prácticas desde el inicio mejora la seguridad, simplifica la gestión de configuración y garantiza que tus aplicaciones Go en GCP estén listas para producción desde el primer día.


Ver también

comments powered by Disqus