Не удалось получить секрет из хранилища ключей Azure, используя назначенную пользователем идентификационную информацию - PullRequest
1 голос
/ 11 июня 2019

Я добавил MSI в VMSS, проверив ComputerResourceGroupInfo.json в ElasticAPV2.xts, у меня есть:

"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 также добавлен в политику доступа к хранилищу ключей Azure с помощью List и Get.

В ВМ пытались получить секрет, используя

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 для политик доступа.

Обновление :

Для назначенного пользователем удостоверения необходимоуказать идентификатор объекта или идентификатор клиента.

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 ]

2 голосов
/ 11 июня 2019

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, это удобно).

enter image description here

Обновление:

Я тестирую его в Windows vm, в vmss логика должна быть такой же, документ для VM и VMSS для доступа к keyvault вместе.

И если я тестирую с system-assigned identity, он работает нормально. Если я проверяю его с user-assigned managed identity, я также получаю ошибку 403.

user-assigned managed identity - это функция Preview , я не уверен, поддерживает ли она доступ к keyvault, документ предназначен только для system-assigned identity. Поэтому я рекомендую вам использовать system-assigned identity для доступа к keyvault, вы можете попробовать.

$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

0 голосов
/ 12 июня 2019

Для идентификатора, назначенного пользователем, необходимо указать идентификатор объекта или идентификатор клиента.

 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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...