Tutorial: Criar um aplicativo de função que se conecta aos serviços do Azure usando identidades em vez de segredos

Este tutorial mostra como configurar um aplicativo de função 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 sobre como os dados são acessados. Para saber mais sobre conexões baseadas em identidade, consulte Configurar uma conexão baseada em identidade.

Embora os procedimentos mostrados funcionem geralmente para todos os idiomas, este tutorial atualmente suporta funções de biblioteca de classes C# no Windows especificamente.

Neste tutorial, irá aprender a:

  • Criar um aplicativo de função no Azure usando um modelo ARM
  • Habilite identidades gerenciadas atribuídas pelo sistema e pelo usuário no aplicativo de função
  • 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 Cofre de Chaves do Azure
  • 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 de acompanhamento que mostra como usar conexões baseadas em identidade em vez de segredos com gatilhos e associações.

Pré-requisitos

Porquê usar a 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 podem precisar ser alternados 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.

Alguns serviços não suportam a autenticação do Microsoft Entra, portanto, segredos ainda podem ser exigidos por seus aplicativos. No entanto, eles podem ser armazenados no Cofre da Chave do Azure, o que ajuda a simplificar o ciclo de vida de gerenciamento de 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ê pode e usar o Cofre da Chave quando não pode, você será capaz de reduzir riscos, diminuir a sobrecarga operacional e, geralmente, melhorar a postura de segurança para seus aplicativos.

Crie um aplicativo de função que use o Cofre da Chave para os segredos necessários

O Azure Files é um exemplo de um serviço que ainda não oferece suporte à autenticação do Microsoft Entra para compartilhamentos de arquivos SMB. O Azure Files é o sistema de arquivos padrão para implantações do Windows nos planos Premium e de Consumo. Embora possamos remover totalmente os Arquivos do Azure, isso introduz limitações que você pode não querer. Em vez disso, você moverá a cadeia de conexão Arquivos do Azure para o Cofre da Chave do Azure. Dessa forma, ele é gerenciado centralmente, com acesso controlado pela identidade.

Criar um Azure Key Vault

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 Cofre da Chave de Segurança>.

  3. Na página Noções básicas, use a tabela a seguir para configurar o cofre de chaves.

    Opção Valor sugerido Descrição
    Subscrição a sua subscrição Subscrição ao abrigo da qual esta nova aplicação funcional é criada.
    Grupo de Recursos myResourceGroup Nome para o novo grupo de recursos onde você criará seu aplicativo de função.
    Nome do cofre da chave Nome globalmente exclusivo Nome que identifica o 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.
    Escalão de Preço Standard Opções de faturação. Padrão é suficiente para este tutorial.
    Região Região preferida Escolha uma região perto de si ou perto de outros serviços a que as suas funções acedam.

    Use as seleções padrão para as seções "Opções de recuperação".

  4. Anote o nome que usou, pois precisará dele mais tarde.

  5. Clique em Avançar: 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 Rever + criar. Reveja a configuração e, em seguida, clique em Criar.

Configurar uma identidade e permissões para o aplicativo

Para usar o Cofre da Chave do Azure, seu aplicativo precisará ter uma identidade que possa receber permissão para ler segredos. Este aplicativo usará uma identidade atribuída ao 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 o 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>gerenciada atribuída pelo usuário.

  3. Na página Noções básicas, use a tabela a seguir para configurar a identidade.

    Opção Valor sugerido Descrição
    Subscrição a sua subscrição Subscrição ao abrigo da qual esta nova aplicação funcional é criada.
    Grupo de Recursos myResourceGroup Nome para o novo grupo de recursos onde você criará seu aplicativo de função.
    Região Região preferida Escolha uma região perto de si ou perto de outros serviços a que as suas funções acedam.
    Name Nome globalmente exclusivo Nome que identifica sua nova identidade atribuída pelo usuário.
  4. Selecione Rever + criar. Reveja a configuração e, em seguida, clique em Criar.

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

  6. Selecione Atribuições de Função do Azure e clique em Adicionar atribuição de função (Visualização).

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

    Opção Valor sugerido Descrição
    Scope Key Vault Escopo é um conjunto de recursos ao qual a atribuição de função se aplica. O escopo tem níveis que são herdados em níveis mais baixos. 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.
    Subscrição a sua subscrição Subscrição ao abrigo da qual esta nova aplicação funcional é criada.
    Recurso O seu cofre de chaves O cofre de chaves criado anteriormente.
    Função Usuário do Key Vault Secrets Uma função é uma coleção de permissões que estão sendo concedidas. Key Vault Secrets O usuário dá permissão para que a identidade leia valores secretos do vault.
  8. Selecione Guardar. Pode levar um ou dois minutos para que a função apareça quando você atualizar a lista de atribuições de função para a identidade.

