Backup e Recuperação do Entra ID: Proteger Configurações Cloud do Microsoft 365

Duarte Spínola  |  2026-07-10

Muitas PMEs assumem que o Microsoft 365 e o Entra ID são “automaticamente” backed up pela Microsoft. A realidade é diferente: a Microsoft garante a disponibilidade do serviço (SLA de 99,9%), mas não protege contra eliminação acidental de utilizadores, alterações indevidas de Conditional Access, remoção de políticas Intune ou perda de configurações. Este guia mostra como proteger as configurações cloud do Entra ID, com base na Microsoft Graph API, Microsoft Graph PowerShell SDK e Entra ID Audit Logs.

⚠️ Aviso

A Microsoft mantém utilizadores eliminados por 30 dias (restauráveis via Entra ID admin center). Mas Conditional Access policies, Intune policies, app registrations e service principals não têm recycle bin — uma vez eliminados, só são recuperáveis se tiveres backup próprio.

Conteúdos

1. O Problema: O que a Microsoft Não Protege

O contrato de serviço da Microsoft (SLA) garante que o serviço está disponível — mas a responsabilidade dos dados é do cliente. Isto é o modelo de responsabilidade partilhada:

Cenário Microsoft protege? Quem é responsável?
Falha do datacenter Microsoft ✅ Sim (SLA 99,9%) Microsoft
Ransomware encripta ficheiros OneDrive ❌ Não Cliente (backup próprio)
Admin elimina utilizador por engano ⚠️ 30 dias recycle bin Cliente (após 30 dias)
Conditional Access eliminada ❌ Não Cliente
Política Intune removida ❌ Não Cliente
App registration eliminada ❌ Não Cliente

2. O Que Precisa de Backup no Entra ID

O Entra ID contém muito mais do que utilizadores e grupos. Uma estratégia de backup completa deve cobrir:

  • Utilizadores — contas, propriedades, licenças atribuídas, MFA methods
  • Grupos — grupos de segurança, Microsoft 365 Groups, membership
  • Service Principals — aplicações enterprise, permissões API
  • App Registrations — apps registadas no tenant, secrets/certificados
  • Conditional Access Policies — políticas de acesso condicional (crítico!)
  • Intune Policies — compliance policies, configuration profiles, app protection policies
  • Administrative Roles — atribuições de roles (Global Admin, Security Admin, etc.)
  • Custom Security Attributes — atributos custom definidos
  • Named Locations — locations confiáveis usadas em Conditional Access
  • Entra ID Connect Sync Rules — se há sync híbrido com AD on-prem

3. Retenção Nativa do Entra ID

O Entra ID tem alguma retenção nativa, mas é limitada e inconsistente:

Objecto Recycle bin nativo Período
Utilizadores ✅ Sim 30 dias (restaurável)
Grupos (M365) ✅ Sim 30 dias
Conditional Access ❌ Não 0 dias (eliminação permanente)
Intune policies ❌ Não 0 dias
App registrations ❌ Não 0 dias
Service principals ❌ Não 0 dias
Audit logs ✅ Sim 7 dias (P1) / 1 ano (P2)

4. Solução 1: Graph API + PowerShell (Gratuito)

A forma mais económica de fazer backup do Entra ID é usar o Microsoft Graph PowerShell SDK para exportar todas as configurações para JSON. Este método é gratuito (requer apenas licença M365) e oferece controlo total.

# Instalar Microsoft Graph PowerShell SDK
Install-Module Microsoft.Graph -Scope AllUsers

# Conectar com permissões necessárias
Connect-MgGraph -Scopes @(
  "User.Read.All", "Group.Read.All", "Policy.Read.All",
  "Application.Read.All", "RoleManagement.Read.Directory",
  "Device.Read.All", "Directory.Read.All"
)

# --- Exportar Utilizadores ---
Get-MgUser -All | Select-Object Id, DisplayName, UserPrincipalName, `
  JobTitle, Department, AccountEnabled, AssignedLicenses |
  ConvertTo-Json -Depth 5 | Out-File "backup/users_$(Get-Date -f yyyy-MM-dd).json"

# --- Exportar Grupos ---
Get-MgGroup -All | Select-Object Id, DisplayName, GroupTypes, `
  SecurityEnabled, MailEnabled, Members | 
  ConvertTo-Json -Depth 5 | Out-File "backup/groups_$(Get-Date -f yyyy-MM-dd).json"

# --- Exportar Conditional Access Policies ---
Get-MgIdentityConditionalAccessPolicy -All |
  ConvertTo-Json -Depth 10 | 
  Out-File "backup/ca_policies_$(Get-Date -f yyyy-MM-dd).json"

