Чтение группы AD из функции Azure с использованием аутентификации субъекта службы - PullRequest
0 голосов
/ 15 октября 2019

Я хочу прочитать и вывести список членов определенной группы AD, используя скрипт powershell, используя функцию azure. Для подключения AD я использую сервисный принципал. Подключение к AzureAD прошло успешно, но попытка доступа к группе AD выдает ошибку (на данном этапе я просто хочу получить определенную группу и отобразить ее):

System.Management.Automation.RemoteException: Error occurred while executing GetGroups 
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
RequestId: <requestID>
DateTimeStamp: Mon, 14 Oct 2019 20:40:26 GMT
HttpStatusCode: Forbidden
HttpStatusDescription: Forbidden
HttpResponseStatus: Completed

Почему это происходит? кто-нибудь использовал команды модуля Azuread в рамках функции Azure? Я предоставил разрешения для графика MS для этого приложения: enter image description here

$Script={
    param ()
    ##Save AzureAD module to the modules folder before publishing
    Import-Module .\modules\AzureAD

    $appId = "<AppId>"
    $thumb = "<CertThumb>"
    $tenantId = "TenantID"
    Connect-AzureAD -TenantId $tenantId -ApplicationId  $appId -CertificateThumbprint $thumb

    $groupName = "<Name of the group>"

    $group = Get-AzureADGroup -SearchString $groupName 
    #or
    #$group = Get-AzureADGroup -ObjectId "<object id>"

    echo $group
}

&$env:64bitPowerShellPath -WindowStyle Hidden -NonInteractive -Command $Script

Обратите внимание, что мой код обернут в переменную $ Script и добавлена ​​последняя строка, чтобы код работал каквременный обходной путь, пока модуль AD не будет добавлен в PS Core: https://github.com/Azure/azure-functions-powershell-worker/issues/232

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Как упоминалось в другом ответе, добавление субъекта службы в качестве роли каталога является одним из способов, но вы должны отметить, что оно предоставит субъекту службы другие разрешения, например, create group, delete group.

На самом деле проблема была вызвана тем, что вы предоставили неправильное разрешение, вам нужно предоставить Azure Active Directory Graph с Directory.Read.All разрешением для приложения вместо Microsoft Graph, потому что команда Get-AzureADGroup фактически вызывает Azure Active Directory Graph.

enter image description here

Примечание : при тестировании команды на локальном уровне после предоставления разрешения закройте сеанс powershell и откройте новыйодин, войдите снова и выполните команду. Если вы запустите это в функции, возможно, перезапустите приложение функции, чтобы убедиться, что разрешение затронуло.

1 голос
/ 15 октября 2019

Согласно предоставленной вами картинке, вы предоставили некоторые полномочия API Graph для субъекта службы. После того, как вы это сделаете, вы можете просто вызвать некоторый граф API с принципалом службы. Если вы хотите использовать модуль Azure AD PowerShell с субъектом службы для управления Azure AD, вам нужно назначить роль Azure AD субъекту службы. Для получения более подробной информации, пожалуйста, обратитесь к https://docs.microsoft.com/en-us/powershell/azure/active-directory/signing-in-service-principal?view=azureadps-2.0.

Что касается создания субъекта службы и назначения роли, пожалуйста, обратитесь к следующему сценарию.

# Login to Azure AD PowerShell With Admin Account
Connect-AzureAD 

# Create the self signed cert
$currentDate = Get-Date
$endDate  = $currentDate.AddYears(1)
$notAfter  = $endDate.AddYears(1)
$pwd  = "<password>"
$thumb = (New-SelfSignedCertificate -CertStoreLocation cert:\localmachine\my -DnsName com.foo.bar -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $notAfter).Thumbprint
$pwd = ConvertTo-SecureString -String $pwd -Force -AsPlainText
Export-PfxCertificate -cert "cert:\localmachine\my\$thumb" -FilePath c:\temp\examplecert.pfx -Password $pwd

# Load the certificate
$cert  = New-Object System.Security.Cryptography.X509Certificates.X509Certificate("C:\temp\examplecert.pfx", $pwd)
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())


# Create the Azure Active Directory Application
$application = New-AzureADApplication -DisplayName "test123" -IdentifierUris "https://test123"
New-AzureADApplicationKeyCredential -ObjectId $application.ObjectId -CustomKeyIdentifier "Test123" -StartDate $currentDate -EndDate $endDate -Type AsymmetricX509Cert -Usage Verify -Value $keyValue

# Create the Service Principal and connect it to the Application
$sp = New-AzureADServicePrincipal -AppId $application.AppId

# Give the Service Principal Reader access to the current tenant (Get-AzureADDirectoryRole)
#Regarding the Azure AD role, please refer to https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/roles-delegate-by-task
$role = Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "role name"}
Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $sp.ObjectId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...