Microsoft Sentinel e Microsoft Teams

Importante

Microsoft Sentinel dispone ora di un connettore integrato. Per ulteriori informazioni, vedere Connettersi Office 365 Logs a Microsoft Sentinel. Questa è la route consigliata per raccogliere questi log e sostituisce i metodi di raccolta descritti di seguito.

Teams riveste un ruolo centrale nella comunicazione e nella condivisione di dati nel cloud di Microsoft 365. Poiché Teams è in contatto con così tante tecnologie nel cloud, può trarre beneficio dall'analisi automatica e manuale, non solo per quanto riguarda la ricerca nei log, ma anche per il monitoraggio in tempo reale delle riunioni. Microsoft Sentinel offre agli amministratori queste soluzioni.

Nota

Hai bisogno di un aggiornamento su Microsoft Sentinel? vedere questo articolo.

Sentinel e i log attività di Microsoft Teams

Questo articolo è incentrato sulla raccolta dei log attività di Teams in Microsoft Sentinel.

Sentinel consente agli amministratori di eseguire attività di gestione della sicurezza in un’unica posizione. Ciò include la gestione di:

  • dispositivi di terze parti
  • Microsoft Threat Protection
  • Carichi di lavoro di Microsoft 365

Le cartelle di lavoro e i runbook di Sentinel possono rendere il monitoraggio della sicurezza sistematico. Un buon primo passo in questo processo è la raccolta dei log necessari per l'analisi.

Nota

Più abbonamenti a Microsoft 365 possono essere visualizzati nella stessa istanza di Microsoft Sentinel. Questo consentirà il monitoraggio in tempo reale e la ricerca di minacce nei file di log cronologici. 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.

Passaggio 1: raccogliere log di Teams: abilitare i log di controllo in Microsoft 365

Poiché Teams registra le attività tramite Microsoft 365, i log di controllo non vengono raccolti per impostazione predefinita. Attivare questa funzionalità seguendo questi passaggi. I dati di Teams vengono raccolti nel log di controllo di Microsoft 365 in Audit.General.

Passaggio 2: Connettere i registri di Office 365 a Microsoft Sentinel

Microsoft Sentinel fornisce un connettore incorporato per i log di Office 365, che consente di inserire i dati di Teams in Microsoft Sentinel insieme ad altri dati Office 365.

In Microsoft Sentinel, abilitare il connettore dati Office 365. Per ulteriori informazioni, vedi la documentazione di Microsoft Sentinel.

Query KQL utili per la ricerca

Usare queste query per acquisire familiarità con i dati e l'ambiente di Teams. Conoscere l'aspetto e il comportamento che l'ambiente dovrebbe avere è un buon primo passo per riconoscere le attività sospette. Fatto questo, ci si può dedicare alla ricerca delle minacce.

Query per utenti esterni federati

Questa query consente di ottenere l'elenco dei siti di Teams con utenti esterni federati. Questi utenti avranno un suffisso del nome di dominio e/o UPN che non è di proprietà dell'organizzazione.

In questa query di esempio l'organizzazione è proprietaria di 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)

Mancia

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.

Chi si è unito di recente/chi ha cambiato ruolo

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:

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:

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 nuove

In Teams è possibile aggiungere utenti esterni ai propri canali o al proprio ambiente. Spesso le organizzazioni hanno un numero limitato di partnership strategiche e aggiungono utenti da queste società partner. Questa query KQL esamina gli utenti esterni aggiunti ai team che provengono da organizzazioni mai viste o aggiunte in precedenza.

Per ulteriori informazioni, vedi la query nell'hub git della community di Microsoft Sentinel.

Aggiunta e successiva rimozione di utenti esterni

Gli utenti malintenzionati con qualche livello di accesso esistente possono aggiungere un nuovo account esterno a Teams per accedere ed esfiltrare dati. Possono anche rimuovere rapidamente l'utente per nascondere l'accesso. Questa query cerca account esterni aggiunti a Teams e rimossi rapidamente, per identificare comportamenti sospetti.

Per ulteriori informazioni, vedi la query nell'hub git della community di Microsoft Sentinel.

Aggiunta di nuovi bot o applicazioni

Teams può includere app o bot in un team per estendere il set di caratteristiche (incluse le app e i bot personalizzati). 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. Questa query cerca nuove app o bot in Teams.

Per ulteriori informazioni, vedi la query nell'hub git della community di Microsoft Sentinel.

Account utente proprietari di un numero elevato di team

Gli utenti malintenzionati che provano a elevare i propri privilegi possono assegnare a se stessi privilegi proprietario di un numero elevato di team diversi, mentreIn genere, gli utenti creano e possiedono un numero limitato di team su argomenti specifici. Questa query KQL cerca i comportamenti sospetti.

Per ulteriori informazioni, vedi la query nell'hub git della community di Microsoft Sentinel.

Numerose eliminazioni di team da parte di un singolo utente

Gli utenti malintenzionati possono causare interruzioni e mettere in pericolo progetti e dati eliminando più team. Poiché i team vengano generalmente eliminati dai singoli proprietari, l'eliminazione centrale di molti team può essere un segnale di problemi. Questa query KQL cerca singoli utenti che eliminano più team.

Per ulteriori informazioni, vedi la query nell'hub git della community di Microsoft Sentinel.

Espansione delle opportunità di ricerca delle minacce

La combinazione di query da risorse come ID Microsoft Entra o altri carichi di lavoro Office 365 può essere usata con le query di Teams. Ad esempio, combinare il rilevamento di modelli sospetti in Microsoft Entra SigninLogs e usare tale output durante la ricerca di proprietari del team.

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:

| where AppDisplayName has 'Teams'

Per spiegare meglio l'uso diin 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:

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 importanti

Grazie per la collaborazione sui contenuti a Pete Bryan, Nicholas DiCola e Matthew Lowe. Pete Bryan e i suoi collaboratori continueranno a sviluppare query di rilevamento e ricerca per Teams.

Consultare questo repository Github per gli aggiornamenti.

Controllare la disponibilità di aggiornamenti per il parser e l'app per la logica usati in questo articolo.

Si può anche entrare a far parte della community di Azure Sentinel. Microsoft sta cercando attivamente feedback su questo articolo, quindi usare l’opzione per il feedback riportata di seguito. Grazie a tutti e buona caccia alle minacce.

Registrazione dell'applicazione nell'ID Microsoft Entra

Abilitare o disabilitare la ricerca nel log di controllo

Che cos'è Azure Sentinel?