Подключение к различным клиентам Azure AD с помощью PowerShell в приложении-функции Azure - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь создать систему, в которой PowerShell собирает данные от нескольких клиентов и откладывает их в отчете.Один из моментов данных, который необходимо проверить, - включен ли администратор MFA или нет.Чтобы получить эти данные, я использую следующее

$credentials = <credentials>;    
Connect-MSOLService -Credential $credentials;

foreach ($role in Get-MsolRole) {
    foreach ($adminUser in (Get-MsolRoleMember -All -RoleObjectId $role.ObjectId -MemberObjectTypes @("User"))) {
        $isMFA = ($adminUser.StrongAuthenticationRequirements -match 'Microsoft.Online.Administration.StrongAuthenticationRequirement').Count -gt 0;
        #Do stuff
    }
}

Это работает.Проблема в том, что этот сценарий выполняется в функции Azure, запускаемой очередью.Он запускается по таймеру, что означает, что все триггеры будут работать одновременно.Когда установлено первое соединение, все другие запросы данных извлекают данные от того же владельца.

Можно ли как-то гарантировать, что каждый запрос создаст свое собственное соединение или ограничить область подключения msol?

Единственное решение, которое я могу придумать, - это синхронное выполнение сценариев, но это приведет к очень низкой производительности.

1 Ответ

0 голосов
/ 16 октября 2018

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

Один из подходов, который вы можете использовать, - это обернуть ваш код PowerShell, который должен работать изолированно, в его собственное задание PowerShell, используя Start-Job.Вот пример, который я успешно протестировал.

# Receive queue message
$input = Get-Content $queueItem -Raw

# Pass the input queue message as a parameter to a new job.
$job = Start-Job -ArgumentList $input -ScriptBlock {

    param($queueMessage)

    # Load the MSOnline PowerShell module 
    Import-Module $env:CONTOSO_PathToMSOnline

    # Retrieve the credentials from where they're securely stored
    $credentials = ... # e.g. get from Key Vault

    # Connect to Azure AD. This connection is only used by this job.
    Connect-MsolService -Credential $credentials

    # Do something with MSOnline...
}

# Wait for the job to complete, receive results, then clean up.
Receive-Job -Wait -Job $job -AutoRemoveJob

Исходя из результатов моего тестирования, это должно покрыть ваши потребности в изоляции.Однако имейте в виду, что вы раскручиваете для этого совершенно новый экземпляр хоста PowerShell, что может иметь непредвиденные последствия (например, увеличение использования памяти, больше времени для загрузки).

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

# Iterate over all admins of all roles, and check if they have per-user MFA enabled.

$admins = @{} # To keep track of which admins we've already seen

foreach ($role in Get-MsolRole) {

    $roleMembers = Get-MsolRoleMember -All -RoleObjectId $role.ObjectId `#`
                                      -MemberObjectTypes @("User")

    foreach ($user in $roleMembers) {

        if ($admins.ContainsKey($user.ObjectId)) {
            # We've already seen this user, skip it.
        } else {
            $admins[$user.ObjectId] = $true # Mark as admin we've seen

            # Determine if per-user MFA is enabled or enforced
            $isMfaEnabledOrEnforced = $user.StrongAuthenticationRequirements.Count -gt 0

            # Do something...    
        }
    }
}
...