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.
Neste artigo
O que está incluído e como se activa
O Purview Audit tem duas camadas:
- 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. - 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.
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
- 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.
- Acesso ao portal — o papel de auditoria só deve estar em quem investiga — para auditoria silenciosa, usar conta dedicada.
- 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
- Microsoft Purview Audit solutions overview (Microsoft Learn)
- Audit log retention policies (Microsoft Learn)
- Search the audit log in the Microsoft Purview portal (Microsoft Learn)
- Get started with auditing solutions (Microsoft Learn)
- Audit logs for Copilot and AI applications (Microsoft Learn)
- Official audit log search script (Microsoft Learn)