1

通过检查 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 和 Get 添加到 Azure Key Vault 访问策略。

在虚拟机中,尝试使用

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"}
4

3 回答 3

2

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

不,你使用的Uri是用来获取机密的,如果你想获取证书,应该是

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

参考: 获取证书 - 获取证书

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

你的理解是对的。再检查Access policies一遍,确保你已经给了Certificate permissions(你也可以试试Select all,很方便)。

在此处输入图像描述

更新:

我在windows vm中测试,在vmss中,逻辑应该是一样的,VM和VMSS访问keyvault的doc是一起的。

如果我用 a 测试system-assigned identity,它工作正常。如果我用 a 测试它user-assigned managed identity,我也会收到 403 错误。

user-assigned managed identity是一个预览功能,我不确定它是否支持访问 keyvault,该文档仅适用于system-assigned identity. 所以我推荐你使用system-assigned identitykeyvault来访问,你可以试试。

$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 

系统分配的身份

在此处输入图像描述

用户分配的托管标识

在此处输入图像描述

于 2019-06-11T01:20:02.840 回答
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"}
于 2019-06-12T17:20:50.403 回答
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。

于 2019-12-04T09:30:20.190 回答