Administración de secretos en Azure Container Apps
Artículo
Azure Container Apps permite que la aplicación almacene de forma segura valores de configuración confidenciales. Una vez definidos los secretos en el nivel de aplicación, los valores protegidos están disponibles para las revisiones de las aplicaciones contenedoras. Además, puede hacer referencia a valores protegidos dentro de las reglas de escalado. Para obtener información sobre el uso de secretos con Dapr, consulte Integración de Dapr.
Los secretos están limitados a una aplicación, fuera de cualquier revisión específica de una aplicación.
Agregar, quitar o cambiar secretos no genera nuevas revisiones.
Cada revisión de aplicación puede hacer referencia a uno o varios secretos.
Varias revisiones pueden hacer referencia a los mismos secretos.
Un secreto actualizado o eliminado no afecta automáticamente a las revisiones existentes en la aplicación. Cuando se actualiza o elimina un secreto, puede responder a los cambios de una de estas dos maneras:
Implementación de una nueva revisión.
Reinicio de una revisión existente.
Antes de eliminar un secreto, implemente una nueva revisión que ya no haga referencia al secreto anterior. A continuación, desactive todas las revisiones que hacen referencia al secreto.
Definición de secretos
Los secretos se definen como un conjunto de pares nombre-valor. El valor de cada secreto se especifica directamente o como referencia a un secreto almacenado en Azure Key Vault.
Almacenamiento del valor secreto en Container Apps
Al definir secretos a través del portal o a través de diferentes opciones de línea de comandos.
En este caso, se declara una cadena de conexión en una cuenta de Queue Storage en la matriz secrets. Este ejemplo, reemplazaría <MY-CONNECTION-STRING-VALUE> por el valor de la cadena de conexión.
Cuanto cree una aplicación de contenedor, los secretos se definen mediante el parámetro --secrets.
El parámetro acepta un conjunto delimitado por espacios de pares nombre-valor.
En este caso, se declara una cadena de conexión en una cuenta de Queue Storage en el parámetro --secrets. Reemplace por <CONNECTION_STRING> el valor de la cadena de conexión.
Al crear una aplicación de contenedor, los secretos se definen como uno o varios objetos secretos que se pasan a través del parámetro ConfigurationSecrets.
En este caso, se declara una cadena de conexión en una cuenta de Queue Storage. El valor de queue-connection-string procede de una variable de entorno denominada $QueueConnectionString.
Secreto de referencia de Key Vault
Al definir un secreto, se crea una referencia a un secreto almacenado en Azure Key Vault. Container Apps recupera automáticamente el valor secreto de Key Vault y lo pone a disposición como secreto en la aplicación contenedora.
Para hacer referencia a un secreto desde Key Vault, primero debe habilitar la identidad administrada en la aplicación de contenedor y conceder a la identidad acceso a los secretos de Key Vault.
Para habilitar la identidad administrada en la aplicación de contenedor, consulte Identidades administradas.
Para conceder acceso a secretos de Key Vault, cree una directiva de acceso en Key Vault para la identidad administrada que creó. Habilite el permiso secreto "Get" en esta directiva.
En este caso, se declara una cadena de conexión en una cuenta de Queue Storage en la matriz secrets. Su valor se recupera automáticamente de Key Vault mediante la identidad especificada. Para usar una identidad administrada por el usuario, reemplace por system el identificador de recurso de la identidad.
Reemplace <KEY-VAULT-SECRET-URI> por el URI del secreto en Key Vault.
Cuanto cree una aplicación de contenedor, los secretos se definen mediante el parámetro --secrets.
El parámetro acepta un conjunto delimitado por espacios de pares nombre-valor.
Cada par está delimitado por el signo igual (=).
Para especificar una referencia de Key Vault, use el formato <SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>. Por ejemplo, queue-connection-string=keyvaultref:https://mykeyvault.vault.azure.net/secrets/queuereader,identityref:/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity.
En este caso, se declara una cadena de conexión en una cuenta de Queue Storage en el parámetro --secrets. Reemplace <KEY_VAULT_SECRET_URI> por el URI del secreto en Key Vault. Reemplace por <USER_ASSIGNED_IDENTITY_ID> el identificador de recurso de la identidad asignada por el usuario. Para la identidad asignada por el sistema, use system en lugar del identificador de recurso.
Nota:
La identidad asignada por el usuario debe tener acceso para leer el secreto en Key Vault. La identidad asignada por el sistema no se puede usar con el comando create porque no está disponible hasta después de crear la aplicación contenedora.
Las referencias de Key Vault de secretos no se admiten en PowerShell.
Nota:
Si usa UDR con Azure Firewall, deberá agregar la AzureKeyVault etiqueta de servicio y el FQDN de login.microsoft.com a la lista de permitidos del firewall. Consulte configuración de UDR con Azure Firewall para decidir qué etiquetas de servicio adicionales necesita.
URI y rotación de secretos de Key Vault
El URI del secreto de Key Vault debe tener uno de los siguientes formatos:
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931: haga referencia a una versión específica de un secreto.
https://myvault.vault.azure.net/secrets/mysecret: haga referencia a la versión más reciente de un secreto.
Si no se especifica una versión en el URI, la aplicación usa la versión más reciente que existe en el almacén de claves. Cuando haya versiones más recientes disponibles, la aplicación recupera automáticamente la versión más reciente en un plazo de 30 minutos. Las revisiones activas que hacen referencia al secreto en una variable de entorno se reinician automáticamente para recoger el nuevo valor.
Para controlar por completo qué versión de un secreto se usa, especifique la versión en el URI.
Referencia de secretos en variables de entorno
Después de declarar secretos en el nivel de aplicación como se describe en la sección definición de secretos, puede hacer referencia a ellos en variables de entorno al crear una nueva revisión en la aplicación del contenedor. Cuando una variable de entorno hace referencia a un secreto, su valor se rellena con el valor definido en el secreto.
Ejemplo
En el ejemplo siguiente se muestra una aplicación que declara una cadena de conexión en el nivel de aplicación. Esta conexión se hace referencia en una variable de entorno de contenedor y en una regla de escalado.
En la página Crear e implementar una nueva revisión , seleccione un contenedor.
En la sección Variables de entorno, seleccione Agregar.
Escriba la siguiente información:
Nombre: nombre de la variable de entorno.
Origen: seleccione Hacer referencia a un secreto.
Valor: seleccione el secreto al que desea hacer referencia.
Seleccione Guardar.
Seleccione Crear para crear la nueva revisión.
En este ejemplo, la cadena de conexión de la aplicación se declara como queue-connection-string y está disponible en otra parte de las secciones de configuración.
Aquí, la variable de entorno denominada connection-string obtiene su valor del secreto de nivel de aplicación queue-connection-string. Además, la configuración de autenticación de la regla de escalado de Azure Queue Storage usa el queue-connection-string secreto para definir su conexión.
Para evitar confirmar valores secretos en el control de código fuente con la plantilla de ARM, pase los valores secretos como parámetros de plantilla de ARM.
En este ejemplo, creará una aplicación de contenedor con un secreto al que se hace referencia en una variable de entorno mediante la CLI de Azure. Para hacer referencia a un secreto en una variable de entorno de la CLI de Azure, establezca su valor en secretref:, seguido del nombre del secreto.
Aquí, la variable de entorno denominada connection-string obtiene su valor del secreto de nivel de aplicación queue-connection-string.
En este ejemplo, creará un contenedor con un secreto al que se hace referencia en una variable de entorno mediante Azure PowerShell. Para hacer referencia al secreto en una variable de entorno de PowerShell, establezca su valor en secretref:, seguido del nombre del secreto.
Aquí, la variable de entorno denominada ConnectionString obtiene su valor del secreto de nivel de aplicación $QueueConnectionString.
Montaje de secretos en un volumen
Después de declarar secretos en el nivel de aplicación como se describe en la sección de definición de secretos, puede hacer referencia a ellos en montajes de volúmenes al crear una nueva revisión en la aplicación contenedora. Al montar secretos en un volumen, cada secreto se monta como un archivo en el volumen. El nombre de archivo es el nombre del secreto y el contenido del archivo es el valor del secreto. Puede cargar todos los secretos en un montaje de volumen o puede cargar secretos específicos.
En la página Crear e implementar una nueva revisión .
Seleccione un contenedor y seleccione Editar.
En la sección Montajes de volúmenes, expanda la sección Secretos.
Seleccione Crear nuevo volumen.
Escriba la siguiente información:
Nombre: mysecrets
Montaje de todos los secretos: habilitado
Nota:
Si desea cargar secretos específicos, deshabilite Montar todos los secretos y seleccione los secretos que desea cargar.
Seleccione Agregar.
En Nombre del volumen, seleccione mysecrets.
En Ruta de acceso de montaje, escriba /mnt/secrets.
Seleccione Guardar.
Seleccione Crear para crear la nueva revisión con el montaje del volumen.
En este ejemplo, se declaran dos secretos en el nivel de aplicación. Estos secretos se montan en un volumen denominado mysecrets de tipo Secret. El volumen se monta en la ruta de acceso /mnt/secrets. A continuación, la aplicación puede hacer referencia a los secretos en el montaje del volumen.
Para cargar secretos específicos y especificar sus rutas de acceso dentro del volumen montado, defina los secretos en la secrets matriz del objeto de volumen. En el ejemplo siguiente se muestra cómo cargar solo el queue-connection-string secreto en el montaje del mysecrets volumen con un nombre de archivo de connection-string.txt.
En la aplicación, puede leer el secreto de un archivo ubicado en /mnt/secrets/connection-string.txt.
En este ejemplo, se declaran dos secretos en el nivel de aplicación. Estos secretos se montan en un volumen denominado mysecrets de tipo Secret. El volumen se monta en la ruta de acceso /mnt/secrets. Después, la aplicación puede leer los secretos como archivos en el montaje del volumen.