如何通过ARM模板将Azure KeyVault机密配置到同资源组App Service
实现方案
你可以通过ARM模板原生能力完成配置,全程不需要手动拷贝机密值,优先使用App Service原生Key Vault引用方案,避免机密明文泄露。
前置配置(必须完成,否则权限不足无法读取机密)
- 为App Service开启系统分配托管标识,在App Service的资源定义中添加如下配置段:
"identity": { "type": "SystemAssigned" }, "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', variables('vault').name)]" ]
- 在Key Vault资源的访问策略(
properties.accessPolicies数组)中,为上述App Service的托管标识分配机密读取权限:
{ "objectId": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-03-01', 'Full').identity.principalId]", "tenantId": "[subscription().tenantId]", "permissions": { "secrets": ["get"] } }
将代码里的variables('appServiceName')替换为你模板中定义的App Service名称变量即可,同资源组下不需要额外写全资源路径。
配置App Settings取值
直接在你之前的siteConfig.appSettings段中,使用Key Vault引用格式填写value即可,最终配置如下:
"siteConfig": { "appSettings": [ { "name": "COSMOS_CONNECTION_STRING", "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId('Microsoft.KeyVault/vaults/secrets', variables('vault').name, 'mongodb')).secretUri, ')')]" } ] }
注意事项
- 上述写法默认拉取Key Vault中
mongodb机密的最新启用版本,如果需要绑定固定版本,可以在secretUri后拼接/<你的机密版本号>即可 - 不要使用
listSecrets()类函数直接拉取机密明文填入appSettings,该方式会将连接字符串明文存储在ARM部署记录、App Service配置历史中,存在明确的泄露风险 - 如果你的Key Vault开启了公网访问限制,需要将App Service与Key Vault部署在同一可连通的VNet中,否则App Service运行时无法拉取机密值
- 部署时确认ARM模板的部署身份拥有Key Vault的机密读取权限,否则模板校验阶段就会报错
内容的提问来源于stack exchange,提问作者steve238
相关产品推荐
相关产品推荐

