Azure Sentinel e Microsoft TeamsAzure Sentinel and Microsoft Teams

Importante

Azure Sentinel ha ora un connettore integrato.Azure Sentinel now has an integrated connector. Per altre informazioni, vedere Collegare i log di Office 365 ad Azure Sentinel.For more information, see Connect Office 365 Logs to Azure Sentinel. Questa è la route consigliata per raccogliere questi log e sostituisce i metodi di raccolta descritti di seguito.This is the recommended route for collecting these logs and supersedes the collection methods described below.

Teams riveste un ruolo centrale nella comunicazione e nella condivisione di dati nel cloud di Microsoft 365.Teams serves a central role in communication and data-sharing in the Microsoft 365 Cloud. Poiché Teams è in contatto con così tante tecnologie nel cloud, può trarre beneficio dall'analisi automatica e manuale,Since Teams touches on so many technologies in the Cloud, it can benefit from human and automated analysis. non solo per quanto riguarda la ricerca nei log, ma anche per il monitoraggio in tempo reale delle riunioni.This applies to both hunting in logs, and real-time monitoring of meetings. Azure Sentinel offre agli amministratori queste soluzioni.Azure Sentinel offers admins these solutions.

Nota

Per un ripasso su Azure Sentinel,Need a refresher on Azure Sentinel? vedere questo articolo.This article is just the thing.

Sentinel e i log attività di Microsoft TeamsSentinel and Microsoft Teams Activity Logs

Questo articolo è incentrato sulla raccolta dei log attività di Teams in Azure Sentinel.This article focuses on collecting Teams activity logs in Azure Sentinel.

Sentinel consente agli amministratori di eseguire attività di gestione della sicurezza in un’unica posizione.Sentinel lets administrators do security management in one location. Ciò include la gestione di:This includes managing:

  • dispositivi di terze partiThird-party devices
  • Microsoft Threat ProtectionMicrosoft Threat Protection
  • Carichi di lavoro di Microsoft 365Microsoft 365 Workloads

Le cartelle di lavoro e i runbook di Sentinel possono rendere il monitoraggio della sicurezza sistematico.Sentinel workbooks and runbooks can make security monitoring systematic. Un buon primo passo in questo processo è la raccolta dei log necessari per l'analisi.A good first step in this process is collecting the logs needed analysis.

Nota

È possibile visualizzare più abbonamenti a Microsoft 365 nella stessa istanza di Azure Sentinel.More than one Microsoft 365 subscription can be surfaced in the same instance of Azure Sentinel. Questo consentirà il monitoraggio in tempo reale e la ricerca di minacce nei file di log cronologici.This will allow for realtime monitoring and hunting for threats in historical log files. Gli amministratori potranno svolgere le ricerche usando query tra risorse, ovvero all'interno di un unico gruppo di risorse, tra gruppi di risorse o in un altro abbonamento.Administrators will be able to hunt using cross-resource queries, that is within a single resource group, across resource groups, or in another subscription.

Passaggio 1: raccogliere log di Teams: abilitare i log di controllo in Microsoft 365Step 1: Collect Teams logs: Enable Audit logs in Microsoft 365

Poiché Teams registra le attività tramite Microsoft 365, i log di controllo non vengono raccolti per impostazione predefinita.Because Teams logs activity through Microsoft 365, audit logs aren't collected by default. Attivare questa funzionalità seguendo questi passaggi.Turn on this feature with these steps. I dati di Teams vengono raccolti nel log di controllo di Microsoft 365 in Audit.General.Teams data is collected in the Microsoft 365 audit under Audit.General.

Passaggio 2: collegare i log di Office 365 ad Azure SentinelStep 2: Connect Office 365 logs to Azure Sentinel

Azure sentinel fornisce un connettore incorporato per i log di Office 365, che consente di inserire i dati di Teams in Azure Sentinel e altri dati di Office 365.Azure Sentinel provides a built-in connector for Office 365 logs, which enables you to ingest Teams data into Azure Sentinel together with other Office 365 data.

In Azure Sentinel, abilitare il connettore di dati di Office 365.In Azure Sentinel, enable the Office 365 data connector. Per altre informazioni, vedere la Documentazione di Azure Sentinel.For more information, see the Azure Sentinel documentation.

Query KQL utili per la ricercaHelpful hunting KQL queries

