Unified Audit Log: Auditoria M365 com Search-UnifiedAuditLog

Quando um administrador pergunta “quem apagou este ficheiro?” ou “que admin desligou a MFA?”, a resposta está num sítio só: o Unified Audit Log. Todos os eventos auditáveis do M365 — Exchange, SharePoint, OneDrive, Entra ID, Power BI, Copilot — convergem para o mesmo repositório, pesquisável desde o portal Purview, PowerShell ou Graph API.

O que está incluído e como se activa

O Purview Audit tem duas camadas:

  1. Audit (Standard) — incluída nas licenças E3/Business mais comuns. Activa por omissão: regista milhares de eventos pesquisáveis, com audit search tool no portal Purview, Search-UnifiedAuditLog, exportação para CSV e acesso pela Graph API e Management Activity API.
  2. Audit (Premium) — requer E5 (ou add-on eDiscovery and Audit). Acrescenta retenção de 1 ano por utilizador licenciado, a 10 anos com o 10-Year Audit Log Retention add-on, políticas de retenção personalizadas e eventos inteligentes (Exchange mailbox auditing completo, incl. MailItemsAccessed e Send).

⚠️ Atenção

os registos gerados por entidades não-utilizador (service principals, eventos de sistema e aplicações) retêm-se 1 ano fixo, sem políticas personalizadas — nem Premium muda isso.

Retenção: o que mudou e o que é real

  • 180 dias é a retenção de omissão do Audit (Standard) para registos de actividade de utilizador — o valor subiu de 90 para 180 dias em 17 de Outubro de 2023
  • O default policy do Purview retém 1 ano os registos do Exchange, SharePoint, OneDrive e Entra (workload AzureActiveDirectory/Exchange/OneDrive/SharePoint) para utilizadores com licença E5/Purview Suite/add-on — e com o serviço Microsoft 365 Advanced Auditing activo por utilizador. Utilizador sem E5 = 180 dias.
  • Até 10 anos com policies customizadas e o add-on do licenciamento certo, por utilizador específico.

A pergunta de diagnóstico “quanto tempo tenho de log?” responde-se por licença: E3 = 180 dias, E5 = 1 ano (10 com add-on) e entidades de sistema = 1 ano sempre.

Pesquisar: Search-UnifiedAuditLog

O cmdlet de referência — requer o papel View-Only Audit Logs ou Audit Logs no Exchange Online:

Connect-ExchangeOnline
# Um range de 24h, tipo de registo Entra:
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-1) `
-EndDate (Get-Date) -RecordType AzureActiveDirectory `
-ResultSize 5000

Os dois casos da abertura deste guia — quem apagou o ficheiro e quem desligou a MFA — saem assim, com os parâmetros apontados:

# Quem apagou um ficheiro — OneDrive/SharePoint, últimos 30 dias
# (a URL completa do ficheiro no -ObjectID aperta o resultado)
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date) `
-RecordType SharePointFileOperation -Operations FileDeleted,FileRecycled `
-ObjectID "https://contoso-my.sharepoint.com/personal/ana/Documents/Plano2027.xlsx" `
-ResultSize 100
# UserId = quem apagou · ObjectId = o ficheiro · TimeStamp + ClientIP = quando e de onde
# FileRecycled manda o ficheiro para a reciclagem; as operações
# FileDeletedFirstStageRecycleBin e FileDeletedSecondStageRecycleBin
# registam as passagens de fase seguintes

Cada linha de resultado traz UserId (quem executou), ObjectId (o ficheiro, com a URL completa — o -ObjectID aperta a pesquisa ao alvo) e TimeStamp/ClientIP. O rasto de reciclagem importa: FileRecycled segue-se nas operações de reciclagem; as operações de 1.ª e 2.ª fase (FileDeletedFirstStageRecycleBin, FileDeletedSecondStageRecycleBin) registam o esvaziamento.

# Quem desligou a MFA: o nome da operação tem um ponto final
$r = Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date) `
-RecordType AzureActiveDirectory -Operations "Update user." -ResultSize 5000
$r | ForEach-Object { $j = $_.AuditData | ConvertFrom-Json $m = $j.ModifiedProperties | Where-Object Name -eq 'StrongAuthenticationRequirement' if ($m -and $m.OldValue -ne '[]' -and $m.NewValue -eq '[]') { $_.CreationDate, $_.UserIds } }
# OldValue != [] e NewValue = [] isola a desactivação —
# o match cru também apanha activações e alterações
# UserIds = o admin que executou · ObjectId (no JSON) = o visado

Na MFA, o ponto final do nome ("Update user.") decide se a pesquisa devolve algo — sem ele, nada sai. A assinatura da desactivação: na lista ModifiedProperties, a entrada StrongAuthenticationRequirement com OldValue != [] e NewValue == [] — o mesmo padrão que a Microsoft usa no playbook de resposta a incidentes. Para regras de Conditional Access, a operação é Update conditional access policy.

Para volumes grandes, o padrão é o script oficial de audit log search: divide o intervalo em janelas de 60 minutos ($intervalMinutes), usa -SessionCommand ReturnLargeSet com um SessionId único por extracção e escreve os registos em CSV (export-csv -Append). As variáveis a configurar ($start, $end, $record, $resultSize, $intervalMinutes) ficam nas primeiras linhas do script.

Limitações que convém conhecer: o Retention (Standard) de 180 dias aplica-se a actividades de utilizador com licença E3/Business (a licença é o que activa o registo). O ResultSize máximo por chamada é 5.000 e o ReturnLargeSet pagina até 50.000 por sessão — acima disso, dividir o intervalo de datas.

Audit search na Graph API

Para automação fora do PowerShell, o auditLogQuery da Graph API:


GET https://graph.microsoft.com/v1.0/security/auditLog/queries
POST https://graph.microsoft.com/v1.0/security/auditLog/queries

Cria-se um search job com filtros de data/serviço, consulta-se o estado e exporta-se o resultado — o mesmo Unified Audit Log, consumível por SIEM ou runbook. Permissões da Graph: a mínima é AuditLogsQuery-Entra.Read.All; há variantes por serviço (AuditLogsQuery-Exchange.Read.All, AuditLogsQuery-SharePoint.Read.All, AuditLogsQuery-OneDrive.Read.All) e a global AuditLogsQuery.Read.All. A AuditLog.Read.All é outra permissão — não é a que o auditLogQuery pede.

Pesquisa de auditoria no portal Microsoft Purview com os resultados por semana numa tabela de colunas Data (UTC), IP, Utilizador, Tipo de registo, Actividade, Item e Detalhes

O mesmo registo, visto no portal (Audit > Audit search) — imagem oficial Microsoft Learn

Auditoria a Copilot e aplicações de IA

A parte que a maior parte das PME ainda não conhece: o Purview Audit regista interacções com Copilot e aplicações de IA:

  • Tipo de registo CopilotInteraction (workload Copilot) para interacções de utilizador com Copilotos desenvolvidos pela Microsoft incluído no Audit (Standard) — Microsoft 365 Copilot, Cowork, Security Copilot
  • ConnectedAiAppInteraction para aplicações de terceiros fora do tenant — a contagem pay-as-you-go aplica-se a alguns cenários (a documentação diverge entre páginas), com retenção de 180 dias
  • Aplicações construídas em Copilot Studio surgem como CopilotInteraction — incluídas no Audit (Standard)
  • Campos de ID da app (Copilot.Studio.AppId ou ConnectedAIApp.Entra.AppId) permitem filtrar por aplicação concreta

Num cenário de governação de IA, a pergunta “quem usou o Copilot neste documento?” é respondida no próprio audit log — sem ferramenta extra.

Exportar e reter: boas práticas PME

  1. Exportar para fora — com 180 dias de omissão, o backup do log é do admin: exportação periódica do CSV (script oficial) ou ingestão em SIEM via Graph API/Management Activity API.
  2. Acesso ao portal — o papel de auditoria só deve estar em quem investiga — para auditoria silenciosa, usar conta dedicada.
  3. Alertas — os eventos críticos (alterações a papéis de admin, criação de forwarding, remoção de acesso) podem alimentar alertas no Defender for Cloud Apps ou Sentinel, evitando depender da pesquisa manual.

Erros Comuns

Achar que o audit log retém 90 dias — o valor mudou para 180 dias em Outubro de 2023. Planos de retenção antigos podem estar calibrados para o mínimo errado.

Pesquisar sem papel no Exchange Online — o requisito de auditoria é um papel (View-Only Audit Logs ou Audit Logs no Exchange Online; Audit Reader/Audit Manager no Purview): atribuir o papel de Compliance/Admin que contém o direito de auditoria.

Extrair 1 ano de dados numa só chamada — o padrão do script oficial divide o intervalo em janelas (60 min de omissão) com SessionId e ReturnLargeSet: uma chamada única com ResultSize 5.000 devolve só a primeira página.

Ignorar as entidades não-utilizador — service principals, sistema e aplicações ficam 1 ano fixo — nem por Premium muda: qualquer política de retenção personalizada não se aplica a esses registos, e o design do SIEM deve contar com isso.

Pagar 10 anos sem precisar — o add-on de 10 anos é por utilizador e a escolha tem de se basear em requisitos de compliance por utilizador, não à floresta inteira por omissão.

Checklist

  • [ ] Licenciamento mapeado (quem é E5 e quem não é) e retenção por utilizador documentada
  • [ ] Papel View-Only Audit Logs atribuído à equipa de investigação
  • [ ] Script oficial de exportação agendado (ou SIEM via Graph API)
  • [ ] CopilotInteraction (apps Microsoft e Copilot Studio) / ConnectedAiAppInteraction e AIAppInteraction de terceiros — pay-as-you-go por cenário, confirmar o caso
  • [ ] 1 ano fixo de entidades não-utilizador no design da retenção
  • [ ] Alertas em eventos de admin (papéis, forwarding, MFA) — não dependência da pesquisa manual

Artigos Relacionados

Fontes Oficiais

  1. Microsoft Purview Audit solutions overview (Microsoft Learn)
  2. Audit log retention policies (Microsoft Learn)
  3. Search the audit log in the Microsoft Purview portal (Microsoft Learn)
  4. Get started with auditing solutions (Microsoft Learn)
  5. Audit logs for Copilot and AI applications (Microsoft Learn)
  6. Official audit log search script (Microsoft Learn)