identity - Azure KeyVault Vm 扩展和 MSI

标签 identity azure-keyvault

背景

我们的应用程序在 .Net 核心中。我们使用 Service Fabric 进行集群管理。
我们有多个 VM 规模集。
我们在应用程序启动期间使用 MSI。该代码已运行超过 6 个月。我们在此 link 中使用代码作为大纲获取访问 token 。

问题:

最近,我们向 VM 规模集添加了 Azure KVVM 扩展。这样做是为了从 KeyVault 获取自动更新的集群证书。
进行此更改后,我们的应用程序无法获取访问 token 。

我们按照 Service Fabric 团队的建议在我们的 Service Fabric ARM 部署模板中添加了 KVVM 扩展。部署通过,我们看到我们的 VMSS 处于良好状态。

VMSS 中的 KVVm 设置如下所示 -
0.2版

{
  "secretsManagementSettings": {
    "pollingIntervalInS": "86400",
    "observedCertificates": [
      "https://azsc-eu-padev1.vault.azure.net/secrets/clusterCertificate"
    ],
    "requireInitialSync": true
  }
}

我们在服务启动时获取访问 token 的错误是这样的 -
Failed to get configuration key vault access token. Request to http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&client_id=2eabacbd-4fb2-4d7c-b3ab-b4e3fc7a53e7&resource=https://vault.azure.net failed with BadRequest: StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.HttpConnection+HttpConnectionResponseContent, Headers:
{
Server: Microsoft-IIS/10.0
Date: Thu, 31 Jan 2019 01:24:03 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 68
}

VMSS 显示错误
Provisioning of VM extension 'KVVMExtension' has timed out. Extension installation may be taking too long, or extension status could not be obtained.

关于如何让 KVVM 扩展和 MSI 正常工作的任何帮助都会很棒。

谢谢一堆。

最佳答案

Azure 资源可能具有系统或用户分配的托管标识。 VMSS 支持这两种类型,也支持混合使用。 IMDS(上面显示的元数据端点:http://169.254.169.254/metadata/identity/oauth2/token?..。)接受指定一个 AAD 客户端 ID,代表调用者想要假设/模拟的身份。如果提供了说明,则来自 IMDS 的行为/响应取决于与 VMSS 关联的托管身份的类型和数量。

早期版本的 KV VM 扩展仅支持“隐式”模型 - 无法在扩展设置中指定客户端 ID,因此对 IMDS 的出站调用失败。

由于您指定了 'requireInitialSync' 标志,KVVM 扩展将在第一次运行时阻塞 - 在 VMSS 启动期间执行 - 直到它能够检索指定的 secret 为止。无法获得 token 会导致无法检索 secret ,这会阻止并导致 VM 代理无限期地等待安装 KVVM 扩展……等等。

您提到了 Service Fabric - 为 Azure Service Fabric 群集启用证书轮转的端到端步骤如下(首先是高级,然后是详细步骤):
- 使用用户分配的身份
- 预 ACL 到保险库的身份
- 使用“requireInitialSync”声明 KVVM 扩展
- 使用 'provisionAfter' KVVM ext 声明 SFVM 扩展

相关模板摘录:
- 声明 UAI(在“资源”下):

`{
  "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
  "name": "[parameters('userAssignedIdentityName')]",
  "apiVersion": "2018-11-30",
  "location": "[resourceGroup().location]"
},`
  • 授予 UAI 访问保管库的权限:
  • { "type": "Microsoft.KeyVault/vaults/accessPolicies", "name": "[concat(parameters('keyVaultName'), '/add')]", "apiVersion": "2018-02-14", "properties": { "accessPolicies": [ { "tenantId": "[reference(variables('userAssignedIdentityResourceId'), '2018-11-30').tenantId]", "objectId": "[reference(variables('userAssignedIdentityResourceId'), '2018-11-30').principalId]", "dependsOn": [ "[variables('userAssignedIdentityResourceId')]" ], "permissions": { "secrets": [ "get", "list" ] } } ] } },
  • 将 UAI 分配给 VMSS:
    "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[variables('userAssignedIdentityResourceId')]": {} } },
  • 分别声明 KV 和 SF VM 扩展(在“virtualMachineProfile”\“extensionProfile”\“extensions”下):
  • { "name": "KVVMExtension", "properties": { "publisher": "Microsoft.Azure.KeyVault", "type": "KeyVaultForWindows", "typeHandlerVersion": "1.0", "autoUpgradeMinorVersion": true, "settings": { "secretsManagementSettings": { "pollingIntervalInS": "[parameters('kvvmextPollingInterval')]", "linkOnRenewal": false, "observedCertificates": "[parameters('kvvmextObservedCertificates')]", "requireInitialSync": true } } } },
    并且,对于 SF(缩写):
    { "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]", "properties": { "type": "ServiceFabricNode", "autoUpgradeMinorVersion": true, "provisionAfterExtensions" : [ "KVVMExtension" ], "settings": { "certificate": { "commonNames": [ "[parameters('certificateCommonName')]" ], "x509StoreName": "[parameters('certificateStoreValue')]" } }, "typeHandlerVersion": "1.0" }
    请注意“provisionAfter”属性以及证书声明(按主题通用名称)。

    关于identity - Azure KeyVault Vm 扩展和 MSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54465668/

    相关文章:

    azure - 如何通过二头肌脚本将身份提供者添加到应用程序服务?

    sybase - 将现有的 int 列更改为 sybase 中的标识

    identity - dbt - 如何创建表创建自动增量列

    c# - 如何调试 ProtectKeysWithAzureKeyVault?

    azure - 存储来自 Azure Function 的访问 token

    authentication - 无需登录即可识别网站用户?

    python - python 列表是否具有用于测试身份的 __contains__ 的等价物?

    azure - 从现有 azure 资源访问系统分配的托管身份的主体 ID

    azure-keyvault - 将 Azure Key Vault 升级到高级 SKU

    azure - 如何将 Azure Devops 库链接到 KeyVault