Os Aplicativos de Contêiner do Azure permitem que seu aplicativo armazene com segurança valores de configuração confidenciais. Depois que os segredos são definidos no nível do aplicativo, os valores protegidos estão disponíveis para revisões em seus aplicativos de contêiner. Além disso, você pode referenciar valores protegidos dentro de regras de escala. Para obter informações de como usar segredos com o Dapr, confira Integração do Dapr
- Os segredos têm como escopo um aplicativo, fora de qualquer revisão específica de um aplicativo.
- Novas revisões não são geradas por meio da adição, remoção ou alteração de segredos.
- Cada revisão de aplicativo pode fazer referência a um ou mais segredos.
- Várias revisões podem referenciar os mesmos segredos.
Um segredo atualizado ou excluído não afeta automaticamente as revisões existentes no aplicativo. Quando um segredo é atualizado ou excluído, você pode responder a alterações de uma das seguintes maneiras:
- Implantar uma nova revisão.
- Reiniciar uma revisão existente.
Antes de excluir um segredo, implante uma nova revisão que não faça mais referência ao segredo antigo. Em seguida, desative todas as revisões que referenciam o segredo.
Definindo segredos
Os segredos são definidos como um conjunto de pares nome/valor. O valor de cada segredo é especificado diretamente ou como uma referência a um segredo armazenado no Azure Key Vault.
Armazenar o valor do segredo em Aplicativos de Contêiner
Ao definir segredos por meio do portal ou por meio de diferentes opções de linha de comando.
Acesse o aplicativo de contêiner no portal do Azure.
Na seção Configurações, selecione Segredos.
Selecione Adicionar.
No painel Adicionar contexto de segredo, insira as seguintes informações:
-
Nome: O nome do segredo.
-
Tipo: selecione Segredo de Aplicativos de Contêiner.
-
Valor: O valor do segredo.
Selecione Adicionar.
Os segredos são definidos no nível do aplicativo na seção resources.properties.configuration.secrets
.
"resources": [
{
...
"properties": {
"configuration": {
"secrets": [
{
"name": "queue-connection-string",
"value": "<MY-CONNECTION-STRING-VALUE>"
}],
}
}
}
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada na matriz secrets
. Neste exemplo, você substituiria <MY-CONNECTION-STRING-VALUE>
pelo valor da cadeia de conexão.
Quando você cria um aplicativo de contêiner, os segredos são definidos usando o parâmetro --secrets
.
- Ele aceita um conjunto delimitado por espaço de pares de 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 conexão para uma conta de armazenamento de fila é declarada no parâmetro --secrets
. Substitua <CONNECTION_STRING>
pelo valor da cadeia de conexão.
Quando você cria um aplicativo de contêiner, os segredos são definidos como um ou mais objetos de segredo que são passados pelo parâmetro ConfigurationSecrets
.
$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, uma cadeia de conexão para uma conta de armazenamento de fila é declarada. O valor de queue-connection-string
é proveniente de uma variável de ambiente chamada $QueueConnectionString
.
Segredo de referência do Key Vault
Ao definir um segredo, crie uma referência a um segredo armazenado no Azure Key Vault. Os Aplicativos de Contêiner recuperam automaticamente o valor secreto do Key Vault e o disponibiliza como um segredo no aplicativo de contêiner.
Para fazer referência a um segredo do Key Vault, primeiro habilite a identidade gerenciada no aplicativo de contêiner e conceda à identidade acesso aos segredos do Key Vault.
Para habilitar a identidade gerenciada em seu aplicativo de contêiner, consulte Identidades gerenciadas.
Para conceder acesso a Key Vault segredos, crie uma política de acesso no Key Vault para a identidade gerenciada que você criou. Ative a permissão secreta "Obter" nesta política.
Acesse o aplicativo de contêiner no portal do Azure.
Na seção Configurações, selecione Identidade.
Na guia Sistema atribuído, alterne o Status para Ativado.
Selecione Salvar para habilitar a identidade gerenciada atribuída pelo sistema.
Um pop-up aparece para confirmar se você deseja habilitar a identidade gerenciada atribuída pelo sistema e registrar o seu aplicativo de contêiner com o Microsoft Entra ID. Selecione Sim.
Na seção Configurações, selecione Segredos.
Selecione Adicionar.
No painel Adicionar contexto de segredo, insira as seguintes informações:
-
Nome: O nome do segredo.
-
Tipo: selecione Key Vault referência.
-
Key Vault URL secreta: O URI do seu segredo em Key Vault. Este URI tem o seguinte formato:
https://<YOUR_KEY_VAULT_NAME>.vault.azure.net/secrets/<YOUR_SECRET_NAME>/<32_DIGIT_HEX_ID>
-
Identidade: selecione Atribuída pelo sistema.
Selecione Adicionar.
Os segredos são definidos no nível do aplicativo na seção resources.properties.configuration.secrets
.
"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 na matriz secrets
. Seu valor é recuperado automaticamente de Key Vault usando a identidade especificada. Para usar uma identidade gerenciada pelo usuário, substitua system
pela ID do recurso da identidade.
Substitua <KEY_VAULT_SECRET_URI>
pelo URI do segredo em Key Vault.
Quando você cria um aplicativo de contêiner, os segredos são definidos usando o parâmetro --secrets
.
- Ele aceita um conjunto delimitado por espaço de pares de nome/valor.
- Um sinal de igual (
=
) delimita cada par.
- Para especificar uma referência de 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 conexão para uma conta de armazenamento de fila é declarada no parâmetro --secrets
. Substitua <KEY_VAULT_SECRET_URI>
pelo URI do segredo em Key Vault. Substitua <USER_ASSIGNED_IDENTITY_ID>
a ID do recurso de uma identidade atribuída pelo usuário.
Observação
A identidade atribuída pelo usuário deve ter acesso para ler o segredo em Key Vault. A identidade atribuída pelo sistema não pode ser usada com o comando criar porque ela não está disponível até que o aplicativo de contêiner seja criado.
Não há suporte para referências de Key Vault segredos no PowerShell.
Key Vault URI secreto e rotação de segredo
O URI do segredo Key Vault deve estar em um dos seguintes formatos:
-
https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
:referenciar uma versão específica de um segredo.
-
https://myvault.vault.azure.net/secrets/mysecret
: Referencie a versão mais recente de um ativo:
Se uma versão não for especificada na referência, o aplicativo usará a versão mais recente no cofre de chaves. Quando versões mais recentes ficam disponíveis, o aplicativo recupera automaticamente a versão mais recente dentro de 30 minutos. Todas as revisões ativas que fazem referência ao segredo em uma variável de ambiente são reiniciadas automaticamente para obter o novo valor.
Para ter controle total de qual versão de um segredo é usada, especifique a versão no URI.
Como referenciar segredos em variáveis de ambiente
Depois de declarar segredos no nível do aplicativo, conforme descrito na seção Definição de segredos, você pode referenciá-los em variáveis de ambiente, ao criar uma nova revisão no aplicativo de contêiner. Quando uma variável de ambiente referencia um segredo, o valor é preenchido com o valor definido no segredo.
Exemplo
O exemplo a seguir mostra um aplicativo que declara uma cadeia de conexão no nível do aplicativo. 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 referenciá-lo em uma variável de ambiente ao criar uma nova revisão.
Acesse o aplicativo de contêiner no portal do 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 implantar nova revisão, na guia Contêiner, na seção Imagem de contêiner, selecione um contêiner.
Selecione Editar.
No painel de contexto Editar um contêiner, selecione a guia Variáveis de ambiente.
Selecione Adicionar.
Insira as seguintes informações:
-
Nome: o nome da variável de ambiente.
-
Fonte: selecione Referenciar um segredo.
-
Valor: selecione o segredo definido anteriormente.
Selecione Salvar.
Na página Criar e implantar nova revisão, selecione Criar para criar a nova revisão.
Neste exemplo, a cadeia de conexão do aplicativo é declarada como queue-connection-string
e se torna disponível em qualquer lugar nas seçõ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 connection-string
obtém seu valor do segredo queue-connection-string
no nível do aplicativo. Além disso, a configuração de autenticação da regra de escala do Armazenamento de Filas do Azure usa o segredo queue-connection-string
para definir a conexão.
Para evitar a confirmação de valores de segredos para o controle do código-fonte com o modelo do ARM, transmita os valores dos segredos como parâmetros do modelo do ARM.
Neste exemplo, você criará um aplicativo de contêiner usando a CLI do Azure com um segredo que é referenciado em uma variável de ambiente. Para referenciar um segredo em uma variável de ambiente na CLI do Azure, defina o valor como 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 connection-string
obtém seu valor do segredo queue-connection-string
no nível do aplicativo.
Não há suporte para referências de Key Vault segredos no PowerShell.
Neste exemplo, você cria um contêiner usando o Azure PowerShell com um segredo referenciado em uma variável de ambiente. Para referenciar um segredo em uma variável de ambiente no PowerShell, defina o valor como secretref:
, seguido do 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 ConnectionString
obtém seu valor do segredo $QueueConnectionString
no nível do aplicativo.
Montar segredos em um volume
Depois de declarar segredos no nível do aplicativo, conforme descrito na seção Definição de segredos, você pode referenciá-los em variáveis de ambiente, ao criar uma nova revisão no aplicativo 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 carregar segredos específicos.
Exemplo
Depois de definir um segredo em seu aplicativo de contêiner, você pode referenciá-lo em uma variável de ambiente ao criar uma nova revisão.
Acesse o aplicativo de contêiner no portal do 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 implantar nova revisão, na guia Contêiner, na seção Imagem de contêiner, selecione um contêiner.
Selecione Editar.
No painel Contexto Editar um contêiner, selecione a guia Montagens de volume.
Selecione Criar nova regra.
No painel Adicionar volume, insira as seguintes informações:
-
Tipo de volume: Selecione
Secret
.
-
Nome:
mysecrets
-
Montar todos os segredos: habilitado
Observação
Se você quiser carregar segredos específicos, desabilite 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 Caminho de montagem, insira /mnt/secrets
.
Selecione Salvar.
Na página Criar e implantar uma nova revisão, selecione Criar para criar a revisão com a montagem do volume.
Neste exemplo, dois segredos são declarados no nível do aplicativo. Esses segredos são montados em um volume chamado mysecrets
do tipo Secret
. O volume é montado no caminho/mnt/secrets
. Em seguida, o aplicativo pode referenciar os segredos na montagem de 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 segredos na secrets
matriz do objeto de volume. O exemplo a seguir mostra como carregar apenas o queue-connection-string
segredo na montagem de mysecrets
volume com um nome de arquivo de 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 em um volume chamado mysecrets
do tipo Secret
. O volume é montado no caminho/mnt/secrets
. Em seguida, o aplicativo pode ler os segredos como arquivos na montagem de volume.
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.
A montagem de segredos como um volume não é suportada no PowerShell.
Próximas etapas