Usare queste query per acquisire familiarità con i dati e l'ambiente di Teams.Use these queries to familiarize yourself with your Teams data and Teams environment. Conoscere l'aspetto e il comportamento che l'ambiente dovrebbe avere è un buon primo passo per riconoscere le attività sospette.Knowing how the environment should look and behave is a good first step in recognizing suspicious activity. Fatto questo, ci si può dedicare alla ricerca delle minacce.From there, you can branch out into threat hunting.

Query per utenti esterni federatiFederated external users query

Questa query consente di ottenere l'elenco dei siti di Teams con utenti esterni federati.Get the list of Teams sites that have federated external users. Questi utenti avranno un suffisso del nome di dominio e/o UPN che non è di proprietà dell'organizzazione.These users have a domain name and/or a UPN suffix that isn't owned by your organization.

In questa query di esempio l'organizzazione è proprietaria di contoso.com.In this example query, the organization owns contoso.com.

OfficeActivity
| where TimeGenerated > ago(7d)
| where Operation =~ "MemberAdded"
| where parse_json(Members)[0].Role == 3
| project TeamName, Operation, UserId, Members
| mv-expand bagexpansion=array Members
| evaluate bag_unpack(Members)

Suggerimento

Per altre informazioni sui tipi di accesso esterno e guest in Teams, vedere Comunicare con utenti di altre organizzazioni, o la sezione Tipi di partecipanti nella Guida alla sicurezza di Teams.To learn more about External and Guest access types in Teams see Communicate with users from other organizations, or the Participant Types section in the Teams Security Guide.

Chi si è unito di recente/chi ha cambiato ruoloWho recently joined / Whose role changed

Eseguire una query su uno specifico utente per controllare se è stato aggiunto a un canale di Teams negli ultimi 7 giorni o entro una settimana:Query a specific user to check if they were added to a Teams channel in the last seven days, or within a week:

OfficeActivity
| where TimeGenerated > ago(7d)
| where Operation =~ "MemberAdded"
| where Members has "<DisplayName>" or Members has "<UserPrincipalName>"
| project TeamName, Operation, UserId, Members

Controllare se il ruolo di un utente in un team è stato cambiato negli ultimi sette giorni:Query whether a user's role changed for a Team in the last seven days:

OfficeActivity
| where TimeGenerated > ago(7d)
| where Operation =~ "MemberRoleChanged"
| project TeamName, Operation, UserId, Members
| mv-expand bagexpansion=array Members
| evaluate bag_unpack(Members)
| where Role == '1'

Utenti esterni di organizzazioni sconosciute o nuoveExternal users from unknown or new organizations

In Teams è possibile aggiungere utenti esterni ai propri canali o al proprio ambiente.In Teams, you can add external users to your environment or channels. Spesso le organizzazioni hanno un numero limitato di partnership strategiche e aggiungono utenti da queste società partner.Organizations often have a limited number of key partnerships and add users from among these partners. Questa query KQL esamina gli utenti esterni aggiunti ai team che provengono da organizzazioni mai viste o aggiunte in precedenza.This KQL looks at external users added to teams who come from organizations that haven't been seen or added before.

Per altre informazioni, vedere la query nel github della community di Azure Sentinel.For more information, see the query in the Azure Sentinel community git hub.

Aggiunta e successiva rimozione di utenti esterniExternal users who were added and then removed

Gli utenti malintenzionati con qualche livello di accesso esistente possono aggiungere un nuovo account esterno a Teams per accedere ed esfiltrare dati.Attackers with some level of existing access may add a new external account to Teams to access and exfiltrate data. Possono anche rimuovere rapidamente l'utente per nascondere l'accesso.They may also quickly remove that user to hide that they made access. Questa query cerca account esterni aggiunti a Teams e rimossi rapidamente, per identificare comportamenti sospetti.This query hunts for external accounts that are added to Teams and swiftly removed to help identify suspicious behavior.

Per altre informazioni, vedere la query nel github della community di Azure Sentinel.For more information, see the query in the Azure Sentinel community git hub.

Aggiunta di nuovi bot o applicazioniNew bot or application added

Teams può includere app o bot in un team per estendere il set di caratteristiche (incluse le app e i bot personalizzati).Teams can include apps or bots in a Team to extend the feature set (including custom apps and bots). In alcuni casi, un'app o un bot può essere usato per persistenza in Teams senza bisogno di un account utente e può accedere ai file e ad altri dati.In some cases, an app or bot can be used for persistence in Teams without needing a user account, and can access files and other data. Questa query cerca nuove app o bot in Teams.This query hunts for apps or bots that are new to Teams.

