В этой статье мы покажем, как узнать время последнего входа пользователей в Azure AD, и сгенерировать другие отчеты об активности пользователей в вашем тенанте Microsoft с помощью PowerShell (через модуль AzureADPreview и Microsoft Graph API).
Самый простой способ посмотреть логи активности пользователя Azure – воспользоваться порталом. Перейдите на https://portal.azure.com -> Azure AD -> Users -> выберите пользователя -> Sign-in logs. В открывшейся таблице появится вся история по входам пользователя.
Можно узнать время входа, операционную систему на устройстве пользователя, местоположение, User agent и т.д. В таблице можно натсроить фильтры по разным параметрам, добавлять/удалять столбцы и выгрузить данные в CSV файл.
Однако, если вам нужно получить информацию по последнему входу для нескольких или всех пользователей, придется использовать PowerShell. Есть два способа получения доступа к журналам входа пользователей в Azure:
Получение истории аутентификации пользователей в Azure через Microsoft Graph API
Попробуем получить логи входа пользователей через Microsoft Graph API. Подключитесь к своему тенанту Azure через Microsoft Graph API (подробная инструкции по настройке доступа здесь):
$ApplicationID = "46692ad-f8a0-123f-8cca-432102de3bcf"
$TenatDomainName = "26216542-465a-407e-a17d-2bb4c3e3313b"
$AccessSecret = "d-8jM3ZUG87du-syZd32k01q.gkssa3mH3v"
$Body = @{
Grant_Type = "client_credentials"
Scope = "https://graph.microsoft.com/.default"
client_Id = $ApplicationID
Client_Secret = $AccessSecret
}
$ConnectGraph = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenatDomainName/oauth2/v2.0/token" -Method POST -Body $Body
$token = $ConnectGraph.access_token
После получения токена можно подключиться REST API, хранящей информацию о входах пользователей:
$GraphSignInLogs = "https://graph.microsoft.com/v1.0/auditLogs/signIns"
(Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GraphSignInLogs -Method Get).value
Проверьте, что вы можете получить данные о событиях аутентфикации пользователей в Azure:
@odata.nextLink
.Теперь с помощью Azure Graph Explorer (https://developer.microsoft.com/en-us/graph/graph-explorer) можно выбрать название полей, которые вы хотите видеть в отчете об истории входа пользователей. Например, я хочу видеть в отчете информацию о пользователе, операционной системе, приложении Azure/Microsoft 365 которое использовал пользователь и его местоположение (поля userDisplayName, userPrincipalName, appDisplayName, location, ipAddress, clientAppUsed, deviceDetail, createdDateTime).
В этом примере я хочу получить отчет по активности пользователей Azure за последние 90 дней:
$SetDate = (Get-Date).AddDays(-90)
$SetDate = Get-Date($SetDate) -format yyyy-MM-dd
$GraphSignInLogs = "https://graph.microsoft.com/v1.0/auditLogs/signIns"
$result = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GraphSignInLogs -Method Get).value | Select-Object userDisplayName, userPrincipalName, appDisplayName, ipAddress, clientAppUsed, deviceDetail, location,createdDateTime | Where-Object {$_.createdDateTime -gt $SetDate }
$alluserhistory = @()
foreach ($resitem in $result){
$userhistory = New-Object PSObject -Property @{
User=$resitem.userDisplayName
UPN=$resitem.userPrincipalName
AzureAppUsed =$resitem.appDisplayName
UserApp =$resitem.clientAppUsed
IP=$resitem.ipAddress
Date=$resitem.createdDateTime
OS=($resitem.deviceDetail).operatingSystem
browser=($resitem.deviceDetail).browser
City=($resitem.location).city
Country=($resitem.location).countryOrRegion
}
$alluserhistory += $userhistory
}
Чтобы выгрузить результат в CSV файл, выполните:
$alluserhistory| Export-Csv "C:\PS\azure_login_logs.csv" –NoTypeInformation
В полученном CSV файле есть информацию о всей активности пользователя: с каких устройств и местоположений он логинился, какими приложениям Microsoft 365 пользовался. При необходимости вы можете добавить любые другие поля.
Чтобы получить время последнего входа для каждого пользователя из полученного списка, выполните команду:
$alluserhistory| Group-Object UPN |%{ $_.Group | Select UPN,Date -First 1}
Можно найти всех неактивных пользователей за указанный период. Для этого нужно получить полный список UPN пользователей в Azure через Graph API и сравнить его с ранее полученным список пользователей, которые аутентифицировались в Azure в течении последних 90 дней.
$GrapUserUrl = 'https://graph.microsoft.com/v1.0/users'
$allusers=(Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GrapUserUrl -Method Get).value
$allusers = $allusers | Select-Object @{Name="UPN"; Expression = {$_.userprincipalname.ToLower()}}
$activeusers = $alluserhistory|select UPN –Unique
Осталось сравнить два списка. Таким образом с помощью PowerShell скрипта вы сможете найти неактивных пользователей в Microsoft 365 и освободить лицензии.
Обработка логов входа пользователей с помощью командлета Get-AzureADAuditSignInLogs из AzureADPreview
В модуле AzureADPreview есть отдельный командлет Get-AzureADAuditSignInLogs для получения информации о входах пользователей в Microsoft 365. По какой-то причине этот командлет отсутствует в продуктивном PowerShell модуле AzureAD (видимо Microsoft считает, что для нас достаточно Graph API).
Установите модуль AzureADPreview на свой компьютер:
Install-Module AzureADPreview –AllowClobber
Подключитесь к своему тенанту Azure через AzureADPreview:
AzureADPreview\Connect-AzureAD
Следующая команда вернет информацию о 10 последних входах пользователя в приложения Azure и Microsoft 365
Get-AzureADAuditSignInLogs -Filter "UserPrincipalName eq '[email protected]'" -Top 10 | select CreatedDateTime, UserPrincipalName, IsInteractive, AppDisplayName, IpAddress, TokenIssuerType, @{Name = 'DeviceOS'; Expression = {$_.DeviceDetail.OperatingSystem}}|ft
Можно вывести статистику по входам пользователей в Azure за последние 3 дня и экспортировать ее в CSV файл:
$SetDate = (Get-Date).AddDays(-3);
$SetDate = Get-Date($SetDate) -format yyyy-MM-dd
$array = Get-AzureADAuditSignInLogs -Filter "createdDateTime gt $SetDate" | select userDisplayName, userPrincipalName, appDisplayName, ipAddress, clientAppUsed, @{Name = 'DeviceOS'; Expression = {$_.DeviceDetail.OperatingSystem}},@{Name = 'Location'; Expression = {$_.Location.City}}
$array | Export-Csv "C:\PS\azurepreview_login_logs.csv" –NoTypeInformation