Какие разрешения необходимы Azure DevOps для выполнения командлета Get-AzureADServicePrincipal?

Я развертываю приложение на основе функций Azure с помощью конвейера Azure DevOps, в рамках развертывания также предоставляется необходимая инфраструктура (с использованием шаблонов ARM). Функция Azure должна получить доступ к Microsoft Graph и SharePoint REST API, для этого необходимо предпринять следующие шаги:

  1. Функция Azure создается с идентификатором, назначенным системой (MSI).
  2. MSI (идентификатор) передается нижеприведенному сценарию PowerShell для обеспечения доступа к Graph & SharePoint API.
$context = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile.DefaultContext
$context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.microsoft.com").AccessToken
$aadToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.windows.net").AccessToken
 
Connect-AzureAD -AadAccessToken $aadToken -AccountId $context.Account.Id -TenantId $context.tenant.id
 
$azureFunctionServicePrincipal = Get-AzureADServicePrincipal -Filter "ObjectId eq '$PrincipalId'"
#Graph service principal
$GraphServicePrincipal = Get-AzureADServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
$GraphFilesReadWriteAllAppRole = $GraphServicePrincipal.AppRoles | Where-Object {$_.Value -in 'Files.ReadWrite.All' -and $_.AllowedMemberTypes -contains 'Application'}
New-AzureAdServiceAppRoleAssignment -ObjectId $EcaseServicePrincipal.ObjectId -PrincipalId $EcaseServicePrincipal.ObjectId -ResourceId $GraphServicePrincipal.ObjectId -Id $GraphFilesReadWriteAllAppRole.Id

$SharePointOnlineServicePrinciple = Get-AzureADServicePrincipal -SearchString “Office 365 SharePoint”
$SharePointOnlineSitesReadWriteAllAppRole = $SharePointOnlineServicePrinciple.AppRoles | Where-Object {$_.Value -in 'Sites.ReadWrite.All' -and $_.AllowedMemberTypes -contains 'Application'}
New-AzureAdServiceAppRoleAssignment -ObjectId $EcaseServicePrincipal.ObjectId -PrincipalId $EcaseServicePrincipal.ObjectId -ResourceId $SharePointOnlineServicePrinciple.ObjectId -Id $SharePointOnlineSitesReadWriteAllAppRole.Id

Сценарий PowerShell при выполнении команды Get-AzureADServicePrincipal завершается ошибкой из-за недостаточных прав, эта команда выполняется под удостоверением DevOps ServiceConnection. ServiceConnection назначается со следующими дополнительными привилегиями:  введите описание изображения здесь

Я не могу понять, какие еще привилегии требуются для успешного выполнения GetServicePrincipal, а также для выполнения командлета New-AzureAdServiceAppRoleAssignment.

[Обновление от 31 августа 2020 г.] Благодаря решению AlleWu проблема с разрешениями, связанная с GetServicePrincipal, решена. Однако проблема разрешения для выполнения NewServicePrincipalAppRoleAssignment сохраняется, несмотря на разрешение ниже, я пропустил какой-то шаг. Я также сделал объект ServiceConnection владельцем ResourceGroup, но это тоже не удалось.

Разрешения на подключение к службе

Журнал ошибок выполнения NewServicePrincipalAppRoleAssignment:

