Tutorial: Proteger a ligação do Serviço Cognitivo a partir do .NET Serviço de Aplicações com Key Vault

Serviço de Aplicações do Azure pode utilizar identidades geridas para ligar a serviços de back-end sem uma cadeia de ligação, o que elimina segredos de ligação para gerir e mantém a conectividade de back-end segura num ambiente de produção. Para serviços de back-end que não suportam identidades geridas e ainda necessitam de segredos de ligação, pode utilizar Key Vault para gerir segredos de ligação. Este tutorial utiliza os serviços de IA do Azure como exemplo para lhe mostrar como é feito na prática. Quando terminar, tem uma aplicação que faz chamadas programáticas para os serviços de IA do Azure, sem armazenar segredos de ligação dentro de Serviço de Aplicações.

Dica

Os serviços de IA do Azure suportam a autenticação através de identidades geridas, mas este tutorial utiliza a autenticação da chave de subscrição para demonstrar como se pode ligar a um serviço do Azure que não suporta identidades geridas a partir dos Serviços de Aplicações.

Diagrama de arquitetura para o cenário de tutorial.

Com esta arquitetura:

  • A conectividade ao Key Vault é protegida por identidades geridas
  • Serviço de Aplicações acede aos segredos com referências Key Vault como definições de aplicações.
  • O acesso ao cofre de chaves está restrito à aplicação. Os contribuidores de aplicações, como os administradores, podem ter controlo total dos recursos Serviço de Aplicações e, ao mesmo tempo, não têm acesso aos segredos Key Vault.
  • Se o código da aplicação já aceder a segredos de ligação com as definições da aplicação, não é necessária qualquer alteração.

O que irá aprender:

  • Ativar identidades geridas
  • Utilizar identidades geridas para ligar a Key Vault
  • Utilizar as referências do Key Vault
  • Aceder aos serviços de IA do Azure

Pré-requisitos

Prepare o seu ambiente para a CLI do Azure.

Criar uma aplicação com conectividade aos serviços de IA do Azure

  1. Crie um grupo de recursos para conter todos os seus recursos:

    # Save resource group name as variable for convenience
    groupName=myKVResourceGroup
    region=westeurope
    
    az group create --name $groupName --location $region
    
  2. Criar um recurso dos serviços de IA do Azure. Substitua <cs-resource-name> por um nome exclusivo à sua escolha.

    # Save resource name as variable for convenience. 
    csResourceName=<cs-resource-name>
    
    az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
    

    Nota

    --sku F0 cria um recurso de serviços de IA do Azure de escalão gratuito. Cada subscrição está limitada a uma quota de um recurso de escalão TextAnalytics livre. Se já tiver ultrapassado a quota, utilize --sku S em alternativa.

Configurar a aplicação .NET

Clone o repositório de exemplo localmente e implemente a aplicação de exemplo para Serviço de Aplicações. Substitua <app-name> por um nome exclusivo.

# Save app name as variable for convenience
appName=<app-name>

# Clone sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/dotnet

az webapp up --sku F1 --resource-group $groupName --name $appName --plan $appName --location $region

Configurar segredos como definições da aplicação

  1. Configure os segredos dos serviços de IA do Azure como definições de aplicações CS_ACCOUNT_NAME e CS_ACCOUNT_KEY.

    # Get subscription key for Cognitive Services resource
    csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv)
    
    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
    
  2. No browser, navegue para a sua aplicação de implementação em <app-name>.azurewebsites.net e experimente o detetor de idiomas com cadeias em vários idiomas.

    Captura de ecrã que mostra a aplicação de detetor de idiomas implementada no Serviço de Aplicações.

    Se observar o código da aplicação, poderá reparar na saída de depuração dos resultados da deteção na mesma cor do tipo de letra que o fundo. Pode vê-lo ao tentar realçar o espaço em branco diretamente abaixo do resultado.

Conectividade de back-end segura

De momento, os segredos de ligação são armazenados como definições da aplicação na sua aplicação Serviço de Aplicações. Esta abordagem já está a proteger segredos de ligação da base de código da aplicação. No entanto, qualquer contribuidor que possa gerir a sua aplicação também pode ver as definições da aplicação. Neste passo, vai mover os segredos de ligação para um cofre de chaves e bloquear o acesso para que apenas possa geri-lo e apenas a aplicação Serviço de Aplicações pode lê-lo com a respetiva identidade gerida.

  1. Criar um cofre de chaves. Substitua <vault-name> por um nome exclusivo.

    # Save app name as variable for convenience
    vaultName=<vault-name>
    
    az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
    

    O --enable-rbac-authorization parâmetro define o controlo de acesso baseado em funções (RBAC) do Azure como o modelo de permissão. Por predefinição, esta definição invalida todas as permissões de políticas de acesso.

  2. Atribua a si mesmo a função RBAC Key Vault Secrets Officer para o cofre.

    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    myId=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
    
  3. Ative a identidade gerida atribuída pelo sistema para a sua aplicação e atribua-lhe a função RBAC de Utilizador Key Vault Segredos para o cofre.

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Adicione o nome de recurso e a chave de subscrição dos serviços de IA do Azure como segredos ao cofre e guarde os respetivos IDs como variáveis de ambiente para o próximo passo.

    csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv)
    csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
    
  5. Anteriormente, definia os segredos como definições CS_ACCOUNT_NAME da aplicação e CS_ACCOUNT_KEY na sua aplicação. Agora, defina-as como referências do cofre de chaves .

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    
  6. No browser, navegue para <app-name>.azurewebsites.net novamente. Se receber resultados de deteção novamente, está a ligar-se ao ponto final dos serviços de IA do Azure com referências do cofre de chaves.

Parabéns, a sua aplicação está agora a ligar-se aos serviços de IA do Azure através de segredos mantidos no cofre de chaves, sem quaisquer alterações ao código da aplicação.

Limpar os recursos

Nos passos anteriores, criou os recursos do Azure num grupo de recursos. Se achar que não vai precisar destes recursos no futuro, execute o seguinte comando no Cloud Shell para eliminar o grupo de recursos:

az group delete --name $groupName

Este comando pode demorar alguns minutos a ser executado.

Passos seguintes