Tutorial: Conexão segura do Serviço Cognitivo do Serviço de Aplicativo .NET usando Key Vault

Serviço de Aplicativo do Azure pode usar identidades gerenciadas para se conectar a serviços de back-end sem uma cadeia de conexão, o que elimina a necessidade de gerenciamento dos segredos de conexão e mantém sua conectividade de back-end segura em um ambiente de produção. Para serviços de back-end que não dão suporte a identidades gerenciadas e ainda exigem segredos de conexão, você pode usar o Key Vault para gerenciar segredos de conexão. Esse tutorial usa os serviços de IA do Azure como um exemplo para mostrar como isso é feito na prática. Quando terminar, você terá um aplicativo que faz chamadas programáticas aos serviços de IA do Azure sem armazenar segredos de conexão dentro do Serviço de Aplicativo.

Dica

Os serviços de IA do Azure dão suporte à autenticação por meio de identidades gerenciadas, mas esse tutorial usa a autenticação de chave de assinatura para demonstrar como você pode se conectar a um serviço do Azure que não dá suporte às identidades gerenciadas dos Serviços de Aplicativos.

Architecture diagram for tutorial scenario.

Com essa arquitetura:

  • A conectividade com o Key Vault é protegida por identidades gerenciadas
  • O Serviço de Aplicativo acessa os segredos usando as referências do Key Vault como configurações de aplicativo.
  • O acesso ao cofre de chaves fica restrito ao aplicativo. Os colaboradores do aplicativo, como administradores, podem ter controle total dos recursos do Serviço de Aplicativo e, ao mesmo tempo, não têm acesso aos segredos do Key Vault.
  • Se o código do aplicativo já acessar segredos de conexão com as configurações do aplicativo, nenhuma alteração será necessária.

O que você aprenderá:

  • Habilitar identidades gerenciadas
  • Usar identidades gerenciadas para conectar-se ao Key Vault
  • Usar referências de Key Vault
  • Acessar os serviços de IA do Azure

Pré-requisitos

Prepare seu ambiente para a CLI do Azure.

Criar um aplicativo com conectividade com os 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 de 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
    

    Observação

    O --sku F0 cria um recurso do nível gratuito dos serviços de IA do Azure. Cada assinatura tem um limite de cota de um recurso TextAnalytics de camada gratuita. Se você já estiver acima da cota, use --sku S no lugar.

Configurar aplicativo .NET

Clone o repositório de exemplo localmente e implante o aplicativo de exemplo no Serviço de Aplicativo. Substitua <app-name> por um nome exclusivo do aplicativo.

# 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

Definir as configurações e os segredos

  1. Configure os segredos dos serviços de IA do Azure como as configurações de aplicativo 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 navegador, navegue até seu aplicativo de implantação em <app-name>.azurewebsites.net e experimente o detector de idiomas com cadeias de caracteres em vários idiomas.

    Screenshot that shows deployed language detector app in App Service.

    Se você observar o código do aplicativo, notará que a saída de depuração da detecção resulta na mesma cor de fonte que a tela de fundo. Veja isso tentando realçar o espaço em branco diretamente abaixo do resultado.

Proteger a conectividade de back-end

No momento, os segredos de conexão são armazenados como configurações de aplicativo em seu aplicativo do Serviço de Aplicativo. Essa abordagem já está protegendo os segredos de conexão da base de código do seu aplicativo. No entanto, qualquer colaborador que possa gerenciar seu aplicativo também pode ver as configurações do aplicativo. Nesta etapa, você move os segredos de conexão para um cofre de chaves e bloqueia o acesso para que somente você possa gerenciá-lo e somente o aplicativo do Serviço de Aplicativo possa lê-lo usando sua identidade gerenciada.

  1. Crie um cofre da chave. Substitua <vault-name> por um nome exclusivo do aplicativo.

    # 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 parâmetro --enable-rbac-authorization define o --enable-rbac-authorization. Por padrão, essa configuração invalida todas as permissões de políticas de acesso.

  2. Atribua a si mesmo a função RBAC Responsável pelos segredos do Key Vault no 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. Habilite a identidade gerenciada atribuída pelo sistema para seu aplicativo e dê a ela a função RBAC Usuário de Segredos do Key Vault no cofre.

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

    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. Antes, você definia os segredos como configurações de aplicativo CS_ACCOUNT_NAME e CS_ACCOUNT_KEY em seu aplicativo. Agora, as defina 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 navegador, navegue até <app-name>.azurewebsites.net novamente. Se obtiver de volta os resultados de detecção, você estará se conectando ao ponto de extremidade dos serviços de IA do Azure com referências do cofre de chaves.

Parabéns. Seu aplicativo agora está se conectando aos serviços de IA do Azure usando segredos mantidos no seu cofre de chaves, sem nenhuma alteração no código do seu aplicativo.

Limpar os recursos

Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:

az group delete --name $groupName

Esse comando pode demorar um pouco para ser executado.

Próximas etapas