============================================================
 Emergenza Microsoft 365 — 10 script PowerShell
 Contenimento, raccolta delle prove, primo report
 SynSphere Italia · https://synsphere.it
============================================================

LEGGERE QUESTA PAGINA PRIMA DI LANCIARE QUALSIASI COSA.
Questo toolkit contiene l'unico script della linea SynSphere che ferma l'azienda.


COSA C'E' DENTRO

  01-Test-PrerequisitiEmergenza.ps1   Go/no-go: quali fonti esistono davvero su questo tenant
  02-Backup-StatoUtenti.ps1           Fotografia dello stato PRIMA del blocco  [OBBLIGATORIO]
  03-Invoke-BloccoEmergenza.ps1       CONTENIMENTO: disabilita e revoca le sessioni  [SCRIVE]
  04-Restore-StatoUtenti.ps1          Ripristino allo stato fotografato             [SCRIVE]
  05-Export-SignInLogs.ps1            Accessi Entra ID + triage degli accessi riusciti
  06-Export-AuditLogEntra.ps1         Log di controllo Entra + azioni di persistenza
  07-Export-UnifiedAuditLog.ps1       Log unificato (Exchange, SharePoint, Teams, Entra)
  08-Export-MessageTrace.ps1          Posta in transito, con Get-MessageTraceV2
  09-Export-RegolePostaEInoltri.ps1   Regole e inoltri: la persistenza dentro le cassette
  10-New-ReportIncidente.ps1          Report HTML unico dai CSV raccolti

  Otto script su dieci sono di SOLA LETTURA. I due che scrivono sono il 03 e il 04,
  e sono entrambi in SIMULAZIONE per default: senza -Esegui non toccano nulla.


ORDINE IN EMERGENZA

  01 -> 02 -> 03 -> 05 -> 06 -> 09 -> 07 -> 08 -> 10 -> 04

  Il 02 va SEMPRE prima del 03. Senza quella fotografia il blocco non e' reversibile:
  dopo, non esiste piu' modo di sapere quali account erano gia' disabilitati prima
  dell'incidente, e riabilitarli tutti rimetterebbe in servizio ex dipendenti e utenze
  chiuse apposta.

  Il 04 va per ultimo, a ondate, e mai prima di aver guardato il 09.


LE TRE COSE CHE SI SBAGLIANO PIU' SPESSO

  1. BLOCCARE SENZA REVOCARE LE SESSIONI.
     Disabilitare l'account non invalida i token di aggiornamento gia' emessi. L'attaccante
     continua a leggere la posta per ore su un account che nel portale risulta bloccato.
     Lo script 03 revoca le sessioni per default: non usare -NonRevocareSessioni.

  2. CREDERE CHE IL BLOCCO CHIUDA TUTTO.
     Non tocca le regole della posta in arrivo, gli inoltri di cassetta e i consensi
     applicativi. Un consenso OAuth concesso a un'app malevola continua a leggere la posta
     dopo il blocco, dopo il cambio password e dopo la revoca delle sessioni. Si trovano
     con gli script 09 e 06, e vanno rimossi a mano prima del rientro.

  3. BLOCCARE UN TENANT IBRIDO SOLO LATO CLOUD.
     Sugli account sincronizzati da Active Directory il blocco viene sovrascritto al
     successivo ciclo di sincronizzazione. Vanno disabilitati in AD. Gli script 02 e 03 li
     contano e li segnalano a parte.


QUANTO INDIETRO SI PUO' GUARDARE (non e' negoziabile)

  Sign-in log Entra ID     30 giorni con P1/P2 — 7 giorni con Entra ID Free
                           Richiedono Entra ID P1 o P2. Su Business Basic e Standard NON
                           esistono via API: la chiamata fallisce con un errore che somiglia
                           a un problema di permessi. Business Premium include P1.
  Log di controllo Entra   30 giorni con P1/P2
  Log di controllo unificato
                           180 giorni con Audit Standard (default dal 17 ottobre 2023)
                           1 anno solo con Audit Premium / E5
                           E solo se la registrazione era GIA' ATTIVA quando i fatti sono
                           accaduti: accenderla ora non recupera il passato.
  Message trace            90 giorni, massimo 10 giorni per interrogazione