A identidade agora poderá ler segredos armazenados no cofre de chaves. Mais adiante no tutorial, você adicionará atribuições de função adicionais para diferentes finalidades.

Gerar um modelo para criar um aplicativo de função

A experiência do portal para criar um aplicativo de função não interage com o Azure Key Vault, portanto, você precisará gerar e editar o modelo do Azure Resource Manager. Em seguida, você pode usar esse modelo para criar seu aplicativo de função fazendo referência à cadeia de conexão Arquivos do Azure a partir do seu cofre de chaves.

Importante

Não crie o aplicativo de função até depois de editar o modelo ARM. A configuração dos Arquivos do Azure precisa ser configurada no momento da criação do aplicativo.

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

  2. Na página Criar um recurso, selecione Aplicativo de função de computação>.

  3. Na página Noções básicas, use a tabela a seguir para configurar o aplicativo de função.

    Opção Valor sugerido Descrição
    Subscrição a sua subscrição Subscrição ao abrigo da qual esta nova aplicação funcional é criada.
    Grupo de Recursos myResourceGroup Nome para o novo grupo de recursos onde você criará seu aplicativo de função.
    Nome da Aplicação de Funções Nome globalmente exclusivo Nome que identifica a sua aplicação Function App nova. Os carateres válidos são a-z (não sensível a maiúsculas e minúsculas), 0-9 e -.
    Publicar Código Escolha publicar arquivos de código ou um contêiner do Docker.
    Pilha de runtime .NET Este tutorial usa o .NET.
    Região Região preferida Escolha uma região perto de si ou perto de outros serviços a que as suas funções acedam.
  4. Selecione Rever + 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 ARM que você gerar.

  5. Em vez de criar seu aplicativo de função aqui, escolha Baixar um modelo para automação, que fica à direita do botão Avançar .

  6. Na página do 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 Arquivos do Azure no Cofre da Chave e permitir que seu aplicativo de função faça referência a ele. Certifique-se de que tem os seguintes valores das secções anteriores antes de continuar:

  • A ID do recurso da identidade atribuída pelo usuário
  • O nome do cofre da chave

Nota

