Как установить политики доступа к Key Vault с помощью Pulumi?

Я пытаюсь настроить инфраструктуру Azure с помощью Pulumi. Пока я использовалpulumi preview команда, и кажется, что большинство вещей на месте.

Мне удалось разобраться в большинстве вещей, но не в частях, связанных с Azure AD.

Например, следующий код работает:

var group = Output.Create(
    GetGroup.InvokeAsync(
        new GetGroupArgs
        {
            Name = "Administrators 2"
        }));
var tenantId = config.Apply(c => c.TenantId);
var keyVault = new KeyVault(
    name,
    new KeyVaultArgs
    {
        ResourceGroupName = resourceGroup.Name,
        EnabledForDeployment = true,
        EnabledForTemplateDeployment = true,
        PurgeProtectionEnabled = true,
        SkuName = "standard",
        TenantId = tenantId,
        AccessPolicies = new KeyVaultAccessPolicyArgs[]
        {
            // <------------------------ Nothing here and it works.
        }
    });

Но приведенный ниже код не работает.

var group = Output.Create(
    GetGroup.InvokeAsync(
        new GetGroupArgs
        {
            Name = "Administrators 2"
        }));
var tenantId = config.Apply(c => c.TenantId);
var keyVault = new KeyVault(
    name,
    new KeyVaultArgs
    {
        ResourceGroupName = resourceGroup.Name,
        EnabledForDeployment = true,
        EnabledForTemplateDeployment = true,
        PurgeProtectionEnabled = true,
        SkuName = "standard",
        TenantId = tenantId,
        AccessPolicies = new KeyVaultAccessPolicyArgs[]
        {
            new KeyVaultAccessPolicyArgs // <--- When I add this, it stops working.
            {
                SecretPermissions = new[] { "get", "list" },
                ObjectId = group.Apply(g => g.ObjectId),
                TenantId = tenantId
            }
        }
    });

ошибка

ошибка: ошибка получения идентификатора аутентифицированного объекта: ошибка синтаксического анализа результата json из Azure CLI: ошибка ожидания Azure CLI: статус выхода 2

Какой json?... Я подозревал, что у субъекта-службы недостаточно прав для установки этих вещей.

Использование флага --debug

