Поиск по сайту:

Как получить статус MFA от Microsoft Entra


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

Теперь доступно отображение настроенных методов MFA для ваших пользователей в Microsoft Entra. Мы также можем увидеть, какие методы используются чаще всего и, конечно же, какие пользователи еще не настроили MFA.

В этой статье мы рассмотрим встроенные функции отчетности в Microsoft Entra, и я покажу вам, как легко экспортировать информацию с помощью PowerShell в файл Excel.

Отчет по многофакторной аутентификации Microsoft Entra

Microsoft переходит от настройки MFA для каждого пользователя к политике условного доступа. Таким образом, у вас будет больше контроля над тем, когда пользователям необходимо входить с помощью MFA, а когда нет. Но для настройки политик условного доступа вам понадобится лицензия Azure P1 или P2.

Заметка

Чтобы использовать функции в этой статье, вам потребуется лицензия Azure P1 или P2; без нее вы не сможете просматривать отчет MFA или экспортировать данные с помощью PowerShell.

Вместо этого ознакомьтесь с этой статьей.

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

Чтобы просмотреть зарегистрированные методы в Microsoft Entra, вам нужно перейти к отчету о методах аутентификации:

  1. Откройте Центр администрирования Microsoft Entra
  2. Расширить Защиту
  3. Откройте Методы аутентификации
  4. Нажмите на Подробности регистрации пользователя

Вы можете использовать опцию фильтра в верхней части страницы, чтобы просмотреть пользователей без MFA или пользователей, у которых не настроено самослужебное восстановление пароля (SSPR), например.

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

Получить статус MFA Entra с помощью PowerShell

Ранее я создавал сценарии PowerShell для получения статуса MFA ваших пользователей с помощью PowerShell. Если у вас нет лицензии Azure P1 или P2, вы можете использовать этот сценарий, чтобы получить статус.

Скрипт в этой статье получит статус MFA из Microsoft Entra с помощью Microsoft Graph. Преимущество этого отчета заключается в том, что он получит метод по умолчанию, покажет все зарегистрированные методы и определит, может ли пользователь использовать MFA и быть безпарольным.

Заметка

Чтобы получить метод по умолчанию, вам необходимо использовать бета-модуль. Убедитесь, что вы также установили бета-модули с помощью:

Install-Module Microsoft.Graph.Beta -AllowClobber -Force

Чтобы получить те же данные, что и в Microsoft Entra, вы можете просто использовать командлет Get-MgReportAuthenticationMethodUserRegistrationDetail. Хорошо знать, что этот командлет вернет только активированные учетные записи.

Вам необходимо установить модуль Microsoft Graph PowerShell и подключиться к Graph с объёмом Reports.Read.All:

Connect to Graph
Connect-MgGraph -Scopes "Reports.Read.All"

Get all report data
Note, we are using the beta module here, so we can get the default method as well
Get-MgBetaReportAuthenticationMethodUserRegistrationDetail

Полный сценарий

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

Вы можете использовать следующие параметры для фильтрации результатов:

  • ТолькоАдмины – $true или $false. Будут экспортированы только пользователи с ролью администратора.
  • Лицензированные – Истина, Ложь, Оба. Включает только лицензированных, нелицензированных или всех пользователей.
  • безMFAТолько – $истина или $ложь. Экспортировать только пользователей без MFA
  • UserPrincipalName – <string>. Позволяет указать имя основного пользователя для получения

Скрипт сначала получит все данные отчета, а затем отфильтрует запрашиваемых пользователей. Технически также возможно получить только данные отчета от выбранных пользователей, но это оказалось значительно медленнее, чем сначала получить все данные.

Чтобы получить пользователей, мы сделаем отдельный запрос к Microsoft Graph, чтобы получить пользователей с применёнными фильтрами. Если вы посмотрите на функцию Get-Users в скрипте, вы увидите массив Select. Это свойства, которые включены в экспорт. Вы можете расширить этот список в соответствии с вашими потребностями, например, чтобы получить информацию о департаменте или должности пользователя.

Скрипт экспортирует следующие данные в файл CSV:

  • Отображаемое имя
  • Адрес электронной почты
  • УчетнаяЗаписьПользователя
  • Тип пользователя (участник или гость)
  • является администратором
  • Поддержка MFA (если истина, значит пользователь настроил MFA)
  • Метод по умолчанию MFA
  • Метод вторичной MFA
  • Зарегистрированные методы МФА
  • Способный без пароля
  • Зарегистрировано SSPR
  • Способный к SSPR
  • Менеджер пользователя

