Sameer Mhaisekar
Developer Advocate, SquaredUp
Learn how to analyze authentication patterns, detect anomalies, and enhance security monitoring using powerful KQL queries.
Developer Advocate, SquaredUp
Azure Entra ID (formerly Azure Active Directory) Sign-In logs provide a wealth of information about user authentication activity, including who signed in, from where, and with what device. However, to truly unlock the value of this data, it's essential to analyze it effectively using KQL. Let's explore how you can leverage SquaredUp's dashboard to run KQL to analyze your Azure Entra ID Sign-In logs, identify authentication trends, detect security anomalies, and optimize your overall identity management strategy.
This Azure AD dashboard covers the following:
Having Azure AD as identity provider offers convenient Single Sign On experience for users. Plus, you get increased security due to MFA and other identity protection features.
Enabling auditing and storing the results in a Log Analytics Workplace allows detailed analysis about application usage, sign-in experience, user behavior and overseeing guest activity in your tenant.
Shortly after enabling logging, events are logged in the SigninLogs table.
Now that we have the data in Azure, let's create a dashboard for it in SquaredUp.
To start, deploy the Azure plugin.
After that is done, browse through the multiple data streams (which enable you to retrieve all things Azure), and select the KQL data stream.
Next, we select the correct Azure Log Analytics workspace where we're streaming these logs.
In the parameters section, paste in your KQL query and that should return the data from your workspace. Choose the right visualization type based on what data you want to display on the dashboard, and you're done! Simple as that.
Here are the KQL queries I'm using for my dashboard.
SigninLogs
| where TimeGenerated between (startofday(ago (7d)) .. now())
| where ResultType == 0
| where UserPrincipalName matches regex @"\w+@\w+\.\w+"
| extend UserLoginType = iif(UserType == "Member","Employees","Guests")
| project UserLoginType, UserPrincipalName
| summarize dcount(UserPrincipalName) by UserLoginType
SigninLogs
| where TimeGenerated between (startofday(ago (7d)) .. now())
| where ResultType == 0
| where UserPrincipalName matches regex @"\w+@\w+\.\w+"
| extend UserLoginType = iif(UserType == "Member","Employee","Guest")
| project TimeGenerated, UserLoginType,UserPrincipalName
| summarize Employees = dcountif(UserPrincipalName,UserLoginType=="Employee"), Guests = dcountif(UserPrincipalName,UserLoginType=="Guest") by bin(TimeGenerated, 1d)
AADUserRiskEvents
| where TimeGenerated between (ago(1d) .. now())
| where RiskState != "dismissed"
| where RiskState != "remediated"
| extend readableDate = format_datetime(TimeGenerated,"yyyy-MM-dd HH:mm")
| extend Day = format_datetime(TimeGenerated,"yyyy-MM-dd")
| extend Time = format_datetime(TimeGenerated,"HH:mm")
| summarize arg_max(TimeGenerated, *) by UserPrincipalName
| project User = replace_string(UserPrincipalName,"@mydomain.com",""), readableDate, RiskLevel, RiskEventType, RiskState, tostring(Location.city), Day, Time
let MicrosoftApps = datatable (AppName: string, AppId: string )
[
"ACOM Azure Website","23523755-3a2b-41ca-9315-f81f3f566a95",
"AEM-DualAuth","69893ee3-dd10-4b1c-832d-4870354be3d8",
"ASM Campaign Servicing","0cb7b9ec-5336-483b-bc31-b15b5788de71",
"Azure Advanced Threat Protection","7b7531ad-5926-4f2d-8a1d-38495ad33e17",
"Azure Data Lake","e9f49c6b-5ce5-44c8-925d-015017e9f7ad",
"Azure Lab Services Portal","835b2a73-6e10-4aa5-a979-21dfda45231c",
"Azure Portal","c44b4083-3bb0-49c1-b47d-974e53cbdf3c",
"AzureSupportCenter","37182072-3c9c-4f6a-a4b3-b3f91cacffce",
"Bing","9ea1ad79-fdb6-4f9a-8bc3-2b70f96e34c7",
"CPIM Service","bb2a2e3a-c5e7-4f0a-88e0-8e01fd3fc1f4",
"CRM Power BI Integration","e64aa8bc-8eb4-40e2-898b-cf261a25954f",
"Dataverse","00000007-0000-0000-c000-000000000000",
"Enterprise Roaming and Backup","60c8bde5-3167-4f92-8fdb-059f6176dc0f",
"IAM Supportability","a57aca87-cbc0-4f3c-8b9e-dc095fdc8978",
"IrisSelectionFrontDoor","16aeb910-ce68-41d1-9ac3-9e1673ac9575",
"MCAPI Authorization Prod","d73f4b35-55c9-48c7-8b10-651f6f2acb2e",
"Media Analysis and Transformation Service","944f0bd1-117b-4b1c-af26-804ed95e767e",
"Media Analysis and Transformation Service2","0cd196ee-71bf-4fd6-a57c-b491ffd4fb1e",
"O365 Suite UX","4345a7b9-9a63-4910-a426-35363201d503",
"Office Delve","94c63fef-13a3-47bc-8074-75af8c65887a",
"Office Online Add-in SSO","93d53678-613d-4013-afc1-62e9e444a0a5",
"Office Online Client AAD- Augmentation Loop","2abdc806-e091-4495-9b10-b04d93c3f040",
"Office Online Client AAD- Loki","b23dd4db-9142-4734-867f-3577f640ad0c",
"Office Online Client AAD- Maker","17d5e35f-655b-4fb0-8ae6-86356e9a49f5",
"Office Online Client MSA- Loki","b6e69c34-5f1f-4c34-8cdf-7fea120b8670",
"Office Online Core SSO","243c63a3-247d-41c5-9d83-7788c43f1c43",
"Office Online Search","a9b49b65-0a12-430b-9540-c80b3332c127",
"Office.com","4b233688-031c-404b-9a80-a4f3f2351f90",
"Office365 Shell WCSS-Client","89bee1f7-5e6e-4d8a-9f3d-ecd601259da7",
"OfficeClientService","0f698dd4-f011-4d23-a33e-b36416dcb1e6",
"OfficeHome","4765445b-32c6-49b0-83e6-1d93765276ca",
"OfficeShredderWacClient","4d5c2d63-cf83-4365-853c-925fd1a64357",
"OMSOctopiPROD","62256cef-54c0-4cb4-bcac-4c67989bdc40",
"OneDrive SyncEngine","ab9b8c07-8f02-4f72-87fa-80105867a763",
"OneNote","2d4d3d8e-2be3-4bef-9f87-7875a61c29de",
"Outlook Mobile","27922004-5251-4030-b22d-91ecd9a37ea4",
"Partner Customer Delegated Admin Offline Processor","a3475900-ccec-4a69-98f5-a65cd5dc5306",
"Password Breach Authenticator","bdd48c81-3a58-4ea9-849c-ebea7f6b6360",
"Power BI Service","00000009-0000-0000-c000-000000000000",
"SharedWithMe","ffcb16e8-f789-467c-8ce9-f826a080d987",
"SharePoint Online Web Client Extensibility","08e18876-6177-487e-b8b5-cf950c1e598c",
"Signup","b4bddae8-ab25-483e-8670-df09b9f1d0ea",
"Skype for Business Online","00000004-0000-0ff1-ce00-000000000000",
"Sway","905fcf26-4eb7-48a0-9ff0-8dcc7194b5ba",
"Universal Store Native Client","268761a2-03f3-40df-8a8b-c3db24145b6b",
"Vortex [wsfed enabled]","5572c4c0-d078-44ce-b81c-6cbf8d3ed39e",
"Yammer","00000005-0000-0ff1-ce00-000000000000",
"Yammer Web","c1c74fed-04c9-4704-80dc-9f79a2e515cb",
"Yammer Web Embed","e1ef36fd-b883-4dbf-97f0-9ece4b576fc6",
"Windows Sign In","38aa3b87-a06d-4817-b275-7a316988d93b",
"PowerApps - apps.powerapps.com","3e62f81e-590b-425b-9531-cad6683656cf",
"make.powerapps.com","a8f7a65c-f5ba-4859-b2d6-df772c264e9d",
"Microsoft Azure Information Protection","c00e9d32-3c8d-4a7d-832b-029040e7db99",
"Microsoft Edge Enterprise New Tab Page","d7b530a4-7680-4c23-a8bf-c52c121d2e87",
"Microsoft Account Controls V2","7eadcef8-456d-4611-9480-4fff72b8b9e2",
"SharePoint Online Client Extensibility Web Application Principal","f7f708bc-b136-4073-b000-e730786c986e",
"Power BI Desktop","7f67af8a-fedc-4b08-8b4e-37c4d127b6cf",
"Office Online Print SSO","3ce44149-e365-40e4-9bb4-8c0ecb710fe6",
"PowerApps","4e291c71-d680-4d0e-9640-0a3358e31177",
"My Profile","8c59ead7-d703-4a27-9e55-c96a0054c8d2",
"Apple Internet Accounts","f8d98a96-0999-43f5-8af3-69971c7bb423",
"My Signins","19db86c3-b2b9-44cc-b339-36da233a3be2",
"My Apps","2793995e-0a7d-40d7-bd35-6968ba142197"
];
let MicrosoftAppIdList = MicrosoftApps | summarize MicrosoftAppIds = make_list(AppId);
let AllMembers = materialize(SigninLogs
| where TimeGenerated between (startofday(ago (7d)) .. now())
| where ResultType == 0
| where UserType == "Member"
| where UserPrincipalName matches regex @"\w+@\w+\.\w+");
AllMembers
| project TimeGenerated, Location, AppDisplayName, LoginCity=tostring(LocationDetails.city), UserPrincipalName, OSType = tostring(DeviceDetail.operatingSystem), AppId, UserType
| where tostring(AppId) !in (MicrosoftAppIdList)
| where AppDisplayName !startswith("Microsoft")
| where AppDisplayName !startswith("Office")
| where AppDisplayName !startswith("Windows")
| summarize UserCount = dcount(UserPrincipalName) by AppDisplayName
| sort by UserCount desc
| top 5 by UserCount
let MicrosoftApps = datatable (AppName: string, AppId: string )
[
"ACOM Azure Website","23523755-3a2b-41ca-9315-f81f3f566a95",
"AEM-DualAuth","69893ee3-dd10-4b1c-832d-4870354be3d8",
"ASM Campaign Servicing","0cb7b9ec-5336-483b-bc31-b15b5788de71",
"Azure Advanced Threat Protection","7b7531ad-5926-4f2d-8a1d-38495ad33e17",
"Azure Data Lake","e9f49c6b-5ce5-44c8-925d-015017e9f7ad",
"Azure Lab Services Portal","835b2a73-6e10-4aa5-a979-21dfda45231c",
"Azure Portal","c44b4083-3bb0-49c1-b47d-974e53cbdf3c",
"AzureSupportCenter","37182072-3c9c-4f6a-a4b3-b3f91cacffce",
"Bing","9ea1ad79-fdb6-4f9a-8bc3-2b70f96e34c7",
"CPIM Service","bb2a2e3a-c5e7-4f0a-88e0-8e01fd3fc1f4",
"CRM Power BI Integration","e64aa8bc-8eb4-40e2-898b-cf261a25954f",
"Dataverse","00000007-0000-0000-c000-000000000000",
"Enterprise Roaming and Backup","60c8bde5-3167-4f92-8fdb-059f6176dc0f",
"IAM Supportability","a57aca87-cbc0-4f3c-8b9e-dc095fdc8978",
"IrisSelectionFrontDoor","16aeb910-ce68-41d1-9ac3-9e1673ac9575",
"MCAPI Authorization Prod","d73f4b35-55c9-48c7-8b10-651f6f2acb2e",
"Media Analysis and Transformation Service","944f0bd1-117b-4b1c-af26-804ed95e767e",
"Media Analysis and Transformation Service2","0cd196ee-71bf-4fd6-a57c-b491ffd4fb1e",
"O365 Suite UX","4345a7b9-9a63-4910-a426-35363201d503",
"Office Delve","94c63fef-13a3-47bc-8074-75af8c65887a",
"Office Online Add-in SSO","93d53678-613d-4013-afc1-62e9e444a0a5",
"Office Online Client AAD- Augmentation Loop","2abdc806-e091-4495-9b10-b04d93c3f040",
"Office Online Client AAD- Loki","b23dd4db-9142-4734-867f-3577f640ad0c",
"Office Online Client AAD- Maker","17d5e35f-655b-4fb0-8ae6-86356e9a49f5",
"Office Online Client MSA- Loki","b6e69c34-5f1f-4c34-8cdf-7fea120b8670",
"Office Online Core SSO","243c63a3-247d-41c5-9d83-7788c43f1c43",
"Office Online Search","a9b49b65-0a12-430b-9540-c80b3332c127",
"Office.com","4b233688-031c-404b-9a80-a4f3f2351f90",
"Office365 Shell WCSS-Client","89bee1f7-5e6e-4d8a-9f3d-ecd601259da7",
"OfficeClientService","0f698dd4-f011-4d23-a33e-b36416dcb1e6",
"OfficeHome","4765445b-32c6-49b0-83e6-1d93765276ca",
"OfficeShredderWacClient","4d5c2d63-cf83-4365-853c-925fd1a64357",
"OMSOctopiPROD","62256cef-54c0-4cb4-bcac-4c67989bdc40",
"OneDrive SyncEngine","ab9b8c07-8f02-4f72-87fa-80105867a763",
"OneNote","2d4d3d8e-2be3-4bef-9f87-7875a61c29de",
"Outlook Mobile","27922004-5251-4030-b22d-91ecd9a37ea4",
"Partner Customer Delegated Admin Offline Processor","a3475900-ccec-4a69-98f5-a65cd5dc5306",
"Password Breach Authenticator","bdd48c81-3a58-4ea9-849c-ebea7f6b6360",
"Power BI Service","00000009-0000-0000-c000-000000000000",
"SharedWithMe","ffcb16e8-f789-467c-8ce9-f826a080d987",
"SharePoint Online Web Client Extensibility","08e18876-6177-487e-b8b5-cf950c1e598c",
"Signup","b4bddae8-ab25-483e-8670-df09b9f1d0ea",
"Skype for Business Online","00000004-0000-0ff1-ce00-000000000000"
"Sway","905fcf26-4eb7-48a0-9ff0-8dcc7194b5ba",
"Universal Store Native Client","268761a2-03f3-40df-8a8b-c3db24145b6b",
"Vortex [wsfed enabled]","5572c4c0-d078-44ce-b81c-6cbf8d3ed39e",
"Yammer","00000005-0000-0ff1-ce00-000000000000",
"Yammer Web","c1c74fed-04c9-4704-80dc-9f79a2e515cb",
"Yammer Web Embed","e1ef36fd-b883-4dbf-97f0-9ece4b576fc6",
"Windows Sign In","38aa3b87-a06d-4817-b275-7a316988d93b",
"PowerApps - apps.powerapps.com","3e62f81e-590b-425b-9531-cad6683656cf",
"make.powerapps.com","a8f7a65c-f5ba-4859-b2d6-df772c264e9d",
"Microsoft Azure Information Protection","c00e9d32-3c8d-4a7d-832b-029040e7db99",
"Microsoft Edge Enterprise New Tab Page","d7b530a4-7680-4c23-a8bf-c52c121d2e87",
"Microsoft Account Controls V2","7eadcef8-456d-4611-9480-4fff72b8b9e2",
"SharePoint Online Client Extensibility Web Application Principal","f7f708bc-b136-4073-b000-e730786c986e",
"Power BI Desktop","7f67af8a-fedc-4b08-8b4e-37c4d127b6cf",
"Office Online Print SSO","3ce44149-e365-40e4-9bb4-8c0ecb710fe6",
"PowerApps","4e291c71-d680-4d0e-9640-0a3358e31177",
"My Profile","8c59ead7-d703-4a27-9e55-c96a0054c8d2",
"Apple Internet Accounts","f8d98a96-0999-43f5-8af3-69971c7bb423",
"My Signins","19db86c3-b2b9-44cc-b339-36da233a3be2",
"My Apps","2793995e-0a7d-40d7-bd35-6968ba142197"
];
let MicrosoftAppIdList = MicrosoftApps | summarize MicrosoftAppIds = make_list(AppId);
let AllMembers = materialize(SigninLogs
| where TimeGenerated between (startofday(ago (7d)) .. now())
| where ResultType == 0
| where UserPrincipalName matches regex @"\w+@\w+\.\w+"
| where UserType == "Guest");
AllMembers
| project TimeGenerated, Location, AppDisplayName, UserPrincipalName, AppId
| where tostring(AppId) !in (MicrosoftAppIdList)
| where AppDisplayName !startswith("Microsoft")
| where AppDisplayName !startswith("Office")
| where AppDisplayName !startswith("Windows")
| summarize UserCount = dcount(UserPrincipalName) by AppDisplayName
| top 5 by UserCount
| sort by UserCount desc
SigninLogs
| where TimeGenerated between (startofday(ago (7d)) .. now())
| where ResultType == 0
| where UserPrincipalName matches regex @"\w+@\w+\.\w+"
| where UserPrincipalName !endswith("mydomain.com")
| where UserType == "Guest"
| project TimeGenerated, AppDisplayName, UserPrincipalName
| extend MailDomain = replace_string(extract("@\\S+$",0,UserPrincipalName),"@","")
| summarize GuestCount = dcount(UserPrincipalName) by MailDomain
| top 5 by GuestCount
A simple query to the AuditLogs
table and then some data shaping in SquaredUp.
And there you have it – a beautiful dashboard telling you all about the SignIn activities in your tenant.
Shoutout to Ruben for his work on this one!
To see what other dashboards you can create, check out our dashboard gallery.