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 con Azure Container Apps.
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 de valores de secretos 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 <CONNECTION_STRING> por 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.
Hacer referencia a un secreto 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 del 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 contenedora y conceder a la identidad acceso a los secretos de Key Vault.
Para conceder acceso a los secretos de Key Vault, cree una directiva de acceso en Key Vault para la identidad administrada que ha creado. 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 system por el identificador de recurso de la identidad.
Reemplace <KEY-VAULT-SECRET-URI> por el identificador 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 a 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/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/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 identificador URI del secreto en Key Vault. Reemplace <USER_ASSIGNED_IDENTITY_ID> por 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 que se crea la aplicación de contenedor.
En PowerShell, no se admiten referencias a secretos de Key Vault.
Nota:
Si usa UDR Con Azure Firewall, deberá agregar la etiqueta de servicio AzureKeyVault y el FQDN 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.
Identificador URI de un secreto de Key Vault y rotación de secretos
El identificador URI del secreto de Key Vault debe tener uno de los siguientes formatos:
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931: referencia a una versión específica de un secreto.
https://myvault.vault.azure.net/secrets/mysecret: referencia a la versión más reciente de un secreto.
Si no se especifica una versión en el identificador URI, la aplicación usa la versión más reciente que exista en el almacén de claves. Cuando estén disponibles versiones más recientes, la aplicación recupera automáticamente la versión más reciente en un plazo de 30 minutos. Las revisiones activas que hagan referencia al secreto en una variable de entorno se reinician automáticamente para recoger el nuevo valor.
Para controlar completamente qué versión de un secreto se utiliza, especifique la versión en el identificador 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.
Después de definir un secreto en la aplicación de contenedor, puede hacer referencia a él en una variable de entorno al crear una nueva revisión.
Vaya a la aplicación de contenedor en Azure Portal.
Abra la página Administración de revisiones.
Seleccione Crear nueva revisión.
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, tal como se describe en la sección Definición de secretos, puede hacer referencia a ellos en los montajes de volumen al crear una nueva revisión en la aplicación de contenedor. 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.
Después de definir un secreto en la aplicación de contenedor, puede hacer referencia a él en un montaje de volumen al crear una nueva revisión.
Vaya a la aplicación de contenedor en Azure Portal.
Abra la página Administración de revisiones.
Seleccione Crear nueva revisión.
En la página Crear e implementar una nueva revisión.
Seleccione un contenedor y seleccione Editar.
En la sección Montajes de volumen, expanda la sección Secretos.
Seleccione Crear nuevo volumen.
Escriba la siguiente información:
Nombre: mysecrets
Montar 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 de 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 de volumen.
En este ejemplo, se declaran dos secretos en el nivel de aplicación. Estos secretos se montan en un volumen llamado 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 del montaje de volumen.
Para cargar secretos específicos y especificar sus rutas de acceso dentro del volumen montado, defina los secretos en la matriz secrets del objeto de volumen. En el ejemplo siguiente, se muestra cómo cargar solo el secreto queue-connection-string en el montaje de volumen mysecrets con el nombre de archivo connection-string.txt.
En la aplicación, puede leer el secreto desde 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 llamado mysecrets de tipo Secret. El volumen se monta en la ruta de acceso /mnt/secrets. A continuación, la aplicación puede leer los secretos como archivos del montaje de volumen.