PREREQUISITI

  - PowerShell 5.1+ oppure PowerShell 7
  - Microsoft Graph:  Install-Module Microsoft.Graph -Scope CurrentUser
  - Exchange Online:  Install-Module ExchangeOnlineManagement -Scope CurrentUser
                      SERVE LA VERSIONE 3.7.0 O SUPERIORE: Get-MessageTraceV2 non esiste
                      prima, e Get-MessageTrace, il cmdlet storico, e' deprecato dal
                      1 settembre 2025 (supporto legacy chiuso il 18 marzo 2026).
                      Verifica:  Get-Module -ListAvailable ExchangeOnlineManagement
                      Aggiorna:  Update-Module ExchangeOnlineManagement

RUOLI

  Sola lettura (script 01, 02, 05, 06, 07, 08, 09):
      Global Reader                            parte Microsoft Graph
      Security Reader oppure Reports Reader    sign-in log e log di controllo
      View-Only Organization Management        parte Exchange
      View-Only Audit Logs                     log di controllo unificato

  Scrittura (script 03 e 04):
      User Administrator                       disabilitare e riabilitare gli account
      oppure Global Administrator

  Permessi Graph richiesti dagli script che scrivono:
      User.ReadWrite.All, Directory.ReadWrite.All


PRIMA DI LANCIARE IL 03

  [ ] Il 02 e' stato eseguito e il CSV e' salvato FUORI DAL TENANT (chiavetta, altro cloud).
  [ ] Esiste almeno un'utenza di emergenza (break-glass) funzionante e non compromessa,
      da passare in -Escludi.
  [ ] La decisione di fermare l'azienda e' stata presa da chi ha l'autorita' per prenderla,
      ed e' scritta da qualche parte con l'ora.
  [ ] Il 03 e' stato lanciato PRIMA in simulazione (senza -Esegui) e l'elenco e' stato letto.

  Lo script esclude sempre e comunque l'account con cui state eseguendo, e per default
  esclude i Global Administrator. Se l'attaccante ha compromesso un'utenza amministrativa
  servira' -IncludiAdmin: verificate prima di avere un break-glass, o resterete fuori.


ESEMPIO DI SESSIONE COMPLETA

  .\01-Test-PrerequisitiEmergenza.ps1
  .\02-Backup-StatoUtenti.ps1
  .\03-Invoke-BloccoEmergenza.ps1 -SnapshotCsv .\IR-02-StatoUtenti-20260828-1030.csv
  # letto l'elenco, si esegue davvero:
  .\03-Invoke-BloccoEmergenza.ps1 -SnapshotCsv .\IR-02-StatoUtenti-20260828-1030.csv `
      -Escludi 'breakglass@contoso.com' -Esegui
  .\05-Export-SignInLogs.ps1
  .\06-Export-AuditLogEntra.ps1
  .\09-Export-RegolePostaEInoltri.ps1
  .\07-Export-UnifiedAuditLog.ps1 -Giorni 90
  .\08-Export-MessageTrace.ps1 -Giorni 30
  .\10-New-ReportIncidente.ps1 -Cliente 'Contoso Srl'
  # dopo le bonifiche, il rientro a ondate:
  .\04-Restore-StatoUtenti.ps1 -SnapshotCsv .\IR-02-StatoUtenti-20260828-1030.csv `
      -Utenti 'mario.rossi@contoso.com' -Esegui


UNA NOTA SUL REPORT

  Il report dello script 10 distingue sempre una fonte ASSENTE da una fonte VUOTA. Dove un
  CSV non e' stato raccolto scrive "n.d.", non zero. "Nessun accesso sospetto" quando i
  sign-in log non sono mai stati scaricati e' la conclusione piu' pericolosa che uno
  strumento come questo possa produrre.

  Il report raccoglie indizi. Non stabilisce se ci sia stata una compromissione: quella
  resta una valutazione umana.


COSA QUESTO TOOLKIT NON FA

  - Non rimuove le regole malevole ne' i consensi applicativi: li trova e li elenca.
    La rimozione va decisa caso per caso, perche' alcune regole sono legittime.
  - Non forza il cambio password: e' una scelta che dipende dal piano di rientro.
  - Non sostituisce una risposta agli incidenti condotta da persone. Serve a non perdere
    le prime ore, che sono quelle in cui si perdono le prove.

  Se serve supporto durante un incidente in corso: https://synsphere.it/contattaci


------------------------------------------------------------
Fornito "as is", senza garanzie. Testare in un ambiente di prova.
Gli script che scrivono sono in simulazione per default: usarla.
SynSphere Italia — https://synsphere.it
------------------------------------------------------------