2020-08-31T05:24:55.5613075Z ##[debug]+ New-AzureAdServiceAppRoleAssignment -ObjectId $EcaseServicePrincipal. ...
2020-08-31T05:24:55.5639370Z ##[debug]+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2020-08-31T05:24:55.5721318Z ##[debug]    + CategoryInfo          : NotSpecified: (:) [New-AzureADServiceAppRoleAssignment], ApiException
2020-08-31T05:24:55.5744883Z ##[debug]    + FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.NewServ    icePrincipalAppRoleAssignment
2020-08-31T05:24:55.5765560Z ##[debug] 
2020-08-31T05:24:55.5834409Z ##[debug]Script stack trace:
2020-08-31T05:24:55.5976760Z ##[debug]at <ScriptBlock>, D:\a\1\s\azure.pipelines\pwsh\provision_service_principle_for_sharepoint_graph.ps1: line 23
2020-08-31T05:24:55.6006045Z ##[debug]at <ScriptBlock>, <No file>: line 1
2020-08-31T05:24:55.6029248Z ##[debug]at <ScriptBlock>, D:\a\_tasks\AzurePowerShell_72a1931b-effb-4d2e-8fd8-f8472a07cb62\4.173.1\azurepowershell.ps1: line 229
2020-08-31T05:24:55.6188575Z ##[debug]at <ScriptBlock>, D:\a\_tasks\AzurePowerShell_72a1931b-effb-4d2e-8fd8-f8472a07cb62\4.173.1\azurepowershell.ps1: line 225
2020-08-31T05:24:55.6219503Z ##[debug]at <ScriptBlock>, <No file>: line 1
2020-08-31T05:24:55.6243577Z ##[debug]at <ScriptBlock>, <No file>: line 22
2020-08-31T05:24:55.6281986Z ##[debug]at <ScriptBlock>, <No file>: line 18
2020-08-31T05:24:55.6331521Z ##[debug]at <ScriptBlock>, <No file>: line 1
2020-08-31T05:24:55.6497107Z ##[debug]Exception:
2020-08-31T05:24:55.6577566Z ##[debug]Microsoft.Open.AzureAD16.Client.ApiException: Error occurred while executing NewServicePrincipalAppRoleAssignment 
2020-08-31T05:24:55.6607345Z ##[debug]Code: Authorization_RequestDenied
2020-08-31T05:24:55.6683059Z ##[debug]Message: Insufficient privileges to complete the operation.
2020-08-31T05:24:55.6712669Z ##[debug]RequestId: 14e5694e-bfde-404f-a441-4543871b1e56
2020-08-31T05:24:55.6760142Z ##[debug]DateTimeStamp: Mon, 31 Aug 2020 05:24:53 GMT
2020-08-31T05:24:55.6794376Z ##[debug]HttpStatusCode: Forbidden
2020-08-31T05:24:55.6818439Z ##[debug]HttpStatusDescription: Forbidden
2020-08-31T05:24:55.6842869Z ##[debug]HttpResponseStatus: Completed
2020-08-31T05:24:55.6890342Z ##[debug]
2020-08-31T05:24:55.6915727Z ##[debug]   at Microsoft.Open.AzureAD16.Client.Configuration.<>c.<.cctor>b__47_0(String methodName, IRestResponse response) in X:\bt\1137570\repo\src\dev\PowerShell.V2\AzureAD16.Client\Client\Configuration.cs:line 188
2020-08-31T05:24:55.6947059Z ##[debug]   at Microsoft.Open.AzureAD16.Api.ServicePrincipalApi.NewServicePrincipalAppRoleAssignmentWithHttpInfo(String tenantId, String objectId, String authorization, String cmdletName, String clientRequestId, String apiVersion, AppRoleAssignment appRoleAssignment) in X:\bt\1137570\repo\src\dev\PowerShell.V2\AzureAD16.Client\Api\ServicePrincipalApi.cs:line 4006
2020-08-31T05:24:55.6977721Z ##[debug]   at Microsoft.Open.AzureAD16.PowerShell.NewServicePrincipalAppRoleAssignment.ProcessRecord() in X:\bt\1137570\repo\src\dev\PowerShell.V2\AzureAD16.PowerShell\AzureAD16.PowerShell.AutoGen\API\ServicePrincipalApi.cs:line 2019
2020-08-31T05:24:55.7008421Z ##[debug]   at System.Management.Automation.CommandProcessor.ProcessRecord()
2020-08-31T05:24:55.7366976Z ##[error]Error occurred while executing NewServicePrincipalAppRoleAssignment 
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
RequestId: 14e5694e-bfde-404f-a441-4543871b1e56
DateTimeStamp: Mon, 31 Aug 2020 05:24:53 GMT
HttpStatusCode: Forbidden
HttpStatusDescription: Forbidden

Обновление 1-го набора, 2020 г .: Альтернативное решение, предложенное выше, сработало, ниже я обновил скрипт, используемый для предоставления необходимых разрешений,

$context = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile.DefaultContext
$graphToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.microsoft.com").AccessToken
$aadToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.windows.net").AccessToken

Connect-AzureAD -AadAccessToken $aadToken -AccountId $context.Account.Id -TenantId $context.tenant.id
 
