O Azure Container Apps permite que a sua aplicação armazene de forma segura valores de configuração sensíveis. Depois que os segredos são definidos no nível do aplicativo, os valores protegidos ficam disponíveis para revisões em seus aplicativos de contêiner. Além disso, você pode fazer referência a valores protegidos dentro de regras de escala. Para obter informações sobre como usar segredos com o Dapr, consulte Integração Dapr.
- Os segredos são definidos para uma aplicação, não estando associados a nenhuma revisão específica dessa aplicação.
- Novas revisões não são geradas por meio da adição, remoção ou alteração de segredos.
- Cada revisão da aplicação pode fazer referência a um ou mais segredos.
- Várias revisões podem fazer referência aos mesmos segredos.
Um segredo atualizado ou excluído não afeta automaticamente as revisões existentes em seu aplicativo. Quando um segredo é atualizado ou eliminado, pode responder às alterações de uma de duas maneiras:
- Implementar uma revisão nova.
- Reiniciar uma revisão existente.
Antes de eliminar um segredo, implemente uma nova revisão que já não faça referência ao segredo antigo. Em seguida, desative todas as revisões que fazem referência ao segredo.
Definição de segredos
Os segredos são definidos como um conjunto de pares nome/valor. O valor de cada segredo é especificado diretamente ou como referência a um segredo armazenado no Azure Key Vault.
Armazenar valor secreto em aplicativos de contêiner
O seguinte é usado quando defines segredos através do portal, ou através de diferentes opções de linha de comandos.
Vai à tua aplicação container no portal Azure.
Na secção de Segurança , selecione Segredos.
Selecione Adicionar.
No painel de contexto Adicionar segredo, insira as seguintes informações:
-
Nome: O nome do segredo.
-
Tipo: Selecione Container Apps Secret.
-
Valor: O valor do segredo.
Selecione Adicionar.
Os segredos são definidos no nível do aplicativo na resources.properties.configuration.secrets seção.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"value": "<MY-CONNECTION-STRING-VALUE>"
}],
}
}
}
Aqui, uma "cadeia de ligação" para uma conta de armazenamento em fila é declarada na array secrets. Neste exemplo, substituirias <MY-CONNECTION-STRING-VALUE> pelo valor do teu cadeia de ligação.
Quando você cria um aplicativo de contêiner, os segredos são definidos usando o --secrets parâmetro.
- O parâmetro aceita um conjunto delimitado por espaço de pares nome/valor.
- Um sinal de igual (
=) delimita cada par.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--secrets "queue-connection-string=<CONNECTION_STRING>"
Aqui, uma cadeia de ligação para uma conta de armazenamento em fila é declarada no parâmetro --secrets. Substitua <CONNECTION_STRING> pelo valor do seu cadeia de ligação.
Quando você cria um aplicativo contêiner, os segredos são definidos como um ou mais objetos Secret que são passados pelo ConfigurationSecrets parâmetro.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$TemplateObj = New-AzContainerAppTemplateObject -Name queuereader -Image demos/queuereader:v1
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$ContainerAppArgs = @{
Name = 'my-resource-group'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
Aqui, é declarada uma cadeia de conexão para uma conta de armazenamento de filas. O valor for queue-connection-string vem de uma variável de ambiente chamada $QueueConnectionString.
Segredo de referência do Key Vault
Quando defines um segredo, crias uma referência para um segredo armazenado no Azure Key Vault. O Container Apps recupera automaticamente o valor secreto do Key Vault e torna-o disponível como segredo na tua app container.
Para referenciar um segredo do Key Vault, deve primeiro ativar a identidade gerida na sua aplicação container e conceder à identidade acesso aos segredos do Key Vault.
Para habilitar a identidade gerenciada em seu aplicativo de contêiner, consulte Identidades gerenciadas.
Para conceder acesso aos segredos do Key Vault, conceda a função de Azure RBAC Key Vault Utilizador de Segredos à identidade gerida.
Vai à tua aplicação container no portal Azure.
Na secção de Segurança , selecione Identidade.
Na guia Sistema atribuído, defina o Status como Ativado.
Nota
Você também pode usar uma identidade gerenciada atribuída pelo usuário, que pode ser reutilizada em vários recursos e persiste independentemente do ciclo de vida do aplicativo. Para usá-lo, selecione a guia Usuário atribuído e escolha uma identidade existente.
Selecione Salvar para habilitar a identidade gerenciada atribuída ao sistema.
Aparece um pop-up a confirmar que quer ativar a identidade gerida atribuída ao sistema e registar a sua aplicação de contentores com o Microsoft Entra ID. Selecione Yes (Sim).
Na secção de Segurança , selecione Segredos.
Selecione Adicionar.
No painel de contexto Adicionar segredo, insira as seguintes informações:
-
Nome: O nome do segredo.
-
Tipo: Selecione referência de Key Vault.
-
Key Vault secret URL: O URI do teu segredo em Key Vault. Este URI tem a seguinte forma:
https://<YOUR_KEY_VAULT_NAME>.vault.azure.net/secrets/<YOUR_SECRET_NAME>/<32_DIGIT_HEX_ID>
-
Identidade: Selecione Sistema atribuído.
Selecione Adicionar.
Os segredos são definidos no nível do aplicativo na resources.properties.configuration.secrets seção.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "<KEY_VAULT_SECRET_URI>",
"identity": "system"
}],
}
}
}
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada no array secrets. O seu valor é automaticamente recuperado do Key Vault usando a identidade especificada. Para usar uma identidade gerenciada pelo usuário, substitua system pelo ID de recurso da identidade.
Substitui <KEY_VAULT_SECRET_URI> pelo URI do teu segredo em Key Vault.
Quando você cria um aplicativo de contêiner, os segredos são definidos usando o --secrets parâmetro.
- O parâmetro aceita um conjunto delimitado por espaço de pares nome/valor.
- Um sinal de igual (
=) delimita cada par.
- Para especificar uma referência Key Vault, use o formato
<SECRET_NAME>=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<MANAGED_IDENTITY_ID>. Por exemplo, 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.
az containerapp create \
--resource-group "my-resource-group" \
--name queuereader \
--environment "my-environment-name" \
--image demos/queuereader:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>"
Aqui, uma cadeia de ligação para uma conta de armazenamento de fila é declarada no parâmetro --secrets. Substitui <KEY_VAULT_SECRET_URI> pelo URI do teu segredo em Key Vault. Substitua <USER_ASSIGNED_IDENTITY_ID> pelo ID do recurso da identidade atribuída ao usuário.
Nota
A identidade atribuída pelo utilizador deve ter acesso para ler o segredo no Key Vault. A identidade atribuída ao sistema não pode ser usada com o comando create porque ela não está disponível até que o aplicativo de contêiner seja criado.
As referências ao Secrets Key Vault não são suportadas no PowerShell.
Nota
Se estiveres a usar UDR com Azure Firewall, terás de adicionar a etiqueta de serviço AzureKeyVault e o FQDN login.microsoft.com à lista de permissões do teu firewall. Consulte configurar UDR com Azure Firewall para decidir quais as etiquetas de serviço adicionais de que precisa.
Key Vault URI secreto e rotação secreta
O URI secreto do Key Vault deve estar num dos seguintes formatos:
-
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931: Faça referência a uma versão específica de um segredo.
-
https://myvault.vault.azure.net/secrets/mysecret: Consulte a versão mais recente de um segredo.
Se uma versão não for especificada no URI, o aplicativo usará a versão mais recente existente no cofre de chaves. Quando as versões mais recentes ficam disponíveis, o aplicativo recupera automaticamente a versão mais recente em 30 minutos. Todas as revisões ativas que fazem referência ao segredo em uma variável de ambiente são reiniciadas automaticamente para pegar o novo valor.
Para obter controle total de qual versão de um segredo é usada, especifique a versão no URI.
Referenciando segredos em variáveis de ambiente
Depois de declarar segredos no nível do aplicativo, conforme descrito na seção definindo segredos, você pode fazer referência a eles em variáveis de ambiente ao criar uma nova revisão em seu aplicativo contêiner. Quando uma variável de ambiente faz referência a um segredo, seu valor é preenchido com o valor definido no segredo.
Exemplo
O exemplo seguinte mostra uma aplicação que declara uma cadeia de ligação ao nível da aplicação. Essa conexão é referenciada em uma variável de ambiente de contêiner e em uma regra de escala.
Depois de definir um segredo em seu aplicativo de contêiner, você pode fazer referência a ele em uma variável de ambiente ao criar uma nova revisão.
Vai à tua aplicação container no portal Azure.
Na seção Aplicativo, selecione Revisões e réplicas.
Na página Revisões e réplicas, selecione Criar nova revisão.
Na página Criar e implementar nova revisão, no separador Contentor, na secção de Imagem do contentor, selecione um contentor.
Selecione Editar.
No painel de contexto Editar um contêiner, selecione a guia Variáveis de ambiente.
Selecione Adicionar.
Introduza as informações seguintes:
-
Name: O nome da variável de ambiente.
-
Fonte: Selecione Referenciar um segredo.
-
Valor: Selecione o segredo definido anteriormente.
Selecione Guardar.
Na página Criar e implantar nova revisão, selecione Criar para criar a nova revisão.
Neste exemplo, a cadeia de conexão da aplicação é declarada como queue-connection-string e torna-se disponível noutras secções de configuração.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": { ⬅️
"type": "String" ⬅️
} ⬅️
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-03-01",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [ ⬅️
{ ⬅️
"name": "queue-connection-string", ⬅️
"keyVaultUrl": "[parameters('key_vault_secret_uri')", ⬅️
"identity": "system" ⬅️
}] ⬅️
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"env": [
{
"name": "QueueName",
"value": "myqueue"
},
{
"name": "ConnectionString", ⬅️
"secretRef": "queue-connection-string" ⬅️
}
]
}
],
"scale": {
"minReplicas": 0,
"maxReplicas": 10,
"rules": [
{
"name": "myqueuerule",
"azureQueue": {
"queueName": "demoqueue",
"queueLength": 100,
"auth": [
{
"secretRef": "queue-connection-string", ⬅️
"triggerParameter": "connection" ⬅️
}
]
}
}
]
}
}
}
}]
}
Aqui, a variável de ambiente nomeada connection-string obtém seu valor do segredo de nível queue-connection-string de aplicativo. Além disso, a configuração de autenticação da regra de escala do Armazenamento de Filas do Azure utiliza o segredo queue-connection-string como definição da sua ligação.
Para evitar comprometer valores secretos no controlo de origem com o modelo ARM, passe valores secretos como parâmetros do modelo ARM.
Neste exemplo, crias uma aplicação container usando a CLI do Azure com um segredo referenciado numa variável de ambiente. Para referenciar um segredo numa variável de ambiente no CLI do Azure, defina o seu valor para secretref:, seguido do nome do segredo.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" \
--env-vars "QueueName=myqueue" "ConnectionString=secretref:queue-connection-string"
Aqui, a variável de ambiente nomeada connection-string obtém seu valor do segredo de nível queue-connection-string de aplicativo.
As referências ao Secrets Key Vault não são suportadas no PowerShell.
Neste exemplo, crias um contentor usando Azure PowerShell com um segredo que faz referência a uma variável de ambiente. Para fazer referência ao segredo em uma variável de ambiente no PowerShell, defina seu valor como secretref:, seguido pelo nome do segredo.
$EnvId = (Get-AzContainerAppManagedEnv -ResourceGroupName my-resource-group -EnvName my-environment-name).Id
$SecretObj = New-AzContainerAppSecretObject -Name queue-connection-string -Value $QueueConnectionString
$EnvVarObjQueue = New-AzContainerAppEnvironmentVarObject -Name QueueName -Value myqueue
$EnvVarObjConn = New-AzContainerAppEnvironmentVarObject -Name ConnectionString -SecretRef queue-connection-string -Value secretref
$TemplateObj = New-AzContainerAppTemplateObject -Name myQueueApp -Image demos/myQueueApp:v1 -Env $EnvVarObjQueue, $EnvVarObjConn
$ContainerAppArgs = @{
Name = 'myQueueApp'
Location = '<location>'
ResourceGroupName = 'my-resource-group'
ManagedEnvironmentId = $EnvId
TemplateContainer = $TemplateObj
ConfigurationSecret = $SecretObj
}
New-AzContainerApp @ContainerAppArgs
Aqui, a variável de ambiente nomeada ConnectionString obtém seu valor do segredo de nível $QueueConnectionString de aplicativo.
Montagem de segredos num volume
Depois de declarar segredos ao nível da aplicação, conforme descrito na seção definindo segredos, pode referenciar-lhes em montagens de volume ao criar uma nova revisão na sua aplicação de contêiner. Quando você monta segredos em um volume, cada segredo é montado como um arquivo no volume. O nome do arquivo é o nome do segredo e o conteúdo do arquivo é o valor do segredo. Você pode carregar todos os segredos em uma montagem de volume ou pode carregar segredos específicos.
Exemplo
Depois de definir um segredo em seu aplicativo de contêiner, você pode fazer referência a ele em uma montagem de volume ao criar uma nova revisão.
Vai à tua aplicação container no portal Azure.
Na seção Aplicativo, selecione Revisões e réplicas.
Na página Revisões e réplicas, selecione Criar nova revisão.
Na página Criar e implementar nova revisão, no separador Contentor, na secção de Imagem do contentor, selecione um contentor.
Selecione Editar.
No painel de contexto Editar um contêiner, selecione o separador Montagens de volume.
Selecione Criar novo volume.
No painel de contexto Adicionar volume, insira as seguintes informações:
-
Tipo de volume: Selecione
Secret.
-
Nome:
mysecrets
-
Monte todos os segredos: ativado
Nota
Se quiser carregar segredos específicos, desative Montar todos os segredos e selecione os segredos que deseja carregar.
Selecione Adicionar.
No painel de contexto Editar um contêiner, em Nome do volume, selecione mysecrets.
Em Montar caminho, digite /mnt/secrets.
Selecione Guardar.
Na página Criar e implantar nova revisão, selecione Criar para criar a nova revisão com a montagem do volume.
Neste exemplo, dois segredos são declarados no nível do aplicativo. Esses segredos são montados num volume chamado mysecrets do tipo Secret. O volume é montado no caminho /mnt/secrets. O aplicativo pode então fazer referência aos segredos na montagem do volume.
{
"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"environment_id": {
"type": "String"
},
"key_vault_secret_uri": {
"type": "Securestring"
},
"api-key": {
"type": "Securestring"
}
},
"variables": {},
"resources": [
{
"name": "queuereader",
"type": "Microsoft.App/containerApps",
"apiVersion": "2022-11-01-preview",
"kind": "containerapp",
"location": "[parameters('location')]",
"properties": {
"managedEnvironmentId": "[parameters('environment_id')]",
"configuration": {
"activeRevisionsMode": "single",
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret"
}
]
}
}
}]
}
Para carregar segredos específicos e especificar seus caminhos dentro do volume montado, defina os secrets segredos na matriz do objeto de volume. O exemplo a seguir mostra como carregar somente o segredo queue-connection-string na montagem de volume mysecrets com o nome de ficheiro connection-string.txt.
{
"properties": {
...
"configuration": {
...
"secrets": [
{
"name": "queue-connection-string",
"keyVaultUrl": "[parameters('key_vault_secret_uri')",
"identity": "system"
},
{
"name": "api-key",
"value": "[parameters('api-key')]"
}
]
},
"template": {
"containers": [
{
"image": "myregistry/myQueueApp:v1",
"name": "myQueueApp",
"volumeMounts": [
{
"name": "mysecrets",
"mountPath": "/mnt/secrets"
}
]
}
],
"volumes": [
{
"name": "mysecrets",
"storageType": "Secret",
"secrets": [
{
"secretRef": "queue-connection-string",
"path": "connection-string.txt"
}
]
}
]
}
...
}
...
}
Em seu aplicativo, você pode ler o segredo de um arquivo localizado em /mnt/secrets/connection-string.txt.
Neste exemplo, dois segredos são declarados no nível do aplicativo. Esses segredos são montados num volume chamado mysecrets do tipo Secret. O volume é montado no caminho /mnt/secrets. A aplicação pode então ler os segredos como ficheiros na montagem de volumes.
az containerapp create \
--resource-group "my-resource-group" \
--name myQueueApp \
--environment "my-environment-name" \
--image demos/myQueueApp:v1 \
--user-assigned "<USER_ASSIGNED_IDENTITY_ID>" \
--secrets "queue-connection-string=keyvaultref:<KEY_VAULT_SECRET_URI>,identityref:<USER_ASSIGNED_IDENTITY_ID>" "api-key=$API_KEY" \
--secret-volume-mount "/mnt/secrets"
Para carregar segredos específicos e especificar seus caminhos dentro do volume montado, defina seu aplicativo usando YAML.
Não há suporte para a montagem de segredos como um volume no PowerShell.
Resolução de problemas das referências do Key Vault
Quando faz referência a segredos do Azure Key Vault, pode encontrar problemas durante a recuperação ou sincronização de segredos. Aqui estão os erros e resoluções comuns:
| Erro |
Motivo |
Resolução |
| Identidade gerida automaticamente não ativada |
A aplicação container não tem uma identidade gerida atribuída. |
Ative a identidade gerida atribuída pelo sistema ou pelo utilizador na sua aplicação de contentores. Consulte Identidades Geridas. |
| Identidade não encontrada |
A identidade gerida especificada não existe ou não está atribuída à aplicação do contentor. |
Verifique se a identidade foi criada e atribuída à aplicação contentor na secção Identidade . |
| O segredo desativado no Key Vault |
O segredo está desativado no recurso Key Vault. |
Vai ao teu Key Vault no portal do Azure e ativa o segredo. |
| Falha na autenticação |
A identidade gerida não tem as permissões necessárias para ler o segredo. |
Conceda à identidade gerida na sua Key Vault o papel de Utilizador de Segredos do Key Vault. Veja o Key Vault Secrets User. |
| Permissão do RBAC negada |
A identidade gerida tem permissões insuficientes para aceder ao Key Vault. |
Verifique a atribuição de funções RBAC no Key Vault e certifique-se de que inclui permissões de leitura para segredos. |
Próximos passos