Azure Группы AD и управляемые идентификаторы, назначаемые пользователем - PullRequest
0 голосов
/ 10 июля 2020

Как разрешить назначенные пользователем управляемые удостоверения (UAMI) для R / W Azure групп AD? У меня есть приложение. Net Core 3.1 Azure Function, работающее как UMAI. Приложение должно иметь возможность чтения / записи Azure групп AD. У меня есть код, запущенный через участника службы регистрации приложений на моем ноутбуке. В Azure UAMI является участником подписки и связан с FunctionApp.

Это работает локально, а в Azure:

        var azureFluentClient = AzureAuthenticator.AzureFluentClient(context._ILogger, context.ExecutionContext,context.Settings);
        var resourceGroups = await azureFluentClient.ResourceGroups.ListAsync();

Работает локально, ОТКАЗЫВАЕТСЯ на Azure:

        var azureFluentClient = AzureAuthenticator.AzureFluentClient(context._ILogger, context.ExecutionContext, context.Settings);
        var groups = await azureFluentClient.AccessManagement.ActiveDirectoryGroups.GetByNameAsync("AAA1");

Ошибка:

{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."},"requestId":"f797cb42-a75d-48d9-a902-c580955800cd","date":"2020-07-10T05:41:59"}}

ex.Response.Content: "Insufficient privileges to complete the operation."

Microsoft.Azure.Management.Graph.RBAC.Fluent.Models.GraphErrorException: Operation returned an invalid status code 'BadRequest'
   at Microsoft.Azure.Management.Graph.RBAC.Fluent.GroupsOperations.ListWithHttpMessagesAsync(ODataQuery`1 odataQuery, Dictionary`2 customHeaders, CancellationToken cancellationToken)
   at Microsoft.Azure.Management.Graph.RBAC.Fluent.GroupsOperationsExtensions.ListAsync(IGroupsOperations operations, ODataQuery`1 odataQuery, CancellationToken cancellationToken)
   at Microsoft.Azure.Management.Graph.RBAC.Fluent.ActiveDirectoryGroupsImpl.<ListAsync>b__7_0(CancellationToken cancellation)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.PagedCollection`2.LoadPageWithWrapModelAsync(Func`2 listInnerAsync, Func`3 listInnerNext, Func`3 wrapModelAsync, Boolean loadAllPages, CancellationToken cancellationToken)
   at Microsoft.Azure.Management.ResourceManager.Fluent.Core.PagedCollection`2.LoadPage(Func`2 listInnerAsync, Func`3 listInnerNext, Func`2 wrapModel, Boolean loadAllPages, CancellationToken cancellationToken)
   at Microsoft.Azure.Management.Graph.RBAC.Fluent.ActiveDirectoryGroupsImpl.ListAsync(Boolean loadAllPages, CancellationToken cancellationToken)
   at HDIManagement.FunctionApp.API.TestServiceConfiguration.TestADGroupAccess(OperationsContext context) in C:\Users\josep\source\repos\HDI\BareMetal\HDI-Logging\HDIManagement.FunctionApp\API\TestConfiguration.cs:line 67

Разница в том, что для локальных запусков используется регистрация приложения с разрешениями API: Azure Active Directory Graph / Directory.ReadWrite .Все . Я думаю, проблема в том, что с UAMI не связана регистрация приложений, поэтому нет возможности предоставить разрешения.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Решение: Управляемая идентификация, назначенная пользователем (UAMI) FunctionApp, требует

  • Назначить роль участника подписки UAMI (мой код выполняет больше, чем просто строку, просто ищет группы AAD)
  • Назначение UAMI AD Роль читателей каталогов (допустимо в производственной среде)
  • Добавить UAMI в качестве владельца в группы AD, которыми нужно управлять (добавить / удалить участников)

Примечание: UAMI не сможет создавать назначать, удалять или управлять любыми группами AD, не получившими разрешения на основании права собственности.

Я потратил много времени из-за задержек / кэширования AD изменений, внесенных в управляемую идентификацию (изменения могут потребовать в то время как появиться, обманывая меня в кроличьи норы). Я написал этот сценарий, чтобы помочь определить фактические требования моего FunctionApp. После запуска этого сценария я запускаю свой тестовый метод FunctionApp. Поскольку Identity каждый раз новый, нет кеширования или отложенной реализации.

Connect-AzureRmAccount -TenantId $tenantId
Connect-AzureAD -TenantId $tenantId

Set-AzureRmContext  -TenantId $tenantId -SubscriptionId $subscriptionId

#Drops/recreates manged Identity
Set-AzureRmWebApp -AssignIdentity $false -ResourceGroupName "rg01" -Name "fa01" 
Set-AzureRmWebApp -AssignIdentity $true -ResourceGroupName "rg01" -Name "fa01" 

$current = Get-AzureRmWebApp -ResourceGroupName "rg01" -Name "fa01"
$objectId = $current.Identity.PrincipalId

#Add functionApp Identity to Contributor
$role = Get-AzureRmRoleDefinition -Name "Contributor"
New-AzureRMRoleAssignment -ObjectId $objectId -RoleDefinitionName "Contributor"  -Scope "/subscriptions/{subscription guid}"

#Assign functionApp Identity to AD Role 'Directory Readers'
$roleDefinition = Get-AzureADMSRoleDefinition -Filter "displayName eq 'Directory Readers'"
$roleAssignment = New-AzureADMSRoleAssignment  -RoleDefinitionId $roleDefinition.Id -PrincipalId $objectId  -ResourceScope "/"

#Assign functionApp Identity to AD Group
$group = Get-AzureADGroup  -Filter "DisplayName eq  'adgroup01'"
Add-AzureADGroupOwner -ObjectId $group.ObjectId -RefObjectId $objectId
0 голосов
/ 10 июля 2020

Да, назначенное пользователем удостоверение - это принципал службы, не связанный с приложением AD.

В этом случае, если вы хотите предоставить права чтения / записи для Azure групп AD, вы можете назначить ему роль администратора Groups administrator напрямую.

Перейдите к Azure Active Directory на портале -> Roles and administrators -> выберите Groups administrator -> Add assignments -> найдите имя личности и добавьте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...