Se você fosse criar um modelo completo para automação, desejaria incluir definições para os recursos de atribuição de identidade e função, com as cláusulas apropriadas dependsOn . Isto substituiria os passos anteriores que utilizavam o portal. Consulte as orientações do Azure Resource Manager e a documentação de cada serviço.

  1. No editor, encontre onde a resources matriz começa. Antes da definição do aplicativo de função, adicione a seção a seguir que coloca a cadeia de conexão Arquivos do Azure no Cofre da Chave. Substitua "VAULT_NAME" pelo nome do 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 para o recurso de aplicativo de função (que foi type definido como Microsoft.Web/sites), adicione Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring à dependsOn matriz. Substitua novamente "VAULT_NAME" pelo nome do cofre de chaves. Isso faz com que seu aplicativo não seja criado antes que esse segredo seja definido. A dependsOn matriz deve se parecer 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 identity bloco do exemplo a seguir à definição do recurso do aplicativo de função. Substitua "IDENTITY_RESOURCE_ID" pelo ID de recurso da 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,
        // ...
    }
    

    Este identity bloco também configura uma identidade atribuída ao sistema que você usará mais adiante neste tutorial.

  4. Adicione a keyVaultReferenceIdentity propriedade ao properties objeto para o aplicativo de função como no exemplo abaixo. Substitua "IDENTITY_RESOURCE_ID" pelo ID de recurso da 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 pelo usuário configuradas. Sempre que você quiser usar uma identidade atribuída pelo usuário, você tem que especificar qual através de algum ID. Isso não é verdade para identidades atribuídas ao sistema, já que um aplicativo só terá uma. Muitos recursos que usam identidade gerenciada assumem que devem usar o atribuído ao sistema por padrão.

  5. Agora, localize os objetos JSON que definem a configuração do WEBSITE_CONTENTAZUREFILECONNECTIONSTRING aplicativo, que deve se parecer com o exemplo a seguir:

    {
        "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 value campo por uma referência ao segredo, conforme mostrado no exemplo a seguir. Substitua "VAULT_NAME" pelo nome do 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 ARM atualizado.

Implantar o modelo modificado

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

  2. Depois que o modelo for validado, anote o Nome da sua 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ção.

  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ção.

Parabéns! Você criou com êxito seu aplicativo de função para fazer referência à cadeia de conexão Arquivos do Azure a partir do Cofre da Chave do Azure.

Sempre que seu aplicativo precisar adicionar uma referência a um segredo, você só precisará definir uma nova configuração de aplicativo apontando para o valor armazenado no Cofre da Chave. Você pode saber mais sobre isso em Referências do Cofre de Chaves para o Azure Functions.

Gorjeta

A cadeia de conexão do Application Insights e sua chave de instrumentação incluída não são consideradas segredos e podem ser recuperadas do App Insights usando permissões do Leitor . Você não precisa movê-los para o Cofre da Chave, embora certamente possa.

Usar identidade gerenciada para AzureWebJobsStorage

Em seguida, você usará a identidade atribuída ao sistema que você configurou nas etapas anteriores para a AzureWebJobsStorage conexão. AzureWebJobsStorage é usado pelo tempo de execução do Functions e por vários gatilhos e ligações para coordenar entre várias instâncias em execução. Ele é necessário para que seu aplicativo de função opere e, como os Arquivos do Azure, ele é configurado com uma cadeia de conexão por padrão quando você cria um novo aplicativo de função.

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

Semelhante às etapas que você executou antes com a identidade atribuída pelo usuário e seu 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ção anteriormente.

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

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

  4. Procure 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 Subscrição é aquela na qual criou os recursos anteriormente.

  8. No seletor de identidade gerenciada, escolha Aplicativo de função na categoria Identidade gerenciada atribuída pelo sistema. O rótulo "Aplicativo de função" pode ter um número entre parênteses ao lado, 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 não a vir, pode utilizar a caixa Selecionar para filtrar os resultados com o nome da sua aplicação.

  10. Clique na sua candidatura. 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. Reveja a configuração e, em seguida, clique em Rever + atribuir.

Gorjeta

Se você pretende usar o aplicativo de função para uma função acionada por blob, precisará repetir essas etapas para as funções de Colaborador da Conta de Armazenamento e Colaborador de Dados da Fila de Armazenamento na conta usada pelo AzureWebJobsStorage. Para saber mais, consulte Conexões baseadas em identidade de gatilho de Blob.

Editar a configuração do AzureWebJobsStorage

Em seguida, você atualizará seu aplicativo de função para usar sua identidade atribuída ao sistema quando ele usar o serviço de blob para armazenamento de host.

Importante

A AzureWebJobsStorage configuração é usada por alguns gatilhos e associações, e essas extensões também devem 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 este aplicativo, não há uma preocupação ainda. Para saber mais sobre esse requisito, consulte Conectando-se ao armazenamento do host com uma identidade.

Da mesma forma, AzureWebJobsStorage é usado para artefatos de implantação ao usar a compilação do lado do servidor no Linux Consumption. Ao habilitar conexões baseadas em identidade para AzureWebJobsStorage o Consumo do Linux, você precisará implantar por meio de um pacote de implantação externo.

  1. No portal do Azure, navegue até seu aplicativo de função.

  2. Em Definições, selecione Configuração.

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

    Opção Valor sugerido Description
    Name AzureWebJobsStorage__accountName Atualize o nome de AzureWebJobsStorage para o nome AzureWebJobsStorage__accountNameexato . Essa configuração diz 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 O nome da sua conta Atualize o nome da cadeia de conexão para apenas o StorageAccountName.

    Essa configuração permitirá que o sistema saiba que ele deve usar uma identidade para se conectar ao recurso.

  4. Selecione OK e, em seguida, Guardar>Continuar para guardar as alterações.

Você removeu o requisito de cadeia de conexão de armazenamento para AzureWebJobsStorage configurando seu aplicativo para, em vez disso, se conectar a blobs usando identidades gerenciadas.

Nota

A __accountName sintaxe é exclusiva para a conexão AzureWebJobsStorage e não pode ser usada para outras conexões de armazenamento. Para aprender a definir outras conexões, verifique a referência para cada gatilho e vinculação que seu aplicativo usa.

Próximos passos

Este tutorial mostrou como criar um aplicativo de função sem armazenar segredos em sua configuração.

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