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.
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.
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, confira Início Rápido para Bash no Azure Cloud Shell.
Se preferir executar os comandos de referência da CLI localmente, instale a CLI do Azure. Para execuções no Windows ou no macOS, considere executar a CLI do Azure em um contêiner do Docker. Para obter mais informações, confira Como executar a CLI do Azure em um contêiner do Docker.
Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para ver outras opções de entrada, confira Conectar-se com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.
Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.
Criar um aplicativo com conectividade com os serviços de IA do Azure
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
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 recursoTextAnalytics
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
Configure os segredos dos serviços de IA do Azure como as configurações de aplicativo
CS_ACCOUNT_NAME
eCS_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"
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.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.
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.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
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"
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)
Antes, você definia os segredos como configurações de aplicativo
CS_ACCOUNT_NAME
eCS_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)"
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.