无法使用用户分配的身份从Azure Key Vault获取秘密

时间:2019-06-10 22:23:47

标签: azure-keyvault azure-authentication azure-managed-identity

我通过检查ElasticAPV2.xts中的ComputerResourceGroupInfo.json将msi添加到了VMSS中,我有:

"ManagedServiceIdentityConfig": {
          "Type": "SystemAssigned, UserAssigned",
          "**UserAssignedIdentities**": [
            "/subscriptions/1234567890qwer/resourceGroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-msi"
          ],
          "ServicePrincipalForSystemAssignedIdentity": "...",
          "ScaleSetIdentity": {
            "principalId": "...",
            "tenantId": "...",
            "type": "SystemAssigned, UserAssigned",
            "**userAssignedIdentities**": {
              "/subscriptions/1234567890qwer/resourceGroups/my-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-msi": {
                "principalId": "...",
                "clientId": "..."
              }

my-msi也通过List and Get添加到Azure Key Vault访问策略中。

在VM中,尝试使用以下方法获取机密

PS D:\ManagementServiceCommonSetup> $accessToken = (Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net' -Method GET -Headers @{Metadata="true"} -UseBasicParsing | ConvertFrom-Json).access_token
PS D:\ManagementServiceCommonSetup> echo $accessToken
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkN0ZlFDOExlLThOc0M3b0MyelFrWnBjcmZP...MCQi-bPCJQ
PS D:\ManagementServiceCommonSetup> (Invoke-WebRequest -Uri https://my-kv.vault.azure.net/certificates/my-cert/587898f2?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $accessToken"}).content
Invoke-WebRequest : {"error":{"code":"Forbidden","message":"Access denied","innererror":{"code":"AccessDenied"}}}
At line:1 char:2
+ (Invoke-WebRequest -Uri https://my-kv.vault.azure.net/secrets/my-cert/ ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

我的问题:

  1. 这是通过以下方式使用访问令牌检索证书的正确方法 用户分配的身份?
  2. 为什么访问被拒绝?我的理解是这里不需要访问控制(IAM),因为我已经在访问策略中添加了msi。

更新

对于用户分配的身份,需要指定对象ID或客户端ID。

Invoke-WebRequest -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net&object_id=$($ObjectId)" -Method GET -Headers @{Metadata="true"}

3 个答案:

答案 0 :(得分:2)

  

1。这是通过用户分配的身份使用访问令牌检索证书的正确方法吗?

不,您使用的Uri是get secret,如果您想获得证书,应该是

Invoke-WebRequest -Uri https://my-kv.vault.azure.net/certificates/my-cert/587898f2?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $accessToken"}

参考:Get Certificate - Get Certificate

  

2。为什么访问被拒绝?我的理解是这里不需要访问控制(IAM),因为我已经在访问策略中添加了msi。

您的理解是正确的。再次在Access policies中对其进行检查,确保已给定Certificate permissions(也可以尝试Select all,这很方便)。

enter image description here

更新

我在Windows vm中对其进行测试,在vmss中,逻辑应该相同,doc of VM and VMSS to access the keyvault在一起。

如果我使用system-assigned identity进行测试,则效果很好。如果我用user-assigned managed identity测试,也会收到403错误。

user-assigned managed identity是一项预览功能,我不确定它是否支持访问密钥保险库,该文档仅适用于system-assigned identity。因此,我建议您使用system-assigned identity来访问密钥库,可以尝试一下。

$response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -Method GET -Headers @{Metadata="true"} -UseBasicParsing
$content = $response.Content | ConvertFrom-Json 
$KeyVaultToken = $content.access_token 
(Invoke-WebRequest -Uri https://<keyvault-name>.vault.azure.net/certificates/<{certificate-name}>/<certificate-version>?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $KeyVaultToken"} -UseBasicParsing).content 

系统分配的身份

enter image description here

用户分配的托管身份

enter image description here

答案 1 :(得分:0)

对于用户分配的身份,需要指定对象ID或客户端ID。

 Invoke-WebRequest -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net&object_id=$($ObjectId)" -Method GET -Headers @{Metadata="true"}

答案 2 :(得分:0)

@Daolin,我测试了使用UserManagedIdentity向AAD请求访问令牌的相同方案。

以下cmd对我有用:

$response1 = Invoke-WebRequest -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/&object_id=xxxxxx-xxxx-xxxx-xxxxx-xxxxx" -UseBasicParsing -Method GET -Headers @{Metadata="true"}   

现在,对象是PrincipalID / ObjectID。 ClientID对我不起作用。对于我的情况,我正在使用同时启用了SystemManagedIdentity和UserManagedIdentity的Azure VM。因此,当我使用clientID作为查询参数来请求访问令牌时,它会向我颁发一个访问令牌,其中包含系统管理身份的objectID。