$webAppServicePrincipal = Get-AzureADServicePrincipal -Filter "ObjectId eq '$PrincipalId'" #$PrincipalId is the ObjectId of the webApp instance
$GraphServicePrincipal = Get-AzureADServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
$GraphFilesReadWriteAllAppRole = $GraphServicePrincipal.AppRoles | Where-Object {$_.Value -in 'Files.ReadWrite.All' -and $_.AllowedMemberTypes -contains 'Application'}

#It appears that the Azure DevOps's service connection need to have Global Administrator permissions to successfully execute the below statement; which is not recommended, hence, this is implemented calling Graph API 
#New-AzureAdServiceAppRoleAssignment -ObjectId $EcaseServicePrincipal.ObjectId -PrincipalId $EcaseServicePrincipal.ObjectId -ResourceId $GraphServicePrincipal.ObjectId -Id $GraphFilesReadWriteAllAppRole.Id

$resourceId = $GraphServicePrincipal.ObjectId
$body = @{
  "principalId"= $webAppServicePrincipal.ObjectId
  "resourceId"= $resourceId
  "appRoleId"= $GraphFilesReadWriteAllAppRole.Id
}

$apiUrl = "https://graph.microsoft.com/v1.0/servicePrincipals/$resourceId/appRoleAssignedTo"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization = "Bearer $($graphToken)" }  -Method POST -Body $($body | convertto-json) -ContentType "application/json"

person user527614    schedule 27.08.2020    source источник
comment
Если мой ответ окажется для вас полезным, вы можете принять его как ответ. Это может быть полезно для других членов сообщества. Спасибо.   -  person Allen Wu    schedule 28.08.2020
comment
@AllenWu: Решение, которым вы поделились, действительно решило проблему с разрешениями, связанную с выполнением GetServicePrincipal. Теперь у меня возникла проблема с разрешениями при выполнении New-AzureAdServiceAppRoleAssignment, я дал следующие разрешения в AD Graph: Application.RW.All, Directory.RW.All; под Msft Graph: Application.RW.All, AppRoleAssignment.RW.All. Какое еще разрешение требуется для этого?   -  person user527614    schedule 28.08.2020
comment
Directory.RW. Все, что находится под AAD Graph, должно быть именно тем, что вам нужно. Не забудьте нажать Предоставить согласие администратора.   -  person Allen Wu    schedule 29.08.2020
comment
@AllenWu: Я думаю, что необходимые разрешения уже есть, я обновил свой запрос дополнительной информацией.   -  person user527614    schedule 31.08.2020
comment
У меня будет быстрый тест / подтверждение, и я вернусь, когда появятся какие-либо обновления.   -  person Allen Wu    schedule 31.08.2020
comment
См. ОБНОВЛЕНИЕ в моем ответе.   -  person Allen Wu    schedule 31.08.2020
comment
Привет, есть обновления?   -  person Allen Wu    schedule 01.09.2020
comment
@AllenWu: Спасибо, альтернативное решение сработало. Я принял решение как ответ.   -  person user527614    schedule 01.09.2020
comment
Вы редактируете мой ответ, чтобы добавить свое обновление. Поэтому я его отклоняю и добавляю обновление в свой пост :)   -  person Allen Wu    schedule 02.09.2020


Ответы (1)


Команда Get-AzureADServicePrincipal вызывает Azure AD Graph, а не Microsoft Graph.

GET https://graph.windows.net/{tenant id}/servicePrincipals?api-version=1.6 HTTP/1.1

Итак, вы должны предоставить разрешение Azure AD Graph:

введите описание изображения здесь

введите описание изображения здесь

ОБНОВЛЕНИЕ:

Нашел кое-что интересное:

Хотя я назначил субъекту службы все разрешения приложения AAD Graph, он по-прежнему показывает Недостаточно прав для завершения операции.

Поэтому я использую другой метод: назначить этому субъекту службы роль глобального администратора. Но у него задержка около 10-15 минут. Тогда субъект-служба сможет успешно выполнить New-AzureAdServiceAppRoleAssignment.

Я также тестирую с ролью Администратора приложений, но она не работает. Я думаю, что в AAD Graph внесены некоторые изменения и он не будет поддерживаться. Так что использовать его не рекомендуется.

В качестве обходного пути вы можете вызвать Microsoft Graph API: Предоставьте appRoleAssignment субъекту службы в сценарии Powershell.

person Allen Wu    schedule 28.08.2020