Gerenciar segredos em Aplicativos de Contêiner do Azure
Artigo
O Azure Container Apps permite que a sua aplicação armazene em segurança valores de configurações 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 do Dapr.
Os segredos são confinados a uma aplicação, fora de qualquer 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 ao mesmo ou 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 uma referência a um segredo armazenado no Cofre da Chave do Azure.
Nota
Evite especificar o valor de um segredo diretamente em um ambiente de produção. Em vez disso, use uma referência a um segredo armazenado no Cofre da Chave do Azure, conforme descrito na seção Armazenar valor secreto em Aplicativos de Contêiner.
Armazenar valor secreto em aplicativos de contêiner
Quando você define segredos através do portal, ou através de diferentes opções de linha de comando.
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada secrets na matriz. 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 --secrets parâmetro.
O parâmetro aceita um conjunto delimitado por espaço de pares nome/valor.
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada --secrets no parâmetro. Substitua <CONNECTION_STRING> pelo valor da cadeia de conexã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.
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada. O valor for queue-connection-string vem de uma variável de ambiente chamada $QueueConnectionString.
Segredo de referência do Cofre da Chave
Ao definir um segredo, você cria uma referência a um segredo armazenado no Cofre da Chave do Azure. O Container Apps recupera automaticamente o valor secreto do Key Vault e o disponibiliza como um segredo em seu aplicativo de contêiner.
Para fazer referência a um segredo do Cofre da Chave, você deve primeiro habilitar a identidade gerenciada em seu aplicativo de contêiner e conceder à identidade acesso aos segredos do Cofre da Chave.
Para habilitar a identidade gerenciada em seu aplicativo de contêiner, consulte Identidades gerenciadas.
Para conceder acesso aos segredos do Cofre da Chave, crie uma política de acesso no Cofre da Chave para a identidade gerenciada que você criou. Habilite a permissão secreta "Obter" nesta política.
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada secrets na matriz. Seu valor é recuperado automaticamente do Cofre da Chave usando a identidade especificada. Para usar uma identidade gerenciada pelo usuário, substitua system pelo ID de recurso da identidade.
Substitua <KEY-VAULT-SECRET-URI> pelo URI do seu segredo no Cofre de Chaves.
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 do Cofre da Chave, 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.
Aqui, uma cadeia de conexão para uma conta de armazenamento de fila é declarada --secrets no parâmetro. Substitua <KEY_VAULT_SECRET_URI> pelo URI do seu segredo no Cofre de Chaves. Substitua <USER_ASSIGNED_IDENTITY_ID> pelo ID do recurso da identidade atribuída ao usuário.
Nota
A identidade atribuída ao usuário deve ter acesso para ler o segredo no Cofre da Chave. 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 do Cofre da Chave de Segredos não são suportadas no PowerShell.
Nota
Se estiver a utilizar UDR com a Firewall do Azure, terá de adicionar a AzureKeyVault etiqueta de serviço e o FQDN login.microsoft.com à lista de permissões da firewall. Consulte configurar o UDR com o Firewall do Azure para decidir quais tags de serviço adicionais você precisa.
URI secreto do Cofre de Chaves e rotação secreta
O URI secreto do Cofre da Chave deve estar em um 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 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.
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 usa o queue-connection-string segredo como para definir sua conexão.
Para evitar comprometer valores secretos para o controle do código-fonte com seu modelo ARM, passe valores secretos como parâmetros de modelo ARM.
Neste exemplo, você cria um aplicativo de contêiner usando a CLI do Azure com um segredo referenciado em uma variável de ambiente. Para fazer referência a um segredo em uma variável de ambiente na CLI do Azure, defina seu valor como secretref:, seguido pelo nome do segredo.
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 do Cofre da Chave de Segredos não são suportadas no PowerShell.
Neste exemplo, você cria um contêiner usando o Azure PowerShell com um segredo referenciado em 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.
Aqui, a variável de ambiente nomeada ConnectionString obtém seu valor do segredo de nível $QueueConnectionString de aplicativo.
Segredos de montagem num volume
Depois de declarar segredos no nível do aplicativo, conforme descrito na seção definindo segredos, você pode fazer referência a eles em montagens de volume ao criar uma nova revisão em seu 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 pode carregar segredos específicos.
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.
Vá para seu aplicativo de contêiner no portal do Azure.
Abra a página Gerenciamento de revisão .
Selecione Criar nova revisão.
Na página Criar e implantar nova revisão.
Selecione um contêiner e selecione Editar.
Na seção Montagens de volume, expanda a seção Segredos.
Selecione Criar novo volume.
Introduza as informações seguintes:
Designação: 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.
Em Nome do volume, selecione mysecrets.
Em Montar caminho, insira /mnt/secrets.
Selecione Guardar.
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 em um 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.
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 queue-connection-string segredo na montagem do mysecrets volume com um nome de arquivo de 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. O aplicativo pode então ler os segredos como arquivos na montagem do volume.