Per altre informazioni, vedere la query nel github della community di Azure Sentinel.For more information, see the query in the Azure Sentinel community git hub.

Account utente proprietari di un numero elevato di teamUser accounts who are Owners of large numbers of Teams

Gli utenti malintenzionati che provano a elevare i propri privilegi possono assegnare a se stessi privilegi proprietario di un numero elevato di team diversi,Attackers looking to elevate their privileges may assign themselves Owner privileges of a large number of diverse teams. mentre In genere, gli utenti creano e possiedono un numero limitato di team su argomenti specifici.Usually, users create and own a few teams around specific topics. Questa query KQL cerca i comportamenti sospetti.This KQL query looks for suspicious behavior.

Per altre informazioni, vedere la query nel github della community di Azure Sentinel.For more information, see the query in the Azure Sentinel community git hub.

Numerose eliminazioni di team da parte di un singolo utenteMany Team deletions by a single user

Gli utenti malintenzionati possono causare interruzioni e mettere in pericolo progetti e dati eliminando più team.Attackers can cause disruptions and jeopardize projects and data by deleting multiple teams. Poiché i team vengano generalmente eliminati dai singoli proprietari, l'eliminazione centrale di molti team può essere un segnale di problemi.Since teams are usually deleted by individual Owners, central deletion of many teams can be a sign of trouble. Questa query KQL cerca singoli utenti che eliminano più team.This KQL looks for single users who delete multiple teams.

Per altre informazioni, vedere la query nel github della community di Azure Sentinel.For more information, see the query in the Azure Sentinel community git hub.

Espansione delle opportunità di ricerca delle minacceExpanding your threat hunting opportunities

Combinando le query di risorse come Azure Active Directory (Azure AD) o altri carichi di lavoro di Office 365 possono essere usati con le query di Teams.Combining queries from resources like Azure Active Directory (Azure AD), or other Office 365 workloads can be used with Teams queries. Per esempio, combinare il rilevamento degli schemi sospetti nei log di accesso (SigninLogs) di Azure AD e usare tali output durante la ricerca dei proprietari del team.For example, combine the detection of suspicious patterns in Azure AD SigninLogs, and use that output while hunting for Team Owners.

let timeRange = 1d;
let lookBack = 7d;
let threshold_Failed = 5;
let threshold_FailedwithSingleIP = 20;
let threshold_IPAddressCount = 2;
let isGUID = "[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}";
let azPortalSignins = SigninLogs
| where TimeGenerated >= ago(timeRange)
// Azure Portal only and exclude non-failure Result Types
| where AppDisplayName has "Azure Portal" and ResultType !in ("0", "50125", "50140")
// Tagging identities not resolved to friendly names
| extend Unresolved = iff(Identity matches regex isGUID, true, false);
// Lookup up resolved identities from last 7 days
let identityLookup = SigninLogs
| where TimeGenerated >= ago(lookBack)
| where not(Identity matches regex isGUID)
| summarize by UserId, lu_UserDisplayName = UserDisplayName, lu_UserPrincipalName = UserPrincipalName;
// Join resolved names to unresolved list from portal signins
let unresolvedNames = azPortalSignins | where Unresolved == true | join kind= inner (
   identityLookup ) on UserId
| extend UserDisplayName = lu_UserDisplayName, UserPrincipalName = lu_UserPrincipalName
| project-away lu_UserDisplayName, lu_UserPrincipalName;
// Join Signins that had resolved names with list of unresolved that now have a resolved name
let u_azPortalSignins = azPortalSignins | where Unresolved == false | union unresolvedNames;
let failed_signins = (u_azPortalSignins
| extend Status = strcat(ResultType, ": ", ResultDescription), OS = tostring(DeviceDetail.operatingSystem), Browser = tostring(DeviceDetail.browser)
| extend FullLocation = strcat(Location,'|', LocationDetails.state, '|', LocationDetails.city)
| summarize TimeGenerated = makelist(TimeGenerated), Status = makelist(Status), IPAddresses = makelist(IPAddress), IPAddressCount = dcount(IPAddress), FailedLogonCount = count()
by UserPrincipalName, UserId, UserDisplayName, AppDisplayName, Browser, OS, FullLocation
| mvexpand TimeGenerated, IPAddresses, Status
| extend TimeGenerated = todatetime(tostring(TimeGenerated)), IPAddress = tostring(IPAddresses), Status = tostring(Status)
| project-away IPAddresses
| summarize StartTime = min(TimeGenerated), EndTime = max(TimeGenerated) by UserPrincipalName, UserId, UserDisplayName, Status, FailedLogonCount, IPAddress, IPAddressCount, AppDisplayName, Browser, OS, FullLocation
| where (IPAddressCount >= threshold_IPAddressCount and FailedLogonCount >= threshold_Failed) or FailedLogonCount >= threshold_FailedwithSingleIP
| project UserPrincipalName);
OfficeActivity
| where TimeGenerated > ago(time_window)
| where Operation =~ "MemberRoleChanged"
| mv-expand bagexpansion=array Members
| evaluate bag_unpack(Members)
| where Role == '2'
| where Members in (failed_signins)

