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 também o próximo, que mostra como Usar conexões baseadas em identidade em vez de segredos com gatilhos e associações.

Pré-requisitos

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 trocados periodicamente. Muitos serviços do Azure permitem que você use uma identidade no Microsoft Entra ID para autenticar clientes e verificar se há permissões que podem ser modificadas e revogadas rapidamente. Isso permite 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.

Alguns serviços não têm suporte para autenticação do Microsoft Entra. Portanto, os segredos ainda podem ser exigidos por seus aplicativos. No entanto, eles 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 você puder e usar o Key Vault quando não for possível, você poderá reduzir o risco, diminuir a sobrecarga operacional e aprimorar, em termos gerais, 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. Os Arquivos do Azure são o sistema de arquivos padrão para implantações Windows em planos Premium e de Consumo. Embora seja possível remover Arquivos do Azure por completo, 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, ela é gerenciada centralmente, com o acesso controlado pela identidade.

Criar um Cofre de chaves do Azure

Primeiro, você precisará de um cofre de chaves para armazenar segredos. Você o configurará para usar o RBAC (controle de acesso baseado em função) do Azure para determinar quem pode ler segredos do cofre.

  1. No portal do Azure, escolha Criar um recurso (+) .

  2. Na página Criar um recurso, selecione Segurança>Key Vault.

  3. 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 O nome do novo grupo de recursos no qual o aplicativo de funções será criado.
    Nome do cofre de chaves Nome globalmente exclusivo Nome que identifica seu novo cofre de chaves. O nome do cofre precisa 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".

  4. Anote o nome usado, pois você precisará dele mais tarde.

  5. Clique em Próximo: Política de Acesso para navegar até a guia Política de Acesso.

  6. Em Modelo de permissão, escolha Controle de acesso baseado em função do Azure

  7. Selecione Examinar + criar. Revise a configuração e clique em Criar.

Configurar uma identidade e permissões para o aplicativo

Para usar o Azure Key Vault, seu aplicativo precisará ter uma identidade que possa receber permissão para ler segredos. Esse aplicativo usará uma identidade atribuída pelo usuário para que as permissões possam ser configuradas antes mesmo de o aplicativo ser criado. Você pode saber mais sobre identidades gerenciadas para Azure Functions no tópico Como usar identidades gerenciadas no Azure Functions.

  1. No portal do Azure, escolha Criar um recurso (+) .

  2. Na página Criar um recurso, selecione Identidade>Identidade Gerenciada Atribuída pelo Usuário.

  3. 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 O nome do novo grupo de recursos no qual o aplicativo de funções será criado.
    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.
  4. Selecione Examinar + criar. Revise a configuração e clique em Criar.

  5. Quando a identidade for criada, navegue até ela no portal. Selecione Propriedades e anote a ID do Recurso, pois você precisará dela mais tarde.

  6. Selecione Atribuições de Função do Azure, selecione Adicionar atribuição de função (versão prévia) .

  7. Na página Adicionar atribuição de função (versão prévia) , use as opções conforme mostrado na tabela abaixo.

    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.
  8. 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 partir desse momento, a identidade poderá ler segredos armazenados no cofre de chaves. Posteriormente no tutorial, você adicionará atribuições de função adicionais para finalidades diferentes.

Gerar um modelo para criar um aplicativo de funções

A experiência do portal para criar um aplicativo de funções não interage com o Azure Key Vault, portanto, você precisará 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.

  1. No portal do Azure, escolha Criar um recurso (+) .

  2. Na página Criar um recurso, selecione Computação>Aplicativo de Funções.

  3. 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 O nome do novo grupo de recursos no qual o aplicativo de funções será criado.
    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.
  4. Selecione Examinar + criar. Seu aplicativo usa os valores padrão na página Hospedagem e Monitoramento. Você pode revisar as opções padrão e elas serão incluídas no modelo do ARM que você gerar.

  5. 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.

  6. Na página de modelo, selecione Implantar e, em seguida, na página implantação personalizada, selecione Editar modelo.

    Screenshot of where to find the deploy button at the top of the template screen.

