我有一个由 azure 为 Linux 容器的 Web 应用程序生成的私有证书。我想通过 azure 门户中的 Web 应用程序配置设置将此值传递给我的 .net core 应用程序。这是管道 CI-CD 流程的一部分,在应用程序配置中指定 Identity Server 键值的能力有助于将这些值排除在源代码之外。
我通过设置不断收到以下错误
❌密钥保管库参考
我正在尝试使用此处微软文档建议的格式的秘密值 我尝试过以下格式:
@Microsoft.KeyVault(https://myvault.vault.azure.net/secrets/myCertName/versionGUID)
@Microsoft.KeyVault(VaultName=myvault;SecretName=myCertName;SecretVersion=versionGUID)
另外,我已将 Web 应用程序添加到 azure Key Vault 的访问策略中
存在格式错误,并且我的秘密名称错误,因此以下格式有效:
@Microsoft.KeyVault(https://myvault.vault.azure.net/secrets/myCertName/versionGUID)
但是我遇到了一个新错误:
无法解析 Key Vault 参考,因为站点托管 身份未启用 MSINotEnabled
所以我转到 Web 应用程序的“身份”选项卡,并打开该应用程序的托管身份。
我现在遇到以下错误:
无法解析 Key Vault 参考,因为站点已关闭 拒绝访问 Key Vault 参考的保管库。
我发现多个网站表示,如果您刚刚删除设置并保存,然后将设置添加回来,它应该可以解决。这对我不起作用。
我还尝试在 Azure Key Vault 访问策略中授予对 Web 应用程序的“完全访问权限”。
首先,参考格式
@Microsoft.KeyVault(https://myvault.vault.azure.net/secrets/myCertName/versionGUID)
错误,应该是@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/myCertName/versionGUID)
。
其次,我认为您没有正确授予网络应用程序的 MSI 权限。
根据您的原帖中的描述:
另外,我已将 Web 应用程序添加到 azure Key Vault 的访问策略中
然后在您的编辑1中:
所以我转到网络应用程序的身份选项卡,并打开应用程序的托管身份。
显然顺序是错误的,如果你之前没有启用应用程序的MSI,你如何将其添加到访问策略中?我想你可能加错了。
因此,就您的情况而言,请确保您已将 Web 应用程序的 MSI 正确添加到访问策略中。
1.导航到网络应用程序 ->
Identity
-> 复制 Object ID
(另请确保您使用的是系统分配的 MSI,keyvault 参考功能不支持用户分配的 MSI)
2.然后在密钥库的
Access policies
中 -> Add Access Policy
-> 在步骤 1 中搜索 Object ID
并使用 Get
Secret 权限添加它,如下所示 -> 选择并保存。
3.导航到应用程序并检查它,它工作正常。
您的应用程序应该能够访问 Key Vault 以成功解析引用。如果其他所有内容(例如访问策略和语法)似乎都正常,但您的引用无法解析,请尝试检查您的 Key Vault 是否有任何网络限制。
如果您在 Vault 的访问策略设置页面上看到与“网络访问控制”相关的警告,则需要允许应用程序的 IP 通过 Key Vault 防火墙。
将应用程序的 IP(在自定义域下可用)添加到 Key Vault 的防火墙(在网络下)。
如果是用户管理的身份,我们需要打补丁才能使其正常工作
userAssignedIdentityResourceId=$(az identity show -g MyResourceGroupName -n MyUserAssignedIdentityName --query id -o tsv)
appResourceId=$(az webapp show -g MyResourceGroupName -n MyAppName --query id -o tsv)
az rest --method PATCH --uri "${appResourceId}?api-version=2021-01-01" --body "{'properties':{'keyVaultReferenceIdentity':'${userAssignedIdentityResourceId}'}}"
我在通过 terraform 创建资源时面临同样的问题。
我还为 azure 功能应用程序添加了密钥保管库访问策略,问题就消失了。
以下部分仅适用于正在做 terraform 的人。
我的配置看起来像这样,
resource "azurerm_key_vault_access_policy" "resource_group_manager" {
key_vault_id = module.key_vault_info.key_vault_id
tenant_id = data.azurerm_client_config.current.tenant_id
object_id = data.azuread_group.manager.id
key_permissions = [ "Get", "List", "Create", "Update", "Delete", ]
secret_permissions = [ "Get", "List", "Set", "Delete", ]
}
我仅针对 azure 资源组 添加了密钥保管库访问策略 但不适用于天蓝色功能。
为了解决这个问题,
我还为 azure 功能应用程序添加了密钥保管库访问策略
像下面这样,
resource "azurerm_key_vault_access_policy" "resource_group_manager" {
key_vault_id = module.key_vault_info.key_vault_id
tenant_id = data.azurerm_client_config.current.tenant_id
object_id = data.azuread_group.manager.id
key_permissions = [ "Get", "List", "Create", "Update", "Delete", ]
secret_permissions = [ "Get", "List", "Set", "Delete", ]
}
resource "azurerm_key_vault_access_policy" "this" {
key_vault_id = module.key_vault_info.key_vault_id
tenant_id = data.azurerm_client_config.current.tenant_id
object_id = azurerm_function_app.this.identity.0.principal_id
key_permissions = [ "Get", "List", "Create", "Update", "Delete", ]
secret_permissions = [ "Get", "List", "Set", "Delete", ]
}
从 azurerm terraform 提供程序版本 3.100.0 开始,不要忘记设置属性
key_vault_reference_identity_id
:
resource "azurerm_windows_web_app" "main" {
key_vault_reference_identity_id = azurerm_user_assigned_identity.main.id
app_settings = {
"MySecretSetting" = "@Microsoft.KeyVault(VaultName=${local.vault_name};SecretName=${local.secret_name})"
}
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.main.id]
}
}