Azure KeyVault Vm扩展和MSI

时间:2019-01-31 17:00:03

标签: identity azure-keyvault

背景

我们的应用程序位于.Net核心中。我们使用Service Fabric进行群集管理。 我们有多个VM规模集。 我们在应用程序启动期间使用MSI。该代码已经运行了6个月以上。我们在此link中使用代码作为概述来获取访问令牌。

问题:

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

我们按照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
  }
}

在服务启动时获得访问令牌的错误是-

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正常工作的帮助都将非常有用。

谢谢。

1 个答案:

答案 0 :(得分:0)

Azure资源可能具有系统或用户分配的托管身份。 VMSS支持两种类型,也可以将它们混合使用。 IMDS(上面显示的元数据端点:http://169.254.169.254/metadata/identity/oauth2/token?..。)接受指定一个AAD客户端ID,该ID代表呼叫者想要承担/模拟的身份。如果提供注释,则IMDS的行为/响应取决于与VMSS关联的受管理身份的类型和数量。

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

由于您指定了'requireInitialSync'标志,因此KVVM扩展程序将在首次运行时(在VMSS启动期间执行)被阻止,直到能够检索到指定的机密为止。无法获得令牌会导致无法检索机密,这将导致VM代理无限期地等待安装KVVM扩展程序……等等。

您提到了Service Fabric-为Azure Service Fabric群集启用证书翻转的端到端步骤如下(首先是高层,之后是详细步骤): -使用用户分配的身份 -在ACL之前将保管箱的身份 -使用“ requireInitialSync”声明KVVM扩展名 -在KVVM扩展名为'provisionAfter'的情况下声明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'属性以及证书声明(按主题公用名。)