Tutorial: criar um aplicativo de funções que se conecta aos serviços do Azure usando identidades em vez de segredos
Este tutorial mostra como configurar um aplicativo de funções usando identidades do Microsoft Entra em vez de segredos ou cadeias de conexão, sempre que possível. O uso de identidades ajuda a evitar o vazamento acidental de segredos confidenciais e pode fornecer melhor visibilidade de como os dados são acessados. Para saber mais sobre conexões baseadas em identidade, veja Configurar uma conexão baseada em identidade.
Embora os procedimentos mostrados funcionem em geral para todas as linguagens, este tutorial atualmente dá suporte a funções de biblioteca de classes C# no Windows, especificamente.
Neste tutorial, você aprenderá como:
- Criar um aplicativo de funções no Azure usando um modelo do ARM
- Habilitar identidades gerenciadas atribuídas pelo sistema e atribuídas pelo usuário no aplicativo de funções
- Criar atribuições de função que dão permissões a outros recursos
- Mover segredos que não podem ser substituídos por identidades para o Azure Key Vault
- Configurar um aplicativo para se conectar ao armazenamento de host padrão usando sua identidade gerenciada
Depois de concluir este tutorial, você deve concluir o tutorial a seguir que mostra como [usar conexões baseadas em identidade em vez de segredos com gatilhos e associações].
Pré-requisitos
Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
Azure Functions Core Tools versão 4.x.
Por que usar identidade?
Gerenciar segredos e credenciais é um desafio comum para equipes de todos os tamanhos. Os segredos precisam ser protegidos contra roubo ou divulgação acidental e talvez precisem ser girados periodicamente. Muitos serviços do Azure permitem que você use uma identidade no Microsoft Entra ID para autenticar clientes e verificar as permissões, que podem ser modificadas e revogadas rapidamente. Isso permite um maior controle sobre a segurança do aplicativo com menos sobrecarga operacional. Uma identidade pode ser um usuário humano, como o desenvolvedor de um aplicativo ou um aplicativo em execução no Azure com uma identidade gerenciada.
Como alguns serviços não dão suporte à autenticação do Microsoft Entra, seus aplicativos ainda podem exigir segredos em determinados casos. No entanto, esses segredos podem ser armazenados no Azure Key Vault, o que ajuda a simplificar o ciclo de vida de gerenciamento para seus segredos. O acesso a um cofre de chaves também é controlado com identidades.
Ao entender como usar identidades em vez de segredos quando puder e usar o Key Vault quando não puder, reduza o risco, diminua a sobrecarga operacional e, geralmente, melhore a postura de segurança para seus aplicativos.
Criar um aplicativo de funções que usa Key Vault para segredos necessários
Os Arquivos do Azure são um exemplo de um serviço que ainda não dá suporte à autenticação do Microsoft Entra para compartilhamentos de arquivos SMB (Server Message Block). Os Arquivos do Azure são o sistema de arquivos padrão para implantações Windows em planos Premium e de Consumo. Embora possamos remover totalmente os Arquivos do Azure, isso introduz limitações que talvez você não queira. Em vez disso, você move a cadeia de conexão dos Arquivos do Azure para o Azure Key Vault. Dessa forma, ele é gerenciado centralmente, com acesso controlado pela identidade.
Criar um Cofre de chaves do Azure
Primeiro, você precisa de um cofre de chaves para armazenar segredos. Configure-o para usar o RBAC (controle de acesso baseado em função) do Azure para determinar quem pode ler segredos do cofre.
No portal do Azure, escolha Criar um recurso (+) .
Na página Criar um recurso, selecione Segurança>Key Vault.
Na página Básico, use a tabela a seguir para configurar o cofre de chaves.
Opção Valor sugerido Descrição Assinatura Sua assinatura A assinatura com a qual esse novo aplicativo de funções será criado. Grupo de Recursos myResourceGroup Nome do novo grupo de recursos em que você cria seu aplicativo de funções. Nome do cofre de chaves Nome globalmente exclusivo Nome que identifica seu novo cofre de chaves. O nome do cofre deve conter apenas caracteres alfanuméricos e traços e não pode começar com um número. Tipo de preço Standard Opções para cobrança. O tipo de preço Standard é suficiente para este tutorial. Região Região preferencial Escolha uma região perto de você ou de outros serviços acessados por suas funções. Use as seleções padrão para as seções "Opções de recuperação".
Anote o nome usado para uso posterior.
Selecione Avançar: Política de Acesso para navegar até a guia Política de Acesso.
Em Modelo de permissão, escolha Controle de acesso baseado em função do Azure
Selecione Examinar + criar. Examine a configuração e selecione Criar.
Configurar uma identidade e permissões para o aplicativo
Para usar o Azure Key Vault, seu aplicativo precisa ter uma identidade que possa receber permissão para ler segredos. Esse aplicativo usa uma identidade atribuída pelo usuário para que as permissões possam ser configuradas antes mesmo de o aplicativo ser criado. Para obter mais informações sobre identidades gerenciadas para o Azure Functions, consulte Como usar identidades gerenciadas no Azure Functions.
No portal do Azure, escolha Criar um recurso (+) .
Na página Criar um recurso, selecione Identidade>Identidade Gerenciada Atribuída pelo Usuário.
Na página Básico, use a tabela a seguir para configurar a identidade.
Opção Valor sugerido Descrição Assinatura Sua assinatura A assinatura com a qual esse novo aplicativo de funções será criado. Grupo de Recursos myResourceGroup Nome do novo grupo de recursos em que você cria seu aplicativo de funções. Região Região preferencial Escolha uma região perto de você ou de outros serviços acessados por suas funções. Nome Nome globalmente exclusivo Nome que identifica sua nova identidade atribuída pelo usuário. Selecione Examinar + criar. Examine a configuração e selecione Criar.
Quando a identidade for criada, navegue até ela no portal. Selecione Propriedades e anote a ID do Recurso para uso posterior.
Selecione Atribuições de Função do Azure e selecione Adicionar atribuição de função (versão prévia).
Na página Adicionar atribuição de função (versão prévia), use as opções conforme mostrado na tabela a seguir.
Opção Valor sugerido Descrição Escopo Key Vault O escopo é um conjunto de recursos ao qual a atribuição de função se aplica. O escopo tem níveis herdados em níveis inferiores. Por exemplo, se você selecionar um escopo de assinatura, a atribuição de função se aplicará a todos os grupos de recursos e recursos na assinatura. Assinatura Sua assinatura A assinatura com a qual esse novo aplicativo de funções será criado. Recurso Seu cofre de chaves O cofre de chaves que você criou anteriormente. Função Usuário de segredos do Key Vault Uma função é uma coleção de permissões que estão sendo concedidas. O Usuário de Segredos do Key Vault concede permissão para a identidade ler valores de segredo do cofre. Selecione Salvar. Pode levar um minuto ou dois para a função aparecer quando você atualizar a lista de atribuições de função para a identidade.
A identidade agora é capaz de ler segredos armazenados no cofre de chaves. Posteriormente, no tutorial, você adicionará atribuições de função adicionais para diferentes finalidades.
Gerar um modelo para criar um aplicativo de funções
Como a experiência do portal para criar um aplicativo de funções não interage com o Azure Key Vault, você precisa gerar e editar um modelo do Azure Resource Manager. Depois, você poderá usar esse modelo para criar seu aplicativo de funções, referenciando a cadeia de conexão dos Arquivos do Azure por meio do cofre de chaves.
Importante
Crie o aplicativo de funções apenas depois de editar o modelo do ARM. A configuração dos Arquivos do Azure precisa ser realizada no momento da criação do aplicativo.
No portal do Azure, escolha Criar um recurso (+) .
Na página Criar um recurso, selecione Computação>Aplicativo de Funções.
Na página Básico, use a tabela a seguir para configurar o aplicativo de funções.
Opção Valor sugerido Descrição Assinatura Sua assinatura A assinatura com a qual esse novo aplicativo de funções será criado. Grupo de Recursos myResourceGroup Nome do novo grupo de recursos em que você cria seu aplicativo de funções. Nome do aplicativo de funções Nome globalmente exclusivo Nome que identifica seu novo aplicativo de funções. Os caracteres válidos são a-z
(não diferencia maiúsculas de minúsculas),0-9
e-
.Publicar Código Escolha entre a publicação de arquivos de código ou de um contêiner do Docker. Pilha de runtime .NET Este tutorial usa .NET. Região Região preferencial Escolha uma região perto de você ou de outros serviços acessados por suas funções. Selecione Examinar + criar. Seu aplicativo usa os valores padrão na página Hospedagem e Monitoramento. Examine as opções padrão, que estão incluídas no modelo do ARM gerado.
Em vez de criar seu aplicativo de funções aqui, escolha Baixar um modelo para automação, que está à direita do botão Próximo.
Na página de modelo, selecione Implantar e, em seguida, na página implantação personalizada, selecione Editar modelo.
Editar o modelo
Agora você edita o modelo para armazenar a cadeia de conexão dos Arquivos do Azure no Key Vault e permitir que seu aplicativo de funções faça referência a ele. É necessário que você tenha os seguintes valores das seções anteriores antes de continuar:
- a ID do recurso de uma identidade atribuída pelo usuário;
- o nome de seu cofre de chaves
Observação
Se você criar um modelo completo para automação, inclua definições para os recursos de identidade e de atribuição de função, com as cláusulas dependsOn
apropriadas. Isso substituiria as etapas anteriores que usavam o portal. Consulte as diretrizes do Azure Resource Manager e a documentação de cada serviço.
No editor, encontre o local em que a matriz
resources
começa. Antes da definição do aplicativo de funções, adicione a seção a seguir, que coloca a cadeia de conexão dos Arquivos do Azure no Key Vault. Substitua "VAULT_NAME" pelo nome do seu cofre de chaves.{ "type": "Microsoft.KeyVault/vaults/secrets", "apiVersion": "2016-10-01", "name": "VAULT_NAME/azurefilesconnectionstring", "properties": { "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" }, "dependsOn": [ "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]" ] },
Na definição do recurso de aplicativo de funções (que
type
definiu comoMicrosoft.Web/sites
), adicioneMicrosoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring
à matrizdependsOn
. Novamente, substitua "VAULT_NAME" pelo nome do cofre de chaves. Isso impede que seu aplicativo seja criado antes que o segredo seja definido. A matrizdependsOn
deve ser semelhante ao exemplo a seguir:{ "type": "Microsoft.Web/sites", "apiVersion": "2018-11-01", "name": "[parameters('name')]", "location": "[parameters('location')]", "tags": null, "dependsOn": [ "microsoft.insights/components/idcxntut", "Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring", "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]", "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]" ], // ... }
Adicione o bloco
identity
do exemplo a seguir à definição do recurso do aplicativo de funções. Substitua "IDENTITY_RESOURCE_ID" pela ID do recurso de sua identidade atribuída pelo usuário.{ "apiVersion": "2018-11-01", "name": "[parameters('name')]", "type": "Microsoft.Web/sites", "kind": "functionapp", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned,UserAssigned", "userAssignedIdentities": { "IDENTITY_RESOURCE_ID": {} } }, "tags": null, // ... }
Esse bloco
identity
também configura uma identidade atribuída pelo sistema, que você usará posteriormente neste tutorial.Adicione a propriedade
keyVaultReferenceIdentity
ao objetoproperties
para o aplicativo de função, como no exemplo a seguir. Substitua "IDENTITY_RESOURCE_ID" pela ID do recurso de sua identidade atribuída pelo usuário.{ // ... "properties": { "name": "[parameters('name')]", "keyVaultReferenceIdentity": "IDENTITY_RESOURCE_ID", // ... } }
Você precisa dessa configuração porque um aplicativo pode ter várias identidades atribuídas ao usuário configuradas. Sempre que quiser usar uma identidade atribuída pelo usuário, especifique-a com uma ID. As identidades atribuídas pelo sistema não precisam ser especificadas dessa forma, pois um aplicativo só pode ter uma. Muitos recursos que usam a identidade gerenciada supõem que eles devem usar aquela atribuída pelo sistema por padrão.
Localize os objetos JSON que definem a configuração do aplicativo
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
, que deve ser semelhante ao seguinte exemplo:{ "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" },
Substitua o campo
value
por uma referência ao segredo, conforme mostrado no exemplo a seguir. Substitua "VAULT_NAME" pelo nome do seu cofre de chaves.{ "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId('Microsoft.KeyVault/vaults/secrets', 'VAULT_NAME', 'azurefilesconnectionstring')).secretUri, ')')]" },
Selecione Salvar para salvar o modelo atualizado do ARM.
Implante o modelo modificado
Certifique-se de que suas opções de criação, incluindo Grupo de Recursos, ainda estão corretas e selecione Examinar + criar.
Depois que o modelo é validado, anote o seu Nome da Conta de Armazenamento, pois você usará essa conta mais tarde. Por fim, selecione Criar para criar seus recursos do Azure e implantar seu código no aplicativo de funções.
Após a conclusão da implantação, selecione Ir para o grupo de recursos e, em seguida, selecione o novo aplicativo de funções.
Parabéns! Você criou com êxito seu aplicativo de funções para referenciar a cadeia de conexão dos Arquivos do Azure do Azure Key Vault.
Sempre que seu aplicativo precisar adicionar uma referência a um segredo, bastaria definir uma nova configuração de aplicativo apontando para o valor armazenado no Key Vault. Para obter mais informações, consulte referências do Key Vault para o Azure Functions.
Dica
A cadeia de conexão do Application Insights e a chave de instrumentação incluída nela não são considerados segredos e podem ser recuperados do App Insights usando permissões de Leitor. Você não precisa movê-los para o Key Vault, embora possa fazê-lo.
Usar a identidade gerenciada para AzureWebJobsStorage
Em seguida, use a identidade atribuída pelo sistema configurada nas etapas anteriores para a conexão AzureWebJobsStorage
. AzureWebJobsStorage
é usado pelo runtime do Functions e por vários gatilhos e vinculações para coordenar entre várias instâncias em execução. Ele é necessário para que seu aplicativo de funções opere e, como os Arquivos do Azure, é configurado com uma cadeia de conexão por padrão quando você cria um novo aplicativo de funções.
Conceder, à identidade atribuída pelo sistema, acesso à conta de armazenamento
Semelhante às etapas que você seguiu anteriormente com a identidade atribuída pelo usuário e seu cofre de chaves, agora você cria uma atribuição de função concedendo ao sistema acesso de identidade atribuído à sua conta de armazenamento.
No portal do Azure, navegue até a conta de armazenamento que foi criada com seu aplicativo de funções anteriormente.
Selecione Controle de Acesso (IAM) . Esta página é onde você pode exibir e configurar quem tem acesso ao recurso.
Selecione Adicionar e selecione adicionar atribuição de função.
Pesquise o Proprietário de Dados do Blob de Armazenamento, selecione-o e selecione Avançar
Na guia Membros, em Atribuir acesso a, escolha Identidade Gerenciada
Selecione Selecionar membros para abrir o painel Selecionar identidades gerenciadas.
Confirme se a Assinatura é aquela na qual você criou os recursos anteriormente.
No seletor Identidade gerenciada, escolha Aplicativo de Funções da categoria Identidade gerenciada atribuída pelo sistema. O rótulo Aplicativo de funções pode ter um número entre parênteses ao lado dele, indicando o número de aplicativos na assinatura com identidades atribuídas pelo sistema.
Seu aplicativo deve aparecer em uma lista abaixo dos campos de entrada. Se você não a vir, poderá usar a caixa Selecionar para filtrar os resultados com o nome do aplicativo.
Selecione seu aplicativo. Ele deve ser movido para baixo na seção Membros selecionados. Escolha Selecionar.
Na tela Adicionar atribuição de função, selecione Examinar + atribuir. Examine a configuração e selecione Examinar + atribuir.
Dica
Se você pretende usar o aplicativo de funções para uma função disparada por blob, precisará repetir essas etapas para as funções Colaborador de conta de armazenamento e Colaborador de dados da fila de armazenamento sobre a conta usado por AzureWebJobsStorage. Para saber mais, confira Conexões baseadas em identidade do gatilho de blob.
Editar a configuração do AzureWebJobsStorage
Em seguida, você atualiza seu aplicativo de funções para usar sua identidade atribuída pelo sistema quando ele usa o serviço de blob para armazenamento de host.
Importante
A configuração AzureWebJobsStorage
é usada por alguns gatilhos e associações, e essas extensões também precisam ser capazes de usar conexões baseadas em identidade. Os aplicativos que usam gatilhos de blob ou gatilhos de hub de eventos podem precisar atualizar essas extensões. Como nenhuma função foi definida para esse aplicativo, ainda não há uma preocupação. Para saber mais sobre esse requisito, confira Conectando-se ao armazenamento de host com uma identidade.
Da mesma forma, AzureWebJobsStorage
é usado para artefatos de implantação ao usar o build do lado do servidor no Consumo em Linux. Quando você habilitar conexões baseadas em identidade para AzureWebJobsStorage
no Consumo em Linux, será necessário implantar por meio de um pacote de implantação externo.
No portal do Azure, navegue até o aplicativo de funções.
Em seu aplicativo de funções, expanda Configurações e selecione Variáveis de ambiente.
Na guia Configurações do aplicativo, selecione a configuração do aplicativo AzureWebJobsStorage e edite-a de acordo com a tabela a seguir:
Opção Valor sugerido Description Nome AzureWebJobsStorage__accountName Altere o nome do AzureWebJobsStorage para o nome exato AzureWebJobsStorage__accountName
. Essa configuração instrui o host a usar a identidade em vez de procurar um segredo armazenado. A nova configuração usa um sublinhado duplo (__
), que é um caractere especial nas configurações do aplicativo.Valor Nome da sua conta Atualize o nome da cadeia de conexão como apenas o seu StorageAccountName. Essa configuração informa ao sistema para usar uma identidade para se conectar ao recurso.
Selecione Aplicar e selecione Aplicar e Confirmar para salvar suas alterações e reiniciar a função de aplicativo.
Agora você removeu o requisito de cadeia de conexão de armazenamento do AzureWebJobsStorage configurando seu aplicativo para se conectar a blobs usando identidades gerenciadas.
Observação
A sintaxe __accountName
é exclusiva para a conexão AzureWebJobsStorage e não pode ser usada para outras conexões de armazenamento. Para saber como definir outras conexões, verifique a referência para cada gatilho e associação que seu aplicativo usa.
Próximas etapas
Este tutorial mostrou como criar um aplicativo de funções sem armazenar segredos na configuração dele.
Avance para o próximo tutorial para saber como usar identidades em conexões de gatilho e associação.