你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:通过 Key Vault 在 Python 应用服务中实现认知服务连接的安全性

Azure 应用服务 可以使用 托管标识 在没有连接字符串的情况下连接到后端服务。 此方法消除了连接机密,使您无需在生产环境中管理它们,从而确保后端连接的安全。 完成后,你有一个应用,无需在应用服务中存储任何连接机密即可对 Foundry 工具进行编程调用。

对于不支持托管标识且仍需要连接机密的后端服务,可以使用 Azure Key Vault 来管理连接机密。 本教程以 Foundry 工具为例。 完成后,你有一个应用,无需在应用服务中存储任何连接机密即可对 Foundry 工具进行编程调用。

提示

Foundry 工具 支持通过托管标识进行身份验证。 本教程使用 订阅密钥身份验证 来演示如何连接到不支持应用服务的托管标识的 Azure 服务。

显示用户连接到服务的示意图,该服务随后连接到密钥保管库以访问认知服务。

在此体系结构中:

  • 托管标识可保护与密钥保管库的连接。
  • 应用服务使用 Key Vault 引用 作为应用设置来访问机密。
  • 仅限该应用访问密钥保管库。 应用参与者(如管理员)可能完全控制应用服务资源,同时无权访问 Key Vault 机密。
  • 如果你的应用程序代码可以通过应用设置访问连接机密,则无需进行任何更改。

在本教程中,学习以下内容:

  • 启用托管身份
  • 使用托管标识连接到Key Vault
  • 使用 Key Vault 引用
  • Access Foundry 工具

先决条件

为Azure CLI准备环境。

创建连接到 Foundry 工具的应用

  1. 创建一个资源组以包含你的所有资源:

    # Save the resource group name as a variable for convenience
    groupName=myKVResourceGroup
    region=canadacentral
    
    az group create --name $groupName --location $region
    
  2. 创建 Foundry Tools 资源。 将 cs-resource-name< 替换为>唯一名称。

    # Save the resource name as a 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
    

    注意

    --sku F0 创建免费层 Foundry 工具资源。 每个订阅限定一个免费等级 TextAnalytics 资源的配额。 如果已使用配额,请改用 --sku S

配置Python应用

在本地克隆示例存储库,并将示例应用程序部署到应用服务。 将 <app-name> 替换为唯一的名称。

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

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

az appservice plan create --resource-group $groupName --name $appName --sku FREE --location $region --is-linux
az webapp create --resource-group $groupName --plan $appName --name $appName --runtime "python:3.14"
az webapp config appsettings set --resource-group $groupName --name $appName --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
az webapp deploy --resource-group $groupName --name $appName --src-path ./default.zip

前面的命令:

  • 创建 Linux 应用服务计划
  • 创建 Python Web 应用
  • 配置 Web 应用以在部署上安装 Python 包
  • 上传 zip 文件并安装 Python 包

将机密配置为应用设置

  1. 将 Foundry Tools 的机密配置为应用设置 CS_ACCOUNT_NAMECS_ACCOUNT_KEY

    # Get the subscription key for the Foundry Tools 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. 在浏览器中,访问已部署的应用程序,网址为 <app-name>.azurewebsites.net。 通过输入各种语言的字符串来尝试语言检测器。

    显示应用服务中已部署的语言检测器应用的屏幕截图。

    如果查看应用程序代码,检测结果的调试输出可能与背景的字体颜色相同。 可以通过在结果下方选择空白区域来查看输出。

保护后端连接

连接机密现在作为应用设置存储在应用服务应用中。 此方法已有保护应用程序代码库中的连接机密。 但是,任何可以管理你的应用的参与者也能看到应用设置。 在本部分中,将连接机密移动到密钥保管库。 锁定访问权限,以便只有你可以管理它,并且只有应用服务应用可以使用其托管标识读取它。

  1. 创建密钥保管库。 将 <vault-name> 替换为唯一名称。

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

    --enable-rbac-authorization 参数 将 Azure 基于角色的访问控制(RBAC)设置为权限模型。 默认情况下,此设置会使所有访问策略权限失效。

  2. 为你自己分配对保管库的“密钥保管库机密主管”RBAC 角色。

    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. 为应用启用系统分配的托管标识,并为其分配对保管库的“密钥保管库机密用户”RBAC 角色。

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. 将 Foundry Tools 资源名称和订阅密钥作为机密添加到保管库,并将其 ID 保存为下一步的环境变量。

    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. 前面你已在应用中将机密设置为 CS_ACCOUNT_NAMECS_ACCOUNT_KEY 应用设置。 现在,请改为将它们设置为密钥保管库引用

    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. 在浏览器中,再次转到 <app-name>.azurewebsites.net 。 如果获取到检测结果,则通过密钥库引用连接到 Foundry Tools 终结点。

恭喜,你的应用现在使用密钥保管库中保存的机密连接到 Foundry 工具,并且你没有对应用程序代码进行任何更改。

清理资源

在前面的步骤中,你在资源组中创建Azure资源。 如果将来不需要这些资源,请通过在Cloud Shell中运行以下命令删除资源组:

az group delete --name $groupName

运行此命令可能需要一分钟时间。