Вы можете получить последнюю версию скрипта здесь из моего репозитория на Github. Чтобы запустить скрипт, сохраните файл в своем рабочем каталоге и запустите его с не обязательными параметрами в PowerShell. Узнайте больше о запуске скриптов PowerShell в этой статье.

<#
.Synopsis
  Get the MFA status for all users, admin or selected users from Microsoft Entra

.DESCRIPTION
  This script will get the Azure MFA Status for your users. You can query all the users, admins only or a single user.
   
	It will return the MFA Status, MFA type, Default method, SSRP, and registered devices.

.NOTES
  Name: Get-MgEntraMFAStatus
  Author: R. Mens - LazyAdmin.nl
  Version: 1.2
  DateCreated: Feb 2024
  Purpose/Change: Fixed licensed and enabled users

.LINK
  https://a-d.site
#>
 
[CmdletBinding(DefaultParameterSetName="Default")]
param(
  [Parameter(
    Mandatory = $false,
    ParameterSetName  = "UserPrincipalName",
    HelpMessage = "Enter a single UserPrincipalName or a comma separted list of UserPrincipalNames",
    Position = 0
    )]
  [string[]]$UserPrincipalName,

  [Parameter(
    Mandatory = $false,
    ValueFromPipeline = $false,
    ParameterSetName  = "AdminsOnly"
  )]
  # Get only the users that are an admin
  [switch]$adminsOnly = $false,

  [Parameter(
    Mandatory         = $false,
    ValueFromPipeline = $false,
    ParameterSetName  = "allUsers"
  )]
  [Alias("Licensed")]
  [ValidateSet("true", "false", "both")]
  # Check only the MFA status of users that have license
  [string]$IsLicensed = 'true',

  [Parameter(
    Mandatory         = $false,
    ValueFromPipeline = $true,
    ValueFromPipelineByPropertyName = $true,
    ParameterSetName  = "allUsers"
  )]
  # Get only the users that don't have MFA enabled
  [switch]$withOutMFAOnly = $false,

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter path to save the CSV file"
  )]
  [string]$CSVPath = ".\EntraMFAStatus-$((Get-Date -format "MMM-dd-yyyy").ToString()).csv"
)

Function ConnectTo-MgGraph {
  # Check if MS Graph module is installed
  if (-not(Get-InstalledModule Microsoft.Graph)) { 
    Write-Host "Microsoft Graph module not found" -ForegroundColor Black -BackgroundColor Yellow
    $install = Read-Host "Do you want to install the Microsoft Graph Module?"

    if ($install -match "[yY]") {
      Install-Module Microsoft.Graph -Repository PSGallery -Scope CurrentUser -AllowClobber -Force
    }else{
      Write-Host "Microsoft Graph module is required." -ForegroundColor Black -BackgroundColor Yellow
      exit
    } 
  }

  # Connect to Graph
  Write-Host "Connecting to Microsoft Graph" -ForegroundColor Cyan
  Connect-MgGraph -Scopes "Reports.Read.All" -NoWelcome
}


Function Get-Admins{
  <#
  .SYNOPSIS
    Get all user with an Admin role
  #>
  process{
    $admins = Get-MgDirectoryRole | Select-Object DisplayName, Id | 
                %{$role = $_.DisplayName; Get-MgDirectoryRoleMember -DirectoryRoleId $_.id | 
                  where {$_.AdditionalProperties."@odata.type" -eq "#microsoft.graph.user"} | 
                  % {Get-MgUser -userid $_.id }
                } | 
                Select @{Name="Role"; Expression = {$role}}, DisplayName, UserPrincipalName, Mail, Id | Sort-Object -Property Mail -Unique
    
    return $admins
  }
}

