背景
我们的应用程序位于.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正常工作的帮助都将非常有用。
谢谢。
答案 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]"
},`
{
"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'属性以及证书声明(按主题公用名。)