Anomalous Microsoft Entra ID apps based on authentication location
Description
'This query over Microsoft Entra ID sign-in activity highlights Microsoft Entra ID apps with an unusually high ratio of distinct geolocations versus total number of authentications'
Query · kql
let azureSignIns = SigninLogs | where SourceSystem == "Azure AD" | where OperationName == "Sign-in activity" | project TimeGenerated, OperationName, AppDisplayName , Identity, UserId, UserPrincipalName, Location, LocationDetails, ClientAppUsed, DeviceDetail, ConditionalAccessPolicies; azureSignIns | extend locationString = strcat(tostring(LocationDetails["countryOrRegion"]), "/", tostring(LocationDetails["state"]), "/", tostring(LocationDetails["city"]), ";" , tostring(LocationDetails["geoCoordinates"])) | summarize rawSigninCount = count(), countByAccount = dcount(UserId), locationCount = dcount(locationString) by AppDisplayName // tail - pick a threshold to rule out the very-high volume Azure AD apps | where rawSigninCount < 1000 // more locations than accounts | where locationCount>countByAccount // almost as many / more locations than sign-ins! | where 1.0*rawSigninCount / locationCount > 0.8 | order by rawSigninCount desc | join kind = leftouter ( azureSignIns ) on AppDisplayName | project AppDisplayName, TimeGenerated , Identity, rawSigninCount, countByAccount, locationCount, locationString = strcat(tostring(LocationDetails["countryOrRegion"]), "/", tostring(LocationDetails["state"]), "/", tostring(LocationDetails["city"]), ";" , tostring(LocationDetails["geoCoordinates"])), UserPrincipalName | extend timestamp = TimeGenerated, AccountCustomEntity = UserPrincipalName | order by AppDisplayName, TimeGenerated desc