debug: Serialize property[resource:fe-modules-kv-[azure:keyvault/keyVault:KeyVault].accessPolicies.id[0].objectId]: Recursing into Output
error: Running program 'C:\dev\...........\bin\Debug\netcoreapp3.1\Frontend.dll' failed with an unhandled exception:
    Grpc.Core.RpcException: Status(StatusCode=Unknown, Detail="invocation of azuread:index/getGroup:getGroup returned an error: Error getting authenticated object ID: Error parsing json result from the Azure CLI: Error waiting for the Azure CLI: exit status 2")
       at Pulumi.GrpcMonitor.InvokeAsync(InvokeRequest request)
       at Pulumi.Deployment.InvokeAsync[T](String token, InvokeArgs args, InvokeOptions options, Boolean convertResult)
       at Pulumi.Output`1.ApplyHelperAsync[U](Task`1 dataTask, Func`2 func)
       at Pulumi.Output`1.Pulumi.IOutput.GetDataAsync()
       at Pulumi.Serialization.Serializer.SerializeAsync(String ctx, Object prop)
       at Pulumi.Serialization.Serializer.SerializeAsync(String ctx, Object prop)
       at Pulumi.Serialization.Serializer.SerializeDictionaryAsync(String ctx, IDictionary dictionary)
       at Pulumi.Serialization.Serializer.SerializeInputArgsAsync(String ctx, InputArgs args)
       at Pulumi.Serialization.Serializer.SerializeAsync(String ctx, Object prop)
       at Pulumi.Serialization.Serializer.SerializeListAsync(String ctx, IList list)
       at Pulumi.Serialization.Serializer.SerializeAsync(String ctx, Object prop)
       at Pulumi.Serialization.Serializer.SerializeAsync(String ctx, Object prop)
       at Pulumi.Serialization.Serializer.SerializeAsync(String ctx, Object prop)
       at Pulumi.Deployment.SerializeFilteredPropertiesAsync(String label, IDictionary`2 args, Predicate`1 acceptKey)
       at Pulumi.Deployment.PrepareResourceAsync(String label, Resource res, Boolean custom, ResourceArgs args, ResourceOptions options)
       at Pulumi.Deployment.RegisterResourceAsync(Resource resource, ResourceArgs args, ResourceOptions options)
       at Pulumi.Deployment.ReadOrRegisterResourceAsync(Resource resource, ResourceArgs args, ResourceOptions options)
       at Pulumi.Deployment.CompleteResourceAsync(Resource resource, ResourceArgs args, ResourceOptions options, ImmutableDictionary`2 completionSources)
       at Pulumi.Output`1.GetValueAsync()
       at Pulumi.Deployment.Logger.TryGetResourceUrnAsync(Resource resource)
       at Pulumi.Deployment.Runner.WhileRunningAsync()

Часть debug: Serialize property[resource:fe-modules-kv-[azure:keyvault/keyVault:KeyVault].accessPolicies.id[0].objectId]: Recursing into Output говорит нам, что проблема не в арендаторе, но я еще не смог понять достаточно.

Я много искал об этом и убедился, что у моего субъекта-службы есть необходимые роли, чтобы иметь возможность управлять разрешениями пользователей, назначая ему роли User Account Administrator а также Company Administrator. Приведенный ниже сценарий делает это, и я подтвердил это на портале Azure.

Connect-AzureAD -TenantId "0000000000000000000"
$userAccountAdministratorRoleName = "User Account Administrator"
$companyAdministratorRoleName = "Company Administrator"

$userAccountAdministratorRole = Get-AzureADDirectoryRole | Where-Object { $_.displayName -eq $userAccountAdministratorRoleName }

if ($userAccountAdministratorRole -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-AzureADDirectoryRoleTemplate | Where-Object { $_.displayName -eq $userAccountAdministratorRoleName }
    Enable-AzureADDirectoryRole -RoleTemplateId $roleTemplate.ObjectId

    # Fetch User Account Administrator role instance again
    $userAccountAdministratorRole = Get-AzureADDirectoryRole | Where-Object { $_.displayName -eq $userAccountAdministratorRoleName }
}

$companyAdministratorRole = Get-AzureADDirectoryRole | Where-Object { $_.displayName -eq $companyAdministratorRoleName }

if ($companyAdministratorRole -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-AzureADDirectoryRoleTemplate | Where-Object { $_.displayName -eq $companyAdministratorRoleName }
    Enable-AzureADDirectoryRole -RoleTemplateId $roleTemplate.ObjectId

    # Fetch User Account Administrator role instance again
    $companyAdministratorRole = Get-AzureADDirectoryRole | Where-Object { $_.displayName -eq $companyAdministratorRoleName }
}

Write-Host "User account administrator role: $userAccountAdministratorRole"
Write-Host "Company administrator role: $companyAdministratorRole"

$sp = Get-AzureADServicePrincipal -All $true | Where-Object { $_.displayName -eq 'Pulumi' }

Add-AzureADDirectoryRoleMember -ObjectId $userAccountAdministratorRole.ObjectId -RefObjectId $sp.ObjectId
Add-AzureADDirectoryRoleMember -ObjectId $companyAdministratorRole.ObjectId -RefObjectId $sp.ObjectId

Что еще мне не хватает? Или где я могу получить дополнительную информацию?

Кто управляет развертыванием?

Это принципал службы. Согласно файлу Pulumi.yml

config:
  azure:clientId: 0000000000
  azure:clientSecret:
    secure: 000000000000
  azure:location: WestEurope
  azure:subscriptionId: 0000000000
  azure:tenantId: 000000000000000000000000

Приведенный ниже код отладки демонстрирует это.

 debug: Invoke RPC prepared: token=azuread:index/getServicePrincipal:getServicePrincipal, obj={ "objectId": "000000-0000-0000-0000-0000000000" }
    debug: 2020/06/06 17:24:31 Testing if Service Principal / Client Certificate is applicable for Authentication..
    debug: 2020/06/06 17:24:31 Testing if Multi Tenant Service Principal / Client Secret is applicable for Authentication..
    debug: 2020/06/06 17:24:31 Testing if Service Principal / Client Secret is applicable for Authentication..
    debug: 2020/06/06 17:24:31 Using Service Principal / Client Secret for Authentication
    debug: 2020/06/06 17:24:31 Getting OAuth config for endpoint https://login.microsoftonline.com/ with  tenant 000000-877e-440f-b0ba-0000000

Whois запускает развертывание (часть 2)?

Собственно, через несколько сотен строк я нахожу следующее.

    terraform-provider-azurerm/dev pid-222c6c49-1b0a-5959-a213-6608f9eb8820
    debug: AzureRM Request:
    debug: POST /335f20ab-877e-440f-b0ba-d7eabfa258e4/oauth2/token?api-version=1.0 HTTP/1.1
    debug: Host: login.microsoftonline.com
    debug: User-Agent: Go/go1.14.1 (amd64-windows) go-autorest/adal/v1.0.0
    debug: Content-Length: 174
    debug: Content-Type: application/x-www-form-urlencoded
    debug: Accept-Encoding: gzip
    debug:
    debug: client_id=346ead82-d584-4427-b2fa-e54b94ed10cf&client_secret=[secret]&grant_type=client_credentials&resource=https%3A%2F%2Fmanagement.azure.com%2F
    debug: 2020/06/08 08:39:56 Testing if Service Principal / Client Certificate is applicable for Authentication..
    debug: 2020/06/08 08:39:56 Testing if Multi Tenant Service Principal / Client Secret is applicable for Authentication..

    # *** Testing if Service Principal / Client secret
    debug: 2020/06/08 08:39:56 Testing if Service Principal / Client Secret is applicable for Authentication..

    # *** And then it tests Managed Service Identity is applicable? Why?
    debug: 2020/06/08 08:39:56 Testing if Managed Service Identity is applicable for Authentication..

    debug: 2020/06/08 08:39:56 Testing if Obtaining a token from the Azure CLI is applicable for Authentication..
    debug: 2020/06/08 08:39:56 Using Obtaining a token from the Azure CLI for Authentication
    debug: AzureRM Response for https://login.microsoftonline.com/335f20ab-877e-440f-b0ba-d7eabfa258e4/oauth2/token?api-version=1.0:

1 ответ

Решение

Было бы неплохо, если бы мы получили более качественную обратную связь вместо:

Ошибка получения идентификатора объекта, прошедшего проверку подлинности: ошибка анализа результата json из интерфейса командной строки Azure.

Однако я нашел проблему. ВPulumi.AzureAD библиотека ожидает, что учетные данные участника-службы будут переменными среды.

Я установил их в конфигурации, используя pulumi config set команд, но этого было недостаточно.

Это то, что вам нужно сделать. Pulumi не устанавливает или не может установить это автоматически, и Terraform ожидает этих переменных среды.

$env:ARM_CLIENT_ID="000000000000000000"
$env:ARM_CLIENT_SECRET="00000000000000000"
$env:ARM_TENANT_ID="00000000000000000"
$env:ARM_SUBSCRIPTION_ID="000000000000000000000"
Другие вопросы по тегам