Gestión de Secretos con Azure Key Vault y Terraform
Introducción
Azure Key Vault es un servicio en la nube que permite a las organizaciones almacenar y gestionar de forma segura secretos, claves de cifrado y certificados. Su uso se extiende a diversas aplicaciones que requieren proteger información sensible como contraseñas, cadenas de conexión y claves API. Implementar Azure Key Vault a través de Infrastructure as Code (IaC), utilizando herramientas como Terraform, permite a los desarrolladores automatizar la creación y gestión de estos recursos, facilitando una infraestructura más segura y reproducible.
La importancia de IaC radica en su capacidad para reducir errores humanos, aumentar la velocidad de despliegue y proporcionar una transparencia total en la infraestructura. Las principales aplicaciones de Azure Key Vault incluyen la gestión de secretos para aplicaciones en la nube, el almacenamiento seguro de claves de cifrado y la protección de certificados utilizados en comunicaciones seguras.
Prerrequisitos
Antes de comenzar, asegúrate de tener lo siguiente:
- Terraform CLI instalado en tu máquina. Puedes descargarlo de Terraform.
- Una suscripción a Azure. Si no tienes una, puedes crear una cuenta gratuita en Azure.
- Azure CLI instalado y configurado. Puedes seguir las instrucciones en Azure CLI.
- Un service principal para autenticar Terraform con Azure. Puedes crear uno con el siguiente comando:
az ad sp create-for-rbac --name <nombre> --role Contributor --scopes /subscriptions/<tu_suscripción>
Conceptos Fundamentales
- Secretos: Información sensible como contraseñas y claves API almacenadas en Azure Key Vault.
- Claves: Claves criptográficas utilizadas para cifrar datos.
- Políticas de acceso: Configuraciones que determinan quién puede acceder a los secretos y claves dentro del Key Vault.
- RBAC (Control de Acceso Basado en Roles): Un modelo que permite a las organizaciones gestionar el acceso a los recursos de Azure.
- Protección de purga: Una característica que previene la eliminación permanente de secretos después de haber sido eliminados de forma "suave".
Sintaxis del Recurso
azurerm_key_vault
| Argumento | Descripción |
|---|---|
name |
El nombre del Key Vault (debe ser único a nivel global). |
location |
La región de Azure donde se desplegará el Key Vault. |
resource_group_name |
El nombre del grupo de recursos donde se ubicará el Key Vault. |
sku |
El tipo de SKU (Standard o Premium) para el Key Vault. |
tenant_id |
El ID del inquilino de Azure AD que poseerá el Key Vault. |
soft_delete_retention_days |
Días de retención para eliminar objetos suavemente. |
purge_protection_enabled |
Habilita la protección de purga para prevenir la eliminación permanente. |
Ejemplos Prácticos
Ejemplo 1: Crear un Key Vault Básico
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "example" {
name = "example-resources"
location = "East US"
}
resource "azurerm_key_vault" "example" {
name = "examplekeyvault123"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
sku = "standard"
tenant_id = "<tu_tenant_id>"
soft_delete_retention_days = 90
purge_protection_enabled = true
}
Ejemplo 2: Agregar un Secreto al Key Vault
resource "azurerm_key_vault_secret" "example_secret" {
name = "example-secret"
value = "MiSuperSecreto123"
key_vault_id = azurerm_key_vault.example.id
}
Ejemplo 3: Definir una Política de Acceso
resource "azurerm_key_vault_access_policy" "example_policy" {
key_vault_id = azurerm_key_vault.example.id
tenant_id = "<tu_tenant_id>"
object_id = "<id_de_objeto_del_usuario_o_aplicación>"
secret_permissions = [
"get",
"list",
]
}
Ejemplo 4: Crear un Key Vault con RBAC
resource "azurerm_role_assignment" "example_assignment" {
principal_id = "<id_de_objeto_del_usuario_o_aplicación>"
role_definition_name = "Key Vault Administrator"
scope = azurerm_key_vault.example.id
}
Ejemplo 5: Habilitar el Acceso Privado al Key Vault
resource "azurerm_private_endpoint" "example" {
name = "example-private-endpoint"
location = azurerm_key_vault.example.location
resource_group_name = azurerm_resource_group.example.name
subnet_id = azurerm_subnet.example.id
private_service_connection {
name = "example-private-connection"
is_manual_connection = false
private_connection_resource_id = azurerm_key_vault.example.id
subresource_names = ["vault"]
}
}
Ejemplo 6: Configurar un Diagnóstico para el Key Vault
resource "azurerm_monitor_diagnostic_setting" "example" {
name = "example-diagnostic"
target_resource_id = azurerm_key_vault.example.id
log {
category = "AuditEvent"
enabled = true
retention_policy {
enabled = false
days = 0
}
}
metric {
category = "AllMetrics"
enabled = true
retention_policy {
enabled = false
days = 0
}
}
}
Ejemplo 7: Crear un Certificado en el Key Vault
resource "azurerm_key_vault_certificate" "example_certificate" {
name = "example-certificate"
key_vault_id = azurerm_key_vault.example.id
certificate_policy {
issuer_parameters {
name = "Self"
}
subject_alternative_names = ["example.com"]
validity_in_months = 12
content_type = "application/x-pkcs12"
}
}
Ejemplo 8: Recuperar un Secreto
data "azurerm_key_vault_secret" "example" {
name = azurerm_key_vault_secret.example_secret.name
key_vault_id = azurerm_key_vault.example.id
}
Casos de Uso del Mundo Real
Gestión de Secretos para Aplicaciones: Usar Azure Key Vault para almacenar secretos de aplicaciones que se ejecutan en Azure, asegurando que las credenciales no se expongan en el código fuente.
Protección de Claves de Cifrado: Proteger las claves de cifrado utilizadas para datos sensibles en bases de datos o almacenamiento.
Certificados para Comunicación Segura: Almacenar y gestionar certificados SSL/TLS para aplicaciones web, asegurando que las comunicaciones sean seguras.
Mejores Prácticas
- Controlar el Acceso: Utiliza RBAC para gestionar quién tiene acceso a los secretos y claves, evitando el uso de políticas de acceso heredadas.
- Habilitar la Protección de Purga: Esto evita la eliminación permanente de secretos accidentalmente.
- Separar los Key Vaults: Usa un Key Vault por aplicación y entorno para minimizar el riesgo de exposición.
- Auditar y Monitorear: Activa el registro de auditoría y las alertas para detectar actividades sospechosas.
- Rotación de Secretos: Implementa la rotación automática de secretos para mantener la seguridad.
Errores Comunes
- Error: "Key Vault name must be unique": Este error ocurre si el nombre del Key Vault ya está en uso en Azure. Asegúrate de que el nombre sea único a nivel global.
- Error: "Access denied": Esto sucede cuando el principal no tiene los permisos adecuados. Verifica las políticas de acceso y permisos de RBAC.
- Error: "The specified key vault does not exist": Asegúrate de que el Key Vault esté creado y que el ID proporcionado sea correcto.
- Error: "Invalid secret value": Asegúrate de que el valor del secreto no exceda el límite de caracteres permitido.
Recursos Relacionados
| Recurso | Enlace |
|---|---|
| Azure Key Vault Documentation | Microsoft Learn |
| Terraform Provider for Azure | Terraform Registry |
| Best Practices for Azure Key Vault | Best Practices |
Script Completo de Infraestructura
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "example" {
name = "example-resources"
location = "East US"
}
resource "azurerm_key_vault" "example" {
name = "examplekeyvault123"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
sku = "standard"
tenant_id = "<tu_tenant_id>"
soft_delete_retention_days = 90
purge_protection_enabled = true
}
resource "azurerm_key_vault_secret" "example_secret" {
name = "example-secret"
value = "MiSuperSecreto123"
key_vault_id = azurerm_key_vault.example.id
}
Conclusión
Azure Key Vault es una herramienta esencial para la gestión segura de secretos y claves en entornos de Azure. A través de Terraform, puedes automatizar la creación y configuración de Key Vault, facilitando la implementación de una estrategia de seguridad robusta. Para avanzar, considera explorar más sobre las integraciones de Key Vault con otras soluciones de seguridad en Azure.
Referencias
- Documentación de Azure Key Vault
- Registro de Terraform para el Proveedor de Azure
- Mejores Prácticas para Azure Key Vault
¡Feliz implementación de secretos seguros en Azure! 🚀