Function Get-Users {
  # Set the properties to retrieve
  $select = @(
    'mail'
    'userprincipalname'
    'displayname'
  )

  $properties = $select + "AssignedLicenses"
  
  # Get-MgBetaReportAuthenticationMethodUserRegistrationDetail returns only enabled accounts
  # so we get only enabled accounts here as well.
  $filter = "AccountEnabled eq true and UserType eq 'member'"

  # Check if UserPrincipalName(s) are given
  if ($UserPrincipalName) {
    Write-host "Get specific users" -ForegroundColor Cyan

    $users = @()
    foreach ($user in $UserPrincipalName) 
    {
      try {
        $users += Get-MgUser -UserId $user -Property $properties | select $select -ErrorAction Stop
      }
      catch {
        [PSCustomObject]@{
          DisplayName       = " - Not found"
          UserPrincipalName = $User
          isAdmin           = $null
          MFAEnabled        = $null
        }
      }
    }
  }elseif($adminsOnly) {
    Write-host "Get admins only" -ForegroundColor Cyan

    $users = @()
    foreach ($admin in $admins) {
      $users += Get-MgUser -UserId $admin.UserPrincipalName -Property $properties | select $select
    }
  }else{
    if ($IsLicensed -eq 'true') {
      # Get only licensed users
      $users = Get-MgUser -Filter $filter -Property $properties -all | Where-Object {($_.AssignedLicenses).count -gt 0} | select $select
    }elseif ($IsLicensed -eq 'false') {
      # Get only users without license
      $users = Get-MgUser -Filter $filter -Property $properties -all | Where-Object {($_.AssignedLicenses).count -eq 0} | select $select
    }else{
      $users = Get-MgUser -Filter $filter -Property $properties -all | select $select
    }
  }
  return $users
}

Function Get-Manager {
  <#
    .SYNOPSIS
      Get the manager users
  #>
  param(
    [Parameter(Mandatory = $true)] $userId
  )
  process {
    $manager = Get-MgUser -UserId $userId -ExpandProperty manager | Select @{Name = 'name'; Expression = {$_.Manager.AdditionalProperties.displayName}}
    return $manager.name
  }
}

Function Get-MFAStatusUsers {
  <#
    .SYNOPSIS
      Get all AD users
  #>
  process {
    Write-Host "Collecting users" -ForegroundColor Cyan
    
    # Collect users to get
    $users = Get-Users
    
    # Get all MFA Report data
    $reportData = Get-MgBetaReportAuthenticationMethodUserRegistrationDetail

    Write-Host "Processing" $users.count "users" -ForegroundColor Cyan

    # Collect and loop through all users
    foreach ($reportUser in $reportData) {

      # Check if we want this users in the output
      # Note - it's faster to get all report data and then filter it on the selected users, 
      # then getting the report data for each individual user
      if ($reportUser.UserPrincipalName -notin $users.UserPrincipalName) {
        continue
      }

      Write-Host "- Processing $($reportUser.UserDisplayName)" -ForegroundColor Cyan
    
      # Get the user data from the users array
      $userData = $users | where-object {$_.UserPrincipalName -eq $reportUser.UserPrincipalName}

      # Get the manager of the user (optional)
      $manager = Get-Manager -userId $reportUser.id
      
      # Create output object
      [pscustomobject]@{
        "Name" = $userData.DisplayName
        "Emailaddress" = $userData.mail
        "UserPrincipalName" = $reportUser.UserPrincipalName
        "User Type" = $reportUser.UserType
        "isAdmin" = $reportUser.IsAdmin
        "MFA Capable" = $reportUser.IsMfaCapable
        "MFA Default method" = $reportUser.DefaultMfaMethod
        "MFA Secondary method" = $reportUser.UserPreferredMethodForSecondaryAuthentication
        "MFA Methods Registered" = $reportUser.MethodsRegistered -join ", "
        "Passwordless Capable" = $reportUser.IsPasswordlessCapable
        "SSPR Registered" = $reportUser.IsSsprRegistered
        "SSPR Capable" = $reportUser.IsSsprCapable
        "Manager" = $manager
      }
    }
  }
}

Connect to Graph
ConnectTo-MgGraph

Get Admins
Get all users with admin role
$admins = $null

if ($adminsOnly) {
  $admins = Get-Admins
} 

Get MFA Status
Get-MFAStatusUsers | Sort-Object Name | Export-CSV -Path $CSVPath -NoTypeInformation

if ((Get-Item $CSVPath).Length -gt 0) {
  Write-Host "Report finished and saved in $CSVPath" -ForegroundColor Green

  # Open the CSV file
  Invoke-Item $CSVPath
}else{
  Write-Host "Failed to create report" -ForegroundColor Red
}

Завершение

Ведение учета конфигурации MFA ваших пользователей важно для обеспечения безопасности вашего арендатора Microsoft 3675. Новые отчеты в Microsoft Entra позволяют вам легко отслеживать тех пользователей, которые не завершили процесс настройки MFA или используют устаревшие методы MFA.

Хотя отчет в Microsoft Entra предоставляет наиболее необходимую информацию, с помощью PowerShell мы можем включить контактные данные, данные менеджера пользователя или детали отдела, что может быть очень полезно.

Я надеюсь, вам понравилась эта статья и сценарий. Если у вас есть вопросы, просто оставьте комментарий ниже.