Share via


Tutorial: Proteger a ligação dos Serviços Cognitivos a partir de Serviço de Aplicações PHP 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 os 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 requerem 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 tiver terminado, tem uma aplicação que faz chamadas programáticas para os serviços de IA do Azure, sem armazenar segredos de ligação dentro 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 dos Serviços de Aplicações.

Diagrama de arquitetura para o cenário de tutorial.

Com esta arquitetura:

  • A conectividade ao Key Vault está protegida por identidades geridas
  • Serviço de Aplicações acede aos segredos através de referências Key Vault como definições da aplicação.
  • O acesso ao cofre de chaves está restrito à aplicação. Os contribuidores da aplicação, 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 aos 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

Preparar o 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. Crie 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 do Azure AI de escalão gratuito. Cada subscrição está limitada a uma quota de um recurso de escalão TextAnalytics gratuito. Se já tiver ultrapassado a quota, utilize --sku S em vez disso.

Configurar a aplicação PHP

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.

# Clone and prepare sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/php
zip default.zip index.php

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

az appservice plan create --resource-group $groupName --name $appName --sku FREE --location $region
az webapp create --resource-group $groupName --plan $appName --name $appName
az webapp deployment source config-zip --resource-group $groupName --name $appName --src ./default.zip

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

  1. Configure os segredos dos serviços de IA do Azure como definições CS_ACCOUNT_NAME da aplicação 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ã a mostrar a aplicação de detetor de idioma implementada no Serviço de Aplicações.

    Se observar o código da aplicação, poderá reparar na saída de depuração para os 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.

Proteger a conectividade de back-end

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 o possa gerir e apenas a aplicação Serviço de Aplicações o possa ler 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 próprio 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 voltar a obter os resultados da deteção, 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 guardados 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