Inoltre, è possibile rendere i rilevamenti in SigninLogs specifici per Teams, aggiungendo un filtro per i soli accessi basati su Teams usando:Also, you can make the SigninLogs detections specific to Teams by adding a filter for only Teams-based logons by using:

| where AppDisplayName has 'Teams'

Per spiegare meglio l'uso di in cui AppDisplayName include Teams, la query KQL seguente illustra un accesso riuscito da un indirizzo IP con un errore da un indirizzo IP diverso, ma con ambito limitato agli accessi di Teams:To help explain using where AppDisplayName has Teams further, the KQL you see below demonstrates a successful logon from one IP address with failure from a different IP address, but scoped to only Teams sign-ins:

let timeFrame = 1d;
let logonDiff = 10m;
SigninLogs 
  | where TimeGenerated >= ago(timeFrame) 
  | where ResultType == "0" 
  | where AppDisplayName has "Teams"
  | project SuccessLogonTime = TimeGenerated, UserPrincipalName, SuccessIPAddress = IPAddress, AppDisplayName, SuccessIPBlock = strcat(split(IPAddress, ".")[0], ".", split(IPAddress, ".")[1])
  | join kind= inner (
      SigninLogs 
      | where TimeGenerated >= ago(timeFrame) 
      | where ResultType !in ("0", "50140") 
      | where ResultDescription !~ "Other"  
      | where AppDisplayName startswith "Microsoft Teams"
      | project FailedLogonTime = TimeGenerated, UserPrincipalName, FailedIPAddress = IPAddress, AppDisplayName, ResultType, ResultDescription
  ) on UserPrincipalName, AppDisplayName 
  | where SuccessLogonTime < FailedLogonTime and FailedLogonTime - SuccessLogonTime <= logonDiff and FailedIPAddress !startswith SuccessIPBlock
  | summarize FailedLogonTime = max(FailedLogonTime), SuccessLogonTime = max(SuccessLogonTime) by UserPrincipalName, SuccessIPAddress, AppDisplayName, FailedIPAddress, ResultType, ResultDescription 
  | extend timestamp = SuccessLogonTime, AccountCustomEntity = UserPrincipalName, IPCustomEntity = SuccessIPAddress

Informazioni e aggiornamenti importantiImportant information and updates

Grazie per la collaborazione sui contenuti a Pete Bryan, Nicholas DiCola e Matthew Lowe.Thank you for content collaboration, Pete Bryan, Nicholas DiCola, and Matthew Lowe. Pete Bryan e i suoi collaboratori continueranno a sviluppare query di rilevamento e ricerca per Teams.Pete Bryan, and people he collaborates with, continue to develop detection and hunting queries for Teams.

Consultare questo repository Github per gli aggiornamenti.Stay in touch with this Git Hub repository for updates.

Controllare la disponibilità di aggiornamenti per il parser e l'app per la logica usati in questo articolo.Watch for updates to the parser and logic app used in this article.

Si può anche entrare a far parte della community di Azure Sentinel.You should also join (and contribute to) the Azure Sentinel community. Microsoft sta cercando attivamente feedback su questo articolo, quindi usare l’opzione per il feedback riportata di seguito.We are actively looking for feedback on this article, so please use the feedback option below. Grazie a tutti e buona caccia alle minacce.Thank you & Happy hunting.

Registrazione dell'applicazione in Azure ADRegistering your application in Azure AD

Abilitare o disabilitare la ricerca nel log di controlloTurn audit log search on or off

Che cos'è Azure Sentinel?What is Azure Sentinel?