Compartir a través de


Aplicaciones, claves de API y secretos de Azure Key Vault

Azure Key Vault es un servicio de Azure que protege secretos, claves criptográficas y certificados. Proporciona un repositorio centralizado, seguro y de alta disponibilidad para información confidencial, como las claves de API. Un método para evitar la práctica no segura de insertar claves de API directamente en el código fuente de la aplicación es configurar la aplicación para interactuar de forma segura con las claves de API almacenadas en Azure Key Vault.

En este artículo aprenderá a crear una instancia de Key Vault, agregar una clave de API como un secreto a este almacén de claves y, a continuación, configurar el almacén de claves mediante procedimientos recomendados. Estos procedimientos recomendados incluyen restringir el acceso mediante el control de acceso basado en roles (RBAC), habilitar la supervisión y restringir el acceso a la red.

Creación y protección de una instancia de Azure Key Vault

Azure Key Vault le permite almacenar de forma segura claves criptográficas, secretos y certificados. Debe implementar almacenes de claves independientes para distintos entornos (desarrollo, almacenamiento provisional, producción) y aplicaciones.

Cree una instancia de grupo de recursos y de almacén de claves

Para crear una instancia de Key Vault, puede usar el siguiente comando desde la CLI de Azure o Azure Cloud Shell:

  1. Uso del comando az group create para crear un grupo de recursos:

    az group create --name myResourceGroup --location eastus
    

    Si lo prefiere, puede cambiar "eastus" a una ubicación más próxima.

  2. Use az keyvault create para crear el almacén de claves:

    az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
    

    Reemplace <your-unique-keyvault-name> por un nombre que sea único en todo Azure. Normalmente, se usa el nombre personal o de la empresa, junto con otros números e identificadores.

Agregar una clave de API a Azure Key Vault como secreto

Una vez creada la instancia de Azure Key Vault, puede agregar una clave de API como un secreto a esta instancia de Azure Key Vault.

A continuación se usa el comando az keyvault secret set de la CLI de Azure para agregar un secreto denominado MyApiKey al almacén de claves y se establece que el secreto expire después de 180 días:

az keyvault secret set \
    --vault-name "<YourKeyVaultName>" \
    --name "MyApiKey" \
    --value "<YourSecretValue>"
    --expires "$(date -u -d '+180 days' +'%Y-%m-%dT%H:%M:%SZ')"

Debe intentar rotar las claves de API periódicamente. En función de las necesidades de seguridad de su organización, puede optar por rotar las claves con más o menos frecuencia que cada 180 días. Puede configurar una suscripción de Event Grid para el evento "SecretNearExpiry" como método para recibir una notificación sobre los secretos de clave de API que expiran.

Restricción del acceso a Key Vault mediante RBAC

Puede restringir el acceso a la instancia de Azure Key Vault para que solo la identidad de la aplicación tenga acceso a Azure Key Vault.

Para ello, configure un rol de Control de acceso basado en roles (RBAC) mediante el comando az role assignment create de la CLI de Azure:

az role assignment create --role "Key Vault Secrets User" \
  --assignee <object-id-of-app-or-user> \
  --scope /subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>

Habilitar el registro y las alertas de Key Vault

Debe habilitar el registro y las alertas en la instancia de Key Vault como método para detectar actividades potencialmente sospechosas.

Para habilitar las alertas y el registro de Azure Key Vault, use el comando az monitor diagnostic-settings create de la CLI de Azure:

az monitor diagnostic-settings create \
    --name myDiagnosticSettings \
    --resource {key-vault-resource-id} \
    --logs '[{"category": "AuditEvent","enabled": true}]' \
    --workspace {log-analytics-workspace-id}

Este comando crea una configuración de diagnóstico denominada myDiagnosticSettings, la configura para la instancia de Azure Key Vault especificada, habilita la categoría de registro de AuditEvent, que realiza un seguimiento de los eventos relacionados con la seguridad y el acceso, y envía los registros al área de trabajo de Log Analytics especificada para la supervisión, el análisis y las alertas. Esto le permite supervisar los patrones de acceso, detectar intentos de acceso no autorizados y configurar alertas para eventos de seguridad críticos (por ejemplo, alguien intenta acceder a un secreto sin los permisos adecuados).

Puede ejecutar el comando az monitor scheduled-query create de la CLI de Azure para supervisar los registros en el área de trabajo de Log Analytics especificada para los intentos de acceso no autorizados a los secretos de Azure Key Vault y desencadenar una alerta si se detecta algún intento de acceso no autorizado que coincida:

az monitor scheduled-query create \
    --name "Suspicious Access Alert" \
    --resource-group myResourceGroup \
    --scopes {log-analytics-workspace-resource-id} \
    --condition "AzureDiagnostics | where ResourceType == 'VAULTS' | where OperationName == 'SecretGet' | where ResultSignature == 'Unauthorized'"

Restringir el acceso de red a Key Vault

Debe restringir el acceso de red a Azure Key Vault para que el almacén solo acepte solicitudes de ubicaciones de red conocidas. Puede usar dos métodos generales para hacerlo:

  • Azure Private Link. Esto crea un punto de conexión privado dentro de la red virtual, lo que permite a la aplicación conectarse a Azure Key Vault sin atravesar la red pública de Internet. Esta opción es la más segura, ya que el tráfico permanece dentro de la red, pero requiere la creación de un punto de conexión privado y la configuración de DNS.
  • Reglas de firewall. Puede configurar las opciones del firewall de Azure Key Vault, que se encuentran en Redes, con una lista de intervalos IP permitidos. También puede usar este método para permitir el acceso a las redes virtuales existentes, pero esto requiere que habilite un punto de conexión de servicio para Microsoft.KeyVault en la subred seleccionada.

Puede crear un punto de conexión privado mediante el comando az network private-endpoint create de la CLI de Azure:

az network private-endpoint create \
    --name myPrivateEndpoint \
    --resource-group myResourceGroup \
    --vnet-name myVNet \
    --subnet mySubnet \
    --private-connection-resource-id /subscriptions/{subscription}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{key-vault-name} \
    --group-id vault \
    --connection-name myConnection

You can create firewall rules on the Azure Key Vault instance using the Azure CLI [az keyvault network-rule add](/cli/azure/keyvault/network-rule#az-keyvault-network-rule-add) command, substituting the appropriate key vault names, resource groups, subnet, and subnet mask information:

```azurecli
az keyvault network-rule add \
    --name {key-vault-name} \
    --resource-group myResourceGroup \
    --ip-address {trusted-ip-address}/32

Azure Key Vault aplica HTTPS para todas las comunicaciones. Esto garantiza que las claves de API y otros datos confidenciales se cifren en tránsito, protegiéndolos frente a ataques de interceptación y de intermediarios.

Interacción con Azure Key Vault mediante Python

Para interactuar con Azure Key Vault mediante Python, instale la biblioteca de identidades de Azure para Microsoft Entra ID y la biblioteca de secretos de Azure Key Vault:

pip install azure-identity
pip install azure-keyvault-secrets

Puede usar la biblioteca cliente de secretos de Identidad de Azure y Azure Key Vault para administrar secretos mediante programación:

from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential

key_vault_name = "<your-key-vault-name>"
KVUri = f"https://{key_vault_name}.vault.azure.net"
secret_name = "<your-secret-name>"

credential = DefaultAzureCredential()
client = SecretClient(vault_url=KVUri, credential=credential)

retrieved_secret = client.get_secret(secret_name)

# Now you can use the API key:

api_key = retrieved_secret.value
print(f"The API key is: {api_key}")

En este código de ejemplo:

  • DefaultAzureCredential: esta clase intenta autenticarse mediante varios métodos (variables de entorno, identidades administradas, etc.), lo que lo convierte en adecuado para distintos entornos de Azure.
  • SecretClient: esta clase proporciona métodos para interactuar con secretos en Key Vault.
  • get_secret(): recupera el secreto de Key Vault.

Pasos siguientes