Gestión de Secretos
La Gestión de Secretos es el conjunto de prácticas y herramientas que usamos para manejar de forma segura las credenciales, API keys, tokens y cualquier otra información sensible.
Almacenes de Secretos en HERA
Sección titulada «Almacenes de Secretos en HERA»Utilizamos dos herramientas principales, cada una con un propósito específico:
-
GCP Secret Manager:
- Uso Principal: Almacenar secretos para aplicaciones en runtime. Por ejemplo, contraseñas de bases de datos, API keys de servicios de terceros que tu aplicación necesita para funcionar.
- Ventajas: Versionado de secretos, auditoría completa de accesos, integración nativa con IAM y Workload Identity.
-
GitLab CI/CD Variables:
- Uso Principal: Proveer secretos al ambiente de CI/CD durante el pipeline. Por ejemplo, el token de SonarQube (
SONAR_TOKEN) o las credenciales para hacer push a un registro. - Ventajas: Integrado en GitLab, fácil de usar, con opciones de
Masked(ocultar en logs) yProtected(solo disponible en ramas protegidas).
- Uso Principal: Proveer secretos al ambiente de CI/CD durante el pipeline. Por ejemplo, el token de SonarQube (
- Versionado y auditoría completa
- Integración con IAM + Workload Identity
- Montado como archivo en el pod (CSI Driver)
- Integrado en GitLab, fácil de usar en
.gitlab-ci.yml - Masked: ocultado en los logs del pipeline
- Protected: disponible solo en ramas protegidas
.env comiteados a Git Acceso a Secretos desde GKE (Runtime)
Sección titulada «Acceso a Secretos desde GKE (Runtime)»El método estándar y obligatorio para que tus aplicaciones en GKE accedan a secretos de GCP Secret Manager es a través de Workload Identity y el External Secrets Operator (ESO).
Secret Manager + External Secrets Operator + Workload Identity
Sección titulada «Secret Manager + External Secrets Operator + Workload Identity»HERA utiliza External Secrets Operator (ESO) para sincronizar de forma segura los secretos desde GCP Secret Manager hacia Secrets nativos de Kubernetes. Este enfoque desacopla tu aplicación de la API de GCP y permite consumir secretos como variables de entorno estándar.
Flujo de trabajo:
- El secreto se almacena en GCP Secret Manager (ej.
mi-app-db-password). - El pod asume una identidad de GCP mediante Workload Identity (ej.
mi-app-gsa@mi-proyecto.iam). - El GSA tiene el rol
roles/secretmanager.secretAccessorotorgado sobre los secretos específicos que necesita. - El operador ESO lee el secreto de GCP utilizando Workload Identity y crea un
Secretnativo en tu namespace de Kubernetes. - Tu aplicación consume el secreto inyectado como variable de entorno usando
valueFrom.secretKeyRef.
Configuración del ExternalSecret (CRD)
Sección titulada «Configuración del ExternalSecret (CRD)»Para que ESO sincronice un secreto, debes definir un recurso ExternalSecret en tu repositorio. El operador se encarga de mantenerlo sincronizado (útil para la rotación automática).
apiVersion: external-secrets.io/v1beta1kind: ExternalSecretmetadata: name: mi-app-db-credentials namespace: mi-appspec: refreshInterval: "1h" # Frecuencia con la que ESO verifica cambios en GCP secretStoreRef: name: gcp-secret-store # Referencia al ClusterSecretStore configurado por Plataforma kind: ClusterSecretStore target: name: mi-app-db-credentials-k8s # Nombre del Secret de K8s que ESO creará creationPolicy: Owner data: - secretKey: password # Llave dentro del Secret de K8s remoteRef: key: mi-app-db-password # Nombre del secreto en GCP Secret ManagerRotación de Secretos
Sección titulada «Rotación de Secretos»Los secretos no deben ser eternos. La rotación periódica limita el tiempo de exposición en caso de una brecha.
Política de Rotación
Sección titulada «Política de Rotación»| Tipo de Secreto | Frecuencia de Rotación |
|---|---|
| API Keys críticas | 30 días |
| Service Account Keys (si se usan) | 90 días |
| Contraseñas de Bases de Datos | 90 días |
| JWT Secrets | 180 días |
El proceso de rotación debe seguir un flujo que evite el downtime:
- Crear y agregar el nuevo secreto (versión N+1) en el almacén.
- Desplegar la aplicación para que empiece a usar el nuevo secreto.
- Verificar que la aplicación funciona correctamente con la nueva versión.
- Desactivar y eliminar el secreto antiguo (versión N).