# --- Exportar App Registrations ---
Get-MgApplication -All | Select-Object Id, DisplayName, AppId, `
  RequiredResourceAccess, IdentifierUris, Web |
  ConvertTo-Json -Depth 5 | 
  Out-File "backup/apps_$(Get-Date -f yyyy-MM-dd).json"

# --- Exportar Service Principals ---
Get-MgServicePrincipal -All | Select-Object Id, DisplayName, AppId, `
  AppRoles, Oauth2PermissionScopes |
  ConvertTo-Json -Depth 5 | 
  Out-File "backup/serviceprincipals_$(Get-Date -f yyyy-MM-dd).json"

# --- Exportar Role Assignments ---
Get-MgRoleManagementDirectoryRoleAssignment -All |
  ConvertTo-Json -Depth 5 | 
  Out-File "backup/roles_$(Get-Date -f yyyy-MM-dd).json"
ℹ️ Informação

Os ficheiros JSON exportados contêm toda a configuração. Guarda-os num storage seguro (Azure Blob Storage com immutable, NAS, ou repositório Git privado). Para restore, importa o JSON e recria os objectos com New-MgUser, New-MgConditionalAccessPolicy, etc.

5. Solução 2: Azure Automation Runbook (Automatizado)

Para automatizar o backup sem intervenção manual, usa um Azure Automation Runbook que corre diariamente e guarda os exports num Azure Storage Account:

# Runbook: Backup-EntraID.ps1
# Schedule: Daily 02:00

# 1. Conectar via Managed Identity (Runbook tem System Assigned)
Connect-MgGraph -Identity

# 2. Exportar todas as configs
$timestamp = Get-Date -Format "yyyy-MM-dd-HHmm"
$exports = @{
  "users" = Get-MgUser -All
  "groups" = Get-MgGroup -All
  "ca_policies" = Get-MgIdentityConditionalAccessPolicy -All
  "apps" = Get-MgApplication -All
  "serviceprincipals" = Get-MgServicePrincipal -All
  "roles" = Get-MgRoleManagementDirectoryRoleAssignment -All
}

