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.
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
- 2. O Que Precisa de Backup no Entra ID
- 3. Retenção Nativa do Entra ID
- 4. Solução 1: Graph API + PowerShell (Gratuito)
- 5. Solução 2: Azure Automation Runbook (Automatizado)
- 6. Solução 3: Acronis Cyber Backup
- 7. Solução 4: Veeam Backup for Microsoft 365
- 8. Comparação de Soluções
- 9. Recuperar Utilizadores Eliminados
- 10. Restaurar Conditional Access
- 11. Audit Logs como Linha de Defesa
- 12. Checklist de Implementação
- 13. Recomendações para PME
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"
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
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)"
}
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
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.
