Back to Blog

Gestión de Secretos con Azure Key Vault y Terraform

Complete tutorial about azurerm_key_vault in Terraform. Learn secretos y claves, políticas de acceso, RBAC, protección de purga.

Gestión de Secretos con Azure Key Vault y Terraform

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:

  1. Terraform CLI instalado en tu máquina. Puedes descargarlo de Terraform.
  2. Una suscripción a Azure. Si no tienes una, puedes crear una cuenta gratuita en Azure.
  3. Azure CLI instalado y configurado. Puedes seguir las instrucciones en Azure CLI.
  4. 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

  1. 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.

  2. Protección de Claves de Cifrado: Proteger las claves de cifrado utilizadas para datos sensibles en bases de datos o almacenamiento.

  3. Certificados para Comunicación Segura: Almacenar y gestionar certificados SSL/TLS para aplicaciones web, asegurando que las comunicaciones sean seguras.

Mejores Prácticas

  1. 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.
  2. Habilitar la Protección de Purga: Esto evita la eliminación permanente de secretos accidentalmente.
  3. Separar los Key Vaults: Usa un Key Vault por aplicación y entorno para minimizar el riesgo de exposición.
  4. Auditar y Monitorear: Activa el registro de auditoría y las alertas para detectar actividades sospechosas.
  5. Rotación de Secretos: Implementa la rotación automática de secretos para mantener la seguridad.

Errores Comunes

  1. 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.
  2. Error: "Access denied": Esto sucede cuando el principal no tiene los permisos adecuados. Verifica las políticas de acceso y permisos de RBAC.
  3. Error: "The specified key vault does not exist": Asegúrate de que el Key Vault esté creado y que el ID proporcionado sea correcto.
  4. 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

¡Feliz implementación de secretos seguros en Azure! 🚀