Configuración del almacenamiento de claves de host de Functions en Azure Container Apps

Las claves de acceso de Functions son tokens de autenticación que el runtime de Functions usa para proteger los puntos de conexión desencadenados por HTTP. Cuando un autor de llamada invoca una función HTTP, incluye una clave como parámetro ?code= de consulta o un x-functions-key encabezado. El tiempo de ejecución valida la clave y autoriza o rechaza la solicitud.

Las claves de acceso no son las mismas que los secretos de nivel de aplicación. Las claves de acceso protegen quién puede llamar a tus funciones, mientras que los secretos a nivel de aplicación protegen a qué se conectan tus funciones.

Cuándo usar las claves de acceso

Escenario ¿Por qué son adecuadas las claves de acceso?
Webhooks de terceros Los proveedores como GitHub, Stripe o Twilio llaman a su función mediante una URL y un secreto. Las teclas de acceso se insertan directamente en el patrón ?code= que esperan.
Llamadas de servicio a servicio El servicio back-end A llama a la función B a través de HTTP. Una clave compartida es más sencilla que configurar los registros de aplicaciones de Microsoft Entra para llamadas exclusivamente internas.
Suscripciones de Event Grid Event Grid valida y llama al punto de conexión de la función mediante una clave del sistema que la plataforma administra automáticamente.
Autenticación de desarrollo y pruebas Durante el desarrollo, necesita autenticación básica sin configurar OAuth/OIDC completa. Las claves de acceso proporcionan una puerta de autenticación de baja fricción sin configuración de identidad.
Compatibilidad de la migración Las aplicaciones de Azure Functions existentes ya usan claves de acceso. Al migrar a Container Apps, necesita la misma autenticación basada en claves para evitar interrupciones de llamadas.

Note

Para las API orientadas al usuario, cargas de trabajo de confianza cero o escenarios de autorización por usuario, use Microsoft Entra ID / OAuth 2.0 en lugar de claves de acceso. Las claves de acceso son secretos compartidos sin un registro de seguimiento de auditoría a nivel de identidad.

Prerequisites

Tipos de clave de acceso

El entorno de ejecución de Functions administra cuatro tipos de claves:

