Tutorial: Proteger la conexión de Cognitive Service desde PHP App Service mediante Key Vault
Azure App Service puede utilizar identidades administradas para conectarse a servicios back-end sin una cadena de conexión, lo que elimina los secretos de conexión para administrar y mantiene la conectividad de back-end segura en un entorno de producción. En el caso de los servicios back-end que no admiten identidades administradas y que todavía requieren secretos de conexión, puede usar Key Vault para administrar los secretos de conexión. En este tutorial se utilizan los servicios de Azure AI como ejemplo para mostrar cómo se hace en la práctica. Cuando haya terminado, tendrá una aplicación que realiza llamadas mediante programación a los servicios de Azure AI, sin almacenar secretos de conexión dentro de App Service.
Sugerencia
Los servicios de Azure AI admiten la autenticación a través de identidades administradas, pero en este tutorial se usa la autenticación de clave de suscripción para demostrar cómo podría conectarse a un servicio de Azure que no admite identidades administradas desde App Services.
Con esta arquitectura:
- La conectividad con Key Vault está protegida por identidades administradas
- App Service accede a los secretos mediante referencias Key Vault como valores de la aplicación.
- El acceso al almacén de claves está restringido a la aplicación. Los colaboradores de la aplicación, como los administradores, pueden tener un control completo de los recursos de App Service y, al mismo tiempo, no tienen acceso a los secretos de Key Vault.
- Si el código de la aplicación ya tiene acceso a los secretos de conexión con los valores de la aplicación, no se requiere ningún cambio.
Lo qué aprenderá:
- Habilitar identidades administradas
- Uso de identidades administradas para conectarse a Key Vault
- Uso de referencias de Key Vault
- Acceso a los servicios de Azure AI
Requisitos previos
Prepare el entorno para la CLI de Azure.
Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Inicio rápido para Bash en Azure Cloud Shell.
Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure. Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un contenedor de Docker.
Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.
En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.
Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.
Creación de una aplicación con conectividad a los servicios de Azure AI
Cree un grupo de recursos que contenga todos los recursos:
# Save resource group name as variable for convenience groupName=myKVResourceGroup region=westeurope az group create --name $groupName --location $region
Cree un recurso de servicios de Azure AI. Reemplace <cs-resource-name> por un nombre único de su elección.
# 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
crea un recurso de servicios de Azure AI de nivel gratuito. Cada suscripción está limitada a una cuota de un recursoTextAnalytics
gratuito. Si ya supera la cuota, use--sku S
en su lugar.
Configure PHP app (Configuración de una aplicación de PHP)
Clone el repositorio de ejemplo localmente e implemente la aplicación de ejemplo en App Service. Reemplace <app-name> por un nombre de aplicación único.
# 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 deploy --resource-group $groupName --name $appName --src-path ./default.zip
Configuración de secretos como configuración de la aplicación
Configure los secretos de los servicios de Azure AI como valores de la aplicación
CS_ACCOUNT_NAME
yCS_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"
En el explorador, vaya a la aplicación de implementación en
<app-name>.azurewebsites.net
y pruebe el detector de idioma con cadenas en varios idiomas.Si mira el código de la aplicación, puede observar que la salida de depuración de los resultados de la detección tiene el mismo color de fuente que el fondo. Puede verlo intentando resaltar el espacio en blanco directamente debajo del resultado.
Conectividad de back-end segura
En este momento, los secretos de conexión se almacenan como configuración de la aplicación en la aplicación App Service. Este enfoque ya está protegiendo los secretos de conexión desde el código base de la aplicación. Sin embargo, cualquier colaborador que pueda administrar la aplicación también puede ver los valores de la aplicación. En este paso, moverá los secretos de conexión a un almacén de claves y bloqueará el acceso para que solo pueda administrarlo y para que solo la aplicación App Service pueda leerlo mediante su identidad administrada.
Cree un almacén de claves. Reemplace <vault-name> por un nombre de aplicación único.
# 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
El
--enable-rbac-authorization
parámetro--enable-rbac-authorization
. Esta configuración invalida de manera predeterminada todos los permisos de las directivas de acceso.Otórguese a sí mismo el rol RBAC de Agente de secretos de Key Vault para el almacén.
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 la identidad administrada asignada por el sistema para la aplicación y asígnele el rol RBAC de usuario de secretos de Key Vault para el almacén.
az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role "Key Vault Secrets User"
Agregue el nombre del recurso de los servicios de Azure AI y la clave de suscripción como secretos al almacén y guarde sus identificadores como variables de entorno para el paso siguiente.
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)
Anteriormente, los secretos se establecen como valores de la aplicación
CS_ACCOUNT_NAME
yCS_ACCOUNT_KEY
en la aplicación. Ahora, en su lugar, defínalos como referencias del almacén de claves.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)"
En el explorador, vuelva a navegar a
<app-name>.azurewebsites.net
. Si obtiene los resultados de la detección, se conectará al punto de conexión de los servicios de Azure AI con referencias del almacén de claves.
Enhorabuena, la aplicación se está conectando a los servicios de Azure AI mediante secretos guardados en el almacén de claves, sin cambios en el código de la aplicación.
Limpieza de recursos
En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:
az group delete --name $groupName
Este comando puede tardar varios segundos en ejecutarse.