Editar o modelo

Agora, você editará o modelo para armazenar a cadeia de conexão dos Arquivos do Azure no Key Vault e permitirá que seu aplicativo de funções o referencie. É 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.

  1. 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'))]"
        ]
    },
    
  2. Na definição do recurso de aplicativo de funções (que type definiu como Microsoft.Web/sites), adicione Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring à matriz dependsOn. Substitua "VAULT_NAME" pelo nome do seu cofre de chaves. Isso faz com que seu aplicativo não seja criado antes que esse segredo seja definido. A matriz dependsOn deve ficar parecida com o 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'))]"
            ],
            // ...
        }
    
  3. 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.

  4. Adicione a propriedade keyVaultReferenceIdentity ao objeto properties do aplicativo de funções, como no exemplo abaixo. 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 ao usuário, você precisa especificar qual delas por meio de alguma ID. Isso não é verdadeiro para identidades atribuídas pelo sistema, pois cada aplicativo só terá uma. Muitos recursos que usam a identidade gerenciada supõem que eles devem usar aquela atribuída pelo sistema por padrão.

  5. Agora, encontre os objetos JSON que definem a configuração WEBSITE_CONTENTAZUREFILECONNECTIONSTRING do aplicativo, que deve ser parecida com a do 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')]"
    },
    
  6. 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, ')')]"
    },
    
  7. Selecione Salvar para salvar o modelo atualizado do ARM.

Implante o modelo modificado

  1. Certifique-se de que suas opções de criação, incluindo Grupo de Recursos, ainda estão corretas e selecione Examinar + criar.

  2. 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.

  3. 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. Você pode saber mais sobre isso em 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, você usará 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 funcione e, como os Arquivos do Azure, ele é configurado com uma cadeia de conexão por padrão quando você cria um aplicativo de funções.

Conceder, à identidade atribuída pelo sistema, acesso à conta de armazenamento

Semelhante às etapas que você realizou anteriormente com a identidade atribuída pelo usuário e o cofre de chaves, agora você criará uma atribuição de função concedendo, à identidade atribuída pelo sistema, acesso à sua conta de armazenamento.

  1. No portal do Azure, navegue até a conta de armazenamento que foi criada com seu aplicativo de funções anteriormente.

  2. Selecione Controle de Acesso (IAM) . É aqui que você pode exibir e configurar quem tem acesso ao recurso.

  3. Clique em Adicionar e selecione Adicionar atribuição de função.

  4. Pesquise por Proprietário de Dados de Blob de Armazenamento, selecione-o e clique em Avançar

  5. Na guia Membros, em Atribuir acesso a, escolha Identidade Gerenciada

  6. Clique em Selecionar membros para abrir o painel Selecionar identidades gerenciadas.

  7. Confirme se a Assinatura é aquela na qual você criou os recursos anteriormente.

  8. 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.

  9. 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.

  10. Clique no aplicativo. Ele deve ser movido para baixo na seção Membros selecionados. Clique em Selecionar.

  11. De volta à tela Adicionar atribuição de função, clique em Revisar + atribuir. Revise a configuração e clique em Revisar + 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ê atualizará seu aplicativo de funções para usar a própria identidade atribuída pelo sistema quando ele usar o serviço 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.

  1. No portal do Azure, navegue até o aplicativo de funções.

  2. Em Configurações, escolha Configuração.

  3. Selecione o botão Editar ao lado da configuração do aplicativo AzureWebJobsStorage e altere-o com base nos valores a seguir.

    Opção Valor sugerido Description
    Nome AzureWebJobsStorage__accountName Atualize o nome de AzureWebJobsStorage para o nome exato AzureWebJobsStorage__accountName. Essa configuração informa ao host para 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 permitirá que o sistema saiba que ele deve usar uma identidade para se conectar ao recurso.

  4. Selecione OK e Salvar>Continuar para salvar suas alterações.

Você removeu o requisito de cadeia de conexão de armazenamento para 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.

No próximo tutorial, você aprenderá a usar a identidade em conexões de gatilho e de associação.