Tipo de clave Ámbito propósito
Clave maestra (_master) La app de funciones completa Acceso de nivel de administrador a todas las funciones y puntos de conexión de administración /admin/*. No se puede revocar, solo se puede girar.
Claves de host (default + personalizadas) La app de funciones completa Autorizar llamadas a cualquier función desencadenada por HTTP en la aplicación.
Claves de función (default + personalizadas) Función única Autorizar llamadas a una función específica. Proporciona un control más granular que las claves de host.
Claves del sistema Puntos de conexión de extensión Se usa en extensiones de plataforma como suscripciones de webhook de Event Grid y Durable Functions. Administrado automáticamente.

Patrones de nombres secretos

La convención de nomenclatura de las claves almacenadas depende del back-end de almacenamiento.

Almacén de claves (Key Vault)

El backend de Key Vault almacena cada clave como un secreto individual de Key Vault mediante una convención de doble guión (--):

Tipo de clave Patrón de nombre secreto Example
Clave maestra host--masterKey--master host--masterKey--master
Clave de función (valor predeterminado) host--functionKey--default host--functionKey--default
Clave de función (personalizada) host--functionKey--<name> host--functionKey--MyApiClient
Clave del sistema host--systemKey--<extension> host--systemKey--eventgrid_extension
Clave por función function--<functionName>--<keyName> function--myhttpfunc--default

Almacenamiento de Blobs

El backend de Blob Storage almacena claves como archivos JSON en el contenedor de blobs azure-webjobs-secrets. Todas las claves de nivel de host (maestras, claves de función y claves del sistema) se almacenan juntas en un único host.json blob. Las claves por función se almacenan en blobs independientes nombrados según cada función.

Ruta de acceso del blob Contenido
<siteSlotName>/host.json Archivo JSON que contiene masterKey, functionKeysy systemKeys
<siteSlotName>/<functionName>.json Archivo JSON que contiene claves para una función específica

Almacén de secretos de Container Apps

El almacén de secretos de Container Apps usa una convención diferente. El host de Functions lee las claves de los archivos montados en volumen en /run/secrets/functions-keys/. Cada archivo usa un nombre con puntos (por ejemplo, host.master), pero los nombres secretos de Container Apps solo permiten caracteres alfanuméricos en minúsculas y guiones. Al montar un volumen secreto, debe establecer explícitamente el campo path con el nombre de archivo con puntos que espera el host de Functions (por ejemplo, secretRef: host-masterpath: host.master). La plataforma no realiza ninguna traducción automática de nombres.

Tipo de clave Nombre del secreto de Container Apps (guiones) Montaje de volúmenes path (puntos)
Clave maestra host-master host.master
Clave de host predeterminada host-function-default host.function.default
Clave de host personalizada host-function-<name> host.function.<name>
Clave de función predeterminada para una función específica functions-<functionname>-default functions.<functionName>.default
Clave de función personalizada para una función específica functions-<functionname>-<keyname> functions.<functionName>.<keyName>
Clave del sistema host-systemkey-<extension> host.systemKey.<extension>

Tip

Al solucionar problemas, busque estos patrones en el almacén de back-end para comprobar que las claves están configuradas correctamente.

Elección de un back-end de almacenamiento

Establezca la AzureWebJobsSecretStorageType variable de entorno para controlar dónde conserva el tiempo de ejecución las claves de acceso. Azure Container Apps admite tres back-end de nivel de producción.

Importante

En el caso de las cargas de trabajo de producción, se debe preferir los backends en este orden: almacén de secretos de Container Apps (containerapp) > Azure Key Vault (keyvault) > Azure Blob Storage (blob). El almacén de secretos de Container Apps no tiene dependencias externas y es el más sencillo de operar.

parte del servidor Valor de configuración Generación automática de claves Dependencia externa Más adecuado para
Almacén de secretos de Container Apps containerapp No, aprovisionas claves como secretos de las Container Apps. Ninguno Mayoría de las cargas de trabajo (recomendadas)
Azure Key Vault keyvault No: creación manual de desencadenadores instancia de Key Vault Gobernanza centralizada, auditoría de cumplimiento
Azure Blob Storage blob Cuenta de almacenamiento Aplicaciones heredadas o una cuenta existente AzureWebJobsStorage

Advertencia

No establezca en AzureWebJobsSecretStorageTypefiles. En Azure Container Apps, el sistema de archivos se efímero, por lo que las claves de host almacenadas con el back-end files se pierden cada vez que la aplicación se escala a cero, se reinicia o implementa una nueva revisión. Use siempre uno de los tres back-end de producción enumerados anteriormente.

Configuración del almacén de secretos de Container Apps

El almacén de secretos de Container Apps es el back-end recomendado. Las claves permanecen dentro de la plataforma Container Apps y no requieren almacenamiento externo ni Key Vault. Azure Resource Manager registra los cambios en secretos y variables de entorno en los registros de actividad.

Con este back-end, el host de Functions lee las claves de los archivos montados en volumen en /run/secrets/functions-keys/. El host no genera automáticamente claves. Debe crear cada clave como secreto de Container Apps y la plataforma los monta como archivos para que el host los lea.

Importante

El almacén de secretos de Container Apps es de solo lectura desde la perspectiva del host. El host lee los archivos de clave montados, pero nunca escribe en ellos. Si falta una clave necesaria, el host no lo genera automáticamente.

Paso 1: Establecimiento del tipo de almacenamiento

  1. Vaya a la aplicación contenedora de Functions en el portal Azure.

  2. En Configuración, seleccione Variables de entorno.

  3. Seleccione Agregar y escriba los valores siguientes:

    Propiedad Value
    Nombre AzureWebJobsSecretStorageType
    Valor containerapp
  4. Seleccione Guardar y, a continuación, seleccione Aplicar para confirmar los cambios.

Paso 2: Generación y almacenamiento de secretos de clave de acceso

Genere valores clave y almacénelos como secretos de Container Apps. Como mínimo, necesita la clave maestra y una clave de host predeterminada.

  1. En la aplicación contenedora de Functions, en Configuración, seleccione Secretos.

  2. Seleccione Agregar y escriba los valores siguientes:

    Propiedad Value
    Nombre host-master
    Type Secretos de Container Apps
    Valor Valor de clave generado aleatoriamente.
  3. Selecciona Agregar.

  4. Repita para host-function-default con otro valor generado aleatoriamente.

  5. Para agregar una clave por función, agregue un secreto denominado functions-<functionname>-default (todo en minúsculas).

Note

Los nombres secretos de Container Apps solo permiten caracteres alfanuméricos en minúsculas y guiones. Debe establecer explícitamente el path campo en la configuración del volumen en el nombre de archivo puntuado que el host de Functions espera (por ejemplo, secretRef: host-masterpath: host.master). Sin un explícito path, el archivo del disco conserva el nombre discontinuo y el host de Functions no encontrará la clave.

Paso 3: Configuración de montaje de volumen

Monte los secretos como archivos en /run/secrets/functions-keys/.

  1. En la aplicación contenedora de Functions, en Aplicación, seleccione Revisiones y réplicas.

  2. Seleccione Crear nueva revisión.

  3. En la pestaña Escala y volúmenes , en Volúmenes, seleccione Agregar.

  4. Escriba los siguientes valores:

    Propiedad Value
    Tipo de volumen Secreto
    Nombre functions-keys
  5. Para cada secreto, establezca el campo Ruta de acceso en el nombre de archivo con puntos que espera el host de Functions (por ejemplo, establezca host-master en la ruta de acceso host.master, y host-function-default en la ruta de acceso host.function.default).

  6. Selecciona Agregar.

  7. En la pestaña Contenedor , seleccione el contenedor y, a continuación, seleccione Editar.

  8. Seleccione la pestaña Montajes de volumen y seleccione Agregar.

  9. Escriba los siguientes valores:

    Propiedad Value
    Nombre del volumen functions-keys
    Punto de montaje /run/secrets/functions-keys
  10. Seleccione Guardar y, a continuación, seleccione Crear para implementar la nueva revisión.

Paso 4: Comprobar

Una vez reiniciada la aplicación, confirme que las claves funcionan:

az containerapp function keys list \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-type hostKey

También puede comprobar los registros de la aplicación para el mensaje Resolved secret storage provider ContainerAppsSecretsRepository, que confirma que el host utiliza el almacenamiento de secretos de Container Apps.

Rotación de claves

Para rotar una clave, actualice el secreto de Container Apps y reinicie la aplicación:

NEW_KEY=$(openssl rand -hex 32)

az containerapp secret set \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --secrets "host-function-default=$NEW_KEY"

az containerapp revision restart \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --revision "<REVISION_NAME>"

Note

Todas las réplicas comparten los mismos secretos asociados. Después de un reinicio, cada réplica recoge los valores de clave actualizados.

Configuración de Blob Storage

El back-end de Blob Storage permite que el entorno de ejecución genere y administre automáticamente las claves de acceso. Use esta opción cuando ya tenga una cuenta de almacenamiento para AzureWebJobsStorage y no necesite gobernanza centralizada.

  1. Habilite la identidad administrada en la aplicación contenedora (si aún no está habilitada):

    az containerapp identity assign \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --system-assigned
    
  2. Conceda el rol Colaborador de datos de Storage Blob en la cuenta de almacenamiento a la identidad administrada:

    PRINCIPAL_ID=$(az containerapp show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --query identity.principalId \
      --output tsv)
    
    STORAGE_ID=$(az storage account show \
      --name "<STORAGE_ACCOUNT_NAME>" \
      --resource-group "<RESOURCE_GROUP>" \
      --query id \
      --output tsv)
    
    az role assignment create \
      --role "Storage Blob Data Contributor" \
      --assignee "$PRINCIPAL_ID" \
      --scope "$STORAGE_ID"
    
  3. Establezca el tipo de almacenamiento:

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars "AzureWebJobsSecretStorageType=blob"
    
  4. El entorno de ejecución genera automáticamente claves en el siguiente inicio en frío. Compruebe lo siguiente:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type hostKey
    

Configuración de Key Vault

El back-end de Key Vault almacena las claves de acceso como secretos de Key Vault, lo que proporciona auditoría de nivel empresarial y control de acceso.

  1. Cree una Key Vault (si no tiene una):

    az keyvault create \
      --name "<KEYVAULT_NAME>" \
      --resource-group "<RESOURCE_GROUP>" \
      --location "<LOCATION>"
    
  2. Habilite la identidad administrada en la aplicación contenedora (si aún no está habilitada):

    az containerapp identity assign \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --system-assigned
    
  3. Otorgue el rol Key Vault Secrets Officer a la identidad administrada. El tiempo de ejecución necesita acceso de lectura y escritura para crear y administrar claves:

    PRINCIPAL_ID=$(az containerapp show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --query identity.principalId \
      --output tsv)
    
    KEYVAULT_ID=$(az keyvault show \
      --name "<KEYVAULT_NAME>" \
      --query id \
      --output tsv)
    
    az role assignment create \
      --role "Key Vault Secrets Officer" \
      --assignee "$PRINCIPAL_ID" \
      --scope "$KEYVAULT_ID"
    
  4. Establezca el tipo de almacenamiento y Key Vault URI:

    Para la identidad asignada por el sistema:

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars \
        "AzureWebJobsSecretStorageType=keyvault" \
        "AzureWebJobsSecretStorageKeyVaultUri=https://<KEYVAULT_NAME>.vault.azure.net"
    

    Para la identidad asignada por el usuario, establezca también el identificador de cliente:

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars \
        "AzureWebJobsSecretStorageType=keyvault" \
        "AzureWebJobsSecretStorageKeyVaultUri=https://<KEYVAULT_NAME>.vault.azure.net" \
        "AzureWebJobsSecretStorageKeyVaultClientId=<USER_ASSIGNED_IDENTITY_CLIENT_ID>"
    
  5. Desencadene la creación de claves mediante la enumeración de claves:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type hostKey
    

Administración de las claves de acceso

Independientemente del back-end, use los siguientes comandos para enumerar, crear y eliminar claves de acceso:

# List all host keys
az containerapp function keys list \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-type hostKey

# List the master key
az containerapp function keys list \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-type masterKey

# Create or overwrite a custom host key
az containerapp function keys set \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-name "MyCustomKey" \
  --key-value "<YOUR_KEY_VALUE>" \
  --key-type hostKey

# Show a specific key
az containerapp function keys show \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-name "<KEY_NAME>" \
  --key-type hostKey

# Delete a host key
az containerapp function keys delete \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-name "MyCustomKey" \
  --key-type hostKey

Llame a una función con una clave de acceso

Pase la clave como un parámetro de consulta o un encabezado de solicitud.

# Query parameter
curl "https://<FUNCTIONS_APP_URL>/api/<FUNCTION_NAME>?code=<HOST_KEY>"

# Header
curl "https://<FUNCTIONS_APP_URL>/api/<FUNCTION_NAME>" \
  -H "x-functions-key: <HOST_KEY>"