# 3. Guardar no Azure Blob Storage
$ctx = New-AzStorageContext -StorageAccountName "kbasebackups"
foreach ($key in $exports.Keys) {
  $json = $exports[$key] | ConvertTo-Json -Depth 10
  $blobName = "entra-id/$timestamp/$key.json"
  Set-AzStorageBlobContent -Container "backups" `
    -File $json -Blob $blobName -Context $ctx -Force
}

# 4. Log
Write-Output "Backup completed: $timestamp"

Vantagens do Azure Automation:

  • Gratuito até 500 minutos/mês — o runbook de backup usa ~2-5 minutos/dia
  • Managed Identity — sem passwords ou secrets no código
  • Immutable storage — configura Blob Storage com immutability policy para proteger contra ransomware
  • Retenção automática — lifecycle management policy apaga backups antigos
  • Alertas — se o runbook falha, envia email via Action Group

6. Solução 3: Acronis Cyber Backup

A Acronis expandiu em julho 2026 a sua solução de backup para incluir backup do Entra ID — não apenas Exchange/SharePoint/OneDrive, mas também configurações do diretório cloud. Segundo o anúncio da Acronis, a solução cobre:

  • Utilizadores e grupos do Entra ID
  • Conditional Access policies
  • App registrations e service principals
  • Exchange Online mailboxes, contacts, calendars
  • SharePoint Online sites e OneDrive
  • Teams chats e channel data

Custos aproximados: ~€3-5/utilizador/mês para M365 backup completo (incluindo Entra ID).

7. Solução 4: Veeam Backup for Microsoft 365

A Veeam Backup for Microsoft 365 é uma das soluções mais populares para backup M365. No entanto, a cobertura do Entra ID é limitada comparada com Acronis:

Objecto Veeam M365 Acronis
Exchange Online ✅ Completo ✅ Completo
SharePoint/OneDrive ✅ Completo ✅ Completo
Teams ✅ Completo ✅ Completo
Entra ID users/groups ⚠️ Limitado (metadata) ✅ Completo
Conditional Access ❌ Não ✅ Sim
App registrations ❌ Não ✅ Sim

8. Comparação de Soluções

Solução Cobertura Entra ID Custo (50 users) Automatização
Graph + PowerShell Completo (manual) €0 Azure Automation Runbook
Azure Automation Completo (auto) €2-5/mês (storage) Schedule diário
Acronis Completo (GUI) €150-250/mês Automático nativo
Veeam M365 Limitado (sem CA/apps) €75-125/mês Automático nativo

9. Recuperar Utilizadores Eliminados

Para utilizadores eliminados há menos de 30 dias, o Entra ID mantém um recycle bin. A recuperação pode ser feita via portal ou PowerShell:

# Listar utilizadores eliminados (recycle bin)
Get-MgDirectoryDeletedItem -DirectoryObjectType user | 
  Select-Object Id, DisplayName, UserPrincipalName, DeletedDateTime

# Restaurar um utilizador específico
Restore-MgDirectoryDeletedItemAsUser -UserId "abc-123-def-456"

# Restaurar via UPN (mais intuitivo)
$deletedUser = Get-MgDirectoryDeletedItemAsUser -DirectoryObjectId (Get-MgDirectoryDeletedItem -DirectoryObjectType user | Where-Object UserPrincipalName -eq "[email protected]").Id
Restore-MgDirectoryDeletedItemAsUser -DirectoryObjectId $deletedUser.Id
⚠️ Aviso

Após 30 dias, o utilizador é permanentemente eliminado. Se tiveres backup JSON, podes recriar com New-MgUser, mas o novo utilizador terá um ID diferente — isto significa que licenças, grupo memberships e permissões têm de ser reatribuídas manualmente.

10. Restaurar Conditional Access

Conditional Access policies não têm recycle bin. Se uma política foi eliminada, só pode ser restaurada a partir de backup. O processo de restore a partir de JSON exportado:

# Ler backup JSON da Conditional Access
$backupPath = "backup/ca_policies_2026-07-09.json"
$caPolicies = Get-Content $backupPath | ConvertFrom-Json

# Recriar cada política
foreach ($policy in $caPolicies) {
  $params = @{
    DisplayName = $policy.DisplayName
    State = $policy.State
    Conditions = $policy.Conditions
    GrantControls = $policy.GrantControls
    SessionControls = $policy.SessionControls
  }
  New-MgIdentityConditionalAccessPolicy -BodyParameter $params
  Write-Output "Restored: $($policy.DisplayName)"
}
ℹ️ Informação

Ao restaurar Conditional Access, a política é recriada com estado disabled (por segurança). Depois de verificar que está correcta, activa manualmente com Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $id -BodyParameter @{state="enabled"}.

11. Audit Logs como Linha de Defesa

Os audit logs do Entra ID registam todas as alterações ao diretório. São a primeira linha de defesa para detectar alterações indevidas:

# Listar alterações a Conditional Access nas últimas 24h
Get-MgAuditLogDirectoryAudit -Filter "activityDateTime gt $(Get-Date (Get-Date).AddDays(-1) -Format 'yyyy-MM-ddTHH:mm:ssZ')' and category eq 'Policy'" |
  Select-Object ActivityDateTime, ActivityDisplayName, Result, InitiatedBy

# Detectar eliminações de utilizadores
Get-MgAuditLogDirectoryAudit -Filter "activityDisplayName eq 'Delete user'" |
  Select-Object ActivityDateTime, TargetResources, InitiatedBy

# Exportar audit logs para análise
Get-MgAuditLogDirectoryAudit -All |
  Where-Object { $_.Result -eq "failure" } |
  Export-Csv "audit-failures.csv" -NoTypeInformation

Retenção de audit logs:

  • Entra ID P1 — 7 dias (incluído em M365 Business Premium)
  • Entra ID P2 — 1 ano (requer M365 E5 ou Entra ID P2 add-on)
  • Azure Monitor + Log Analytics — retenção configurável até 730 dias

12. Checklist de Implementação

  • ☐ Verificar que licença M365 inclui Entra ID P1 ou P2 (para audit logs)
  • ☐ Instalar Microsoft Graph PowerShell SDK numa máquina de gestão
  • ☐ Criar service principal com permissões least-privilege para backup
  • ☐ Configurar Azure Automation Runbook para backup diário automático
  • ☐ Criar Azure Storage Account com immutability policy (container Blob)
  • ☐ Definir retenção: 90 dias diário, 12 meses semanal, 3 anos anual
  • ☐ Testar restore de pelo menos um utilizador a partir do backup JSON
  • ☐ Testar restore de uma Conditional Access policy
  • ☐ Configurar alerta se o runbook falhar (Azure Monitor Action Group)
  • ☐ Documentar o procedimento de restore para a equipa IT
  • ☐ Considerar solução de terceiros (Acronis) se preferires GUI sobre scripts
  • ☐ Revisão trimestral: verificar que backups estão a ser gerados e são legíveis

13. Recomendações para PME

💡 Dica

Para uma PME com 10-50 utilizadores, a solução Graph PowerShell + Azure Automation é gratuita, automatizada e cobre 100% das configurações do Entra ID. A única despesa é o storage (~€2-5/mês). Se preferires uma solução com GUI e suporte, Acronis é a opção mais completa para Entra ID.

  • Começar pelo gratuito: scripts PowerShell via Azure Automation Runbook. Cobre tudo, custa quase zero.
  • Backup imutável: guarda os exports em Blob Storage com immutability policy — ransomware não pode encriptar backups cloud.
  • Backup diário, não semanal: Conditional Access e Intune policies mudam frequentemente. Backup diário minimiza perda.
  • Testar restore regularmente: um backup que nunca foi restaurado é um backup que provavelmente falha. Testa trimestralmente.
  • Monitorizar audit logs: configura alertas para eliminação de políticas e utilizadores — detecta problemas antes que se tornem incidentes.
  • Não esquecer Exchange/SharePoint: o backup do Entra ID cobre configurações do diretório, mas mailbox/ShareDrive precisam de Veeam ou Acronis.

Artigos Relacionados

Voltar ao Índice

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário