Segurança · Microsoft Entra ID · Identity Governance · Risk Management · 2026

Duarte Spínola · 8 de Julho de 2026

Identity Governance e Risk Management no Entra ID: Boas Práticas Microsoft para PME em 2026

Identity Governance · Risk Management · Entra ID · Entitlement Management · Access Reviews · Identity Protection · Conditional Access · Microsoft  |  ✎ Duarte Spínola  |  2026-07-08

A Identity Governance e o Risk Management no Microsoft Entra ID são os pilares de uma estratégia Zero Trust completa. Governance garante que cada utilizador tem o acesso certo, na altura certa, pelo tempo certo — nem mais, nem menos. Risk Management detecta e mitiga ameaças em tempo real, baseando-se em sinais de risco de identidade, dispositivo e sessão. Este guia prático cobre Entitlement Management, Access Reviews, Identity Protection, risk-based Conditional Access e lifecycle de identidades, com base na documentação oficial Microsoft Identity Governance e no Entra ID Protection. Para PIM (acesso privilegiado), consulta PIM no Entra ID; para MFA, consulta Microsoft Entra MFA.

ℹ️ Informação

A Microsoft define Identity Governance como “o conjunto de capacidades que garantem que as pessoas certas têm o acesso certo aos recursos certos, no momento certo”. Para PME, isto traduz-se em 5 áreas práticas: Entitlement Management (access packages), Access Reviews (revisões periódicas), Privileged Identity Management (PIM), Identity Protection (risk-based policies) e Lifecycle (joiner/mover/leaver). Este guia cobre as 4 áreas que não estão no artigo 44 (PIM).

Conteúdos

1. Identity Governance vs Risk Management: Qual a Diferença

Embora complementares, Governance e Risk Management respondem a perguntas diferentes:

Aspecto Identity Governance Risk Management
Objetivo Acesso certo, na altura certa Detectar e mitigar ameaças
Pergunta “Quem tem acesso a quê?” “Esta identidade está comprometida?”
Ciclo Proativo (planeado) Reativo (tempo real)
Features Entitlement Mgmt, Access Reviews, PIM Identity Protection, Risk Policies, CAE
Licença mínima Entra ID P2 (ou E5) Entra ID P2 (ou E5)

A documentação oficial da Microsoft sobre Identity Governance está disponível em Identity Governance overview e sobre Risk Management em Identity Protection overview. Para uma estratégia Zero Trust, consulta Zero Trust para PME.

2. Entitlement Management: Access Packages

O Entitlement Management é a funcionalidade central do Entra ID Governance. Permite criar access packages — pacotes de acesso que agrupam grupos, apps, SharePoint sites e roles Azure — que os utilizadores podem requisitar via self-service, com fluxos de aprovação. Isto substitui o modelo manual de “abrir ticket → TI adiciona a grupo” por um modelo automatizado e auditável. A documentação oficial está em Entitlement Management overview.

Modelo tradicional Entitlement Management
Ticket manual → TI adiciona a grupos Self-service com aprovação automática
Sem expiração (accesso perpetuou) Expiração automática (30/90/180 dias)
Difícil auditar quem tem o quê Auditoria completa (quem, quando, quem aprovou)
Onboarding manual por TI Onboarding via access package (1 clique)

3. Criar Access Packages para PME

Para uma PME típica, recomenda-se criar 3-5 access packages base: Onboarding Base (todos os colaboradores), Financeiro (acesso a apps financeiras), TI (acesso a ferramentas admin) e Externo/Consultor (acesso limitado com expiração automática). A criação é feita via Entra admin center → Identity Governance → Entitlement Management → Access packages.

# Criar Access Package via Microsoft Graph PowerShell
Connect-MgGraph -Scopes "EntitlementManagement.ReadWrite.All"

# 1. Criar catálogo (se não existir)
$catalog = New-MgEntitlementManagementCatalog -DisplayName "PME Base" `
    -Description "Access packages base para PME"

# 2. Adicionar recursos ao catálogo (grupos, apps, SharePoint)
# Adicionar grupo "Todos-Colaboradores"
Add-MgEntitlementManagementCatalogResource `
    -AccessPackageCatalogId $catalog.Id `
    -OriginId "groupId-todos-colaboradores" `
    -OriginType "AadGroup"

# 3. Criar access package
$package = New-MgEntitlementManagementAccessPackage -DisplayName "Onboarding Base" `
    -Description "Acesso base para novos colaboradores" `
    -IsHidden $false `
    -CatalogId $catalog.Id
# 4. Configurar policy do access package (quem pode pedir + aprovação)
$policy = @{
    displayName = "Policy-Onboarding-Base"
    allowedTargetScope = "specificDirectoryUsers"
    specificAllowedTargets = @{
        subjectType = "user"
    }
    expiration = @{
        type = "afterDuration"
        duration = "P365D"  # Expira em 365 dias
    }
    requestorSettings = @{
        acceptRequests = $true
        scopeType = "AllExistingDirectoryMembers"
    }
    approvalSettings = @{
        isApprovalRequired = $true
        isApprovalRequiredForExtension = $true
        approvalStages = @(
            @{
                approvalStageTimeOutInDays = 14
                primaryApprovers = @(
                    @{
                        userType = "group"
                        id = "groupId-gestores-ti"
                    }
                )
            }
        )
    }
}

New-MgEntitlementManagementAccessPackageAssignmentPolicy `
    -AccessPackageId $package.Id `
    -BodyParameter $policy
💡 Dica

Para consultores externos, cria um access package separado com expiração de 90 dias e aprovação obrigatória do gestor directo. Isto garante que o acesso do consultor expira automaticamente — não precisas de te lembrar de o remover. Para gestão de acesso privilegiado, consulta PIM no Entra ID.

4. Access Reviews: Revisões Periódicas de Acesso

As Access Reviews obrigam os gestores a rever periodicamente quem tem acesso a grupos, apps e roles. Para PME, recomenda-se revisões trimestrais para grupos privilegiados e semestrais para grupos gerais. Documentação: Create an access review.

# Criar Access Review trimestral via Graph
Connect-MgGraph -Scopes "AccessReview.ReadWrite.All"

$reviewParams = @{
    displayName = "Review-Trimestral-Grupos-Privilegiados"
    descriptionForAdmins = "Revisão trimestral de acesso a grupos privilegiados"
    scope = @{
        "@odata.type" = "#microsoft.graph.accessReviewQueryScope"
        queryType = "MicrosoftGraph"
        query = "/groups/groupId-admins/transitiveMembers"
    }
    instanceDurationInDays = 14
    settings = @{
        recurrence = @{
            pattern = @{
                type = "absoluteMonthly"
                interval = 3  # Trimestral
            }
            range = @{
                type = "noEnd"
            }
        }
        defaultDecision = "Deny"  # Se não reviram, remove acesso
        defaultDecisionEnabled = $true
        autoApplyDecisionsEnabled = $true
        recommendationsEnabled = $true
    }
}

New-MgIdentityGovernanceAccessReviewDefinition -BodyParameter $reviewParams
⚠️ Atenção

Define defaultDecision = "Deny" para que o acesso seja automaticamente removido se o gestor não fizer a revisão a tempo. Isto garante conformidade mesmo com gestores esquecidos. Em PME sem revisões automáticas, é comum encontrar contas com acesso a sistemas sensíveis meses ou anos após deixar de ser necessário.

5. Identity Lifecycle: Joiner-Mover-Leaver

O modelo Joiner-Mover-Leaver (JML) descreve o ciclo de vida de uma identidade. O Entra ID automatiza todo o fluxo quando integrado com um HR system (Workday, SAP SuccessFactors) ou via Entra ID Connect para contas on-premises. Para PME sem HR system, o fluxo é manual mas deve seguir as boas práticas da Microsoft descritas em Joiner-Mover-Leaver processes.

# === JOINER (novo colaborador) ===
# Criar conta com access package "Onboarding Base"
Connect-MgGraph -Scopes "User.ReadWrite.All","EntitlementManagement.ReadWrite.All"

$newUser = @{
    displayName = "João Silva"
    userPrincipalName = "[email protected]"
    mailNickname = "joao.silva"
    accountEnabled = $true
    passwordProfile = @{
        password = "TempPass!2026"
        forceChangePasswordNextSignIn = $true
    }
    usageLocation = "PT"
}

$user = New-MgUser -BodyParameter $newUser

# Atribuir access package automaticamente
New-MgEntitlementManagementAccessPackageAssignmentRequest `
    -AccessPackageId $package.Id `
    -RequestType "AdminAdd" `
    -TargetId $user.Id

# === MOVER (mudança de função) ===
# Remover access package antigo e atribuir novo
# Ex: de "Financeiro" para "TI"
Stop-MgEntitlementManagementAccessPackageAssignmentRequest `
    -AccessPackageId $financePackageId `
    -TargetId $user.Id

New-MgEntitlementManagementAccessPackageAssignmentRequest `
    -AccessPackageId $tiPackageId `
    -RequestType "AdminAdd" `
    -TargetId $user.Id

# === LEAVER (saída) ===
# Bloquear login imediatamente
Update-MgUser -UserId $user.Id -AccountEnabled $false

# Revogar todas as sessões
Revoke-MgUserSignInSession -UserId $user.Id

# Remover de todos os grupos
Get-MgUserMemberOf -UserId $user.Id |
    Where-Object { $_.OdataType -eq "#microsoft.graph.group" } |
    ForEach-Object { Remove-MgGroupMemberByRef -GroupId $_.Id -DirectoryObjectId $user.Id }

# Remover licenças
Set-MgUserLicense -UserId $user.Id -RemoveLicenses @("licenseSkuId") -AddLicenses @()

6. Identity Protection: Risk Detection

O Entra ID Identity Protection analisa sinais de risco em tempo real (logins anómalos, credenciais vazadas, viagens impossíveis, dispositivos desconhecidos) e atribui um risk level (Low/Medium/High) a cada evento. A documentação oficial está em Identity Protection risk detections.

Tipo de Risco Descrição Nível típico
Anonymous IP Login via Tor/VPN anónimo Médio
Impossible travel Login de 2 países em tempo impossível Médio/Alto
Leaked credentials Password encontrada em breach público Alto
Malware-linked IP IP associado a malware/C2 Alto
Unfamiliar features Login de dispositivo/local novos Baixo
Token theft Sessão token reutilizada de local suspeito Alto

7. Configurar Risk Policies

As risk policies actuam automaticamente quando um risco é detectado. Existem 2 tipos: User Risk Policy (risco da conta estar comprometida) e Sign-in Risk Policy (risco da sessão ser maliciosa). Configuração via Entra admin center → Identity Protection → Policies.

# Configurar User Risk Policy (conta comprometida)
# Portal > Entra ID > Identity Protection > Policies > User risk policy

# Nível de risco: High (PME) ou Medium (enterprise)
# Ação: Block access ou Allow access (require password reset)
# Aplicar a: All users (excluir break-glass accounts)

# Via Graph API:
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess","IdentityRiskEvent.ReadWrite.All"

# User Risk Policy
$userRiskPolicy = @{
    displayName = "User-Risk-Block-High"
    state = "enabled"
    conditions = @{
        applications = @{ includeApplications = @("All") }
        users = @{
            includeUsers = @("All")
            excludeUsers = @("break-glass-account-id")  # SEMPRE excluir break-glass
        }
    }
    controls = @{
        operator = "OR"
        builtInControls = @("block")
    }
}

# Sign-in Risk Policy
$signInRiskPolicy = @{
    displayName = "SignIn-Risk-Require-MFA-Medium"
    state = "enabled"
    conditions = @{
        applications = @{ includeApplications = @("All") }
        users = @{
            includeUsers = @("All")
            excludeUsers = @("break-glass-account-id")
        }
        signInRiskLevels = @("medium", "high")
    }
    controls = @{
        operator = "AND"
        builtInControls = @("mfa")
    }
}

New-MgIdentityConditionalAccessPolicy -BodyParameter $userRiskPolicy
New-MgIdentityConditionalAccessPolicy -BodyParameter $signInRiskPolicy
⚠️ Aviso

Sempre excluir contas break-glass das risk policies. Se um atacante comprometer todas as contas admin, precisas de pelo menos uma conta break-glass (sem MFA, sem risk policies) para recuperar o tenant. Usa 2 contas break-glass com passwords longas guardadas em cofre físico. Para phishing que contorna MFA, consulta PhaaS no Microsoft 365.

8. Conditional Access Baseado em Risco

O Conditional Access pode usar risk levels como condição. Quando combinado com Identity Protection, permite bloquear ou desafiar sessões com base no risco detectado em tempo real. Para CAE (Continuous Access Evaluation), que revoga sessões em tempo real quando o risco muda, consulta Continuous Access Evaluation.

# CA policy: bloquear logins de risco ALTO, exigir MFA em risco MÉDIO
$riskBasedCA = @{
    displayName = "CA-Risk-Based-MFA-Block"
    state = "enabled"
    conditions = @{
        applications = @{ includeApplications = @("All") }
        users = @{
            includeUsers = @("All")
            excludeRoles = @("Global Administrator")  # PIM trata admins
            excludeUsers = @("break-glass-id")
        }
        signInRiskLevels = @("high", "medium")
    }
    grantControls = @{
        operator = "AND"
        builtInControls = @("mfa")
    }
    sessionControls = @{
        cloudAppSecurity = @{
            cloudAppSecurityType = "monitorOnly"
            isEnabled = $true
        }
        continuousAccessEvaluation = @{
            mode = "strict"
        }
    }
}

New-MgIdentityConditionalAccessPolicy -BodyParameter $riskBasedCA

9. Remediação de Utilizadores em Risco

Quando o Identity Protection detecta um utilizador em risco, a remediação envolve: (1) dismiss risk (se for falso positivo), (2) password reset (se for compromisso real), (3) block account (se for compromisso confirmado). Documentação: Remediate risks and unblock users.

# Listar utilizadores em risco
Connect-MgGraph -Scopes "IdentityRiskEvent.ReadWrite.All"

Get-MgRiskyUser -Filter "riskLevel eq 'high'" |
    Select-Object UserPrincipalName, RiskLevel, RiskDetail, RiskLastUpdatedDateTime

# Remediação: forçar password reset
$compromisedUser = Get-MgRiskyUser -Filter "riskLevel eq 'high'" | Select-Object -First 1

# 1. Dismiss risk (se for falso positivo — confirmado manualmente)
Invoke-MgDismissRiskyUser -RiskyUserId $compromisedUser.Id

# 2. Password reset (se for compromisso real)
# Portal > Entra ID > Users > [user] > Reset password
# Ou via Graph:
Update-MgUser -UserId $compromisedUser.Id `
    -PasswordProfile @{
        password = "TempReset!2026"
        forceChangePasswordNextSignIn = $true
    }

# 3. Bloquear conta (compromisso confirmado)
Update-MgUser -UserId $compromisedUser.Id -AccountEnabled $false

# 4. Revogar todas as sessões
Revoke-MgUserSignInSession -UserId $compromisedUser.Id

# 5. Verificar logins recentes para forensics
Get-MgAuditLogSignIn -Filter "userId eq '$($compromisedUser.Id)'" -Top 20 |
    Select-Object CreatedDateTime, IpAddress, Location, ClientAppUsed, ConditionalAccessStatus

10. Auditoria e Monitorização com KQL

Para PME com Microsoft Sentinel, as seguintes queries KQL monitorizam governance e risk. Para implementação do Sentinel, consulta Microsoft Sentinel para PME.

// 1. Utilizadores em risco (Identity Protection)
RiskEvents
| where TimeGenerated > ago(24h)
| summarize RiskCount = count() by UserPrincipalName, RiskEventType
| where RiskCount > 3
| order by RiskCount desc

// 2. Mudanças de acesso (Entitlement Management)
AuditLogs
| where TimeGenerated > ago(7d)
| where OperationName in ("Add access package assignment", "Remove access package assignment")
| project TimeGenerated, InitiatedBy, OperationName, TargetResources

// 3. Access Reviews completadas
AuditLogs
| where OperationName == "Create access review instance"
| extend ReviewName = tostring(parse_json(tostring(TargetResources[0].displayName)))
| project TimeGenerated, ReviewName, InitiatedBy
// 4. Logins bloqueados por risk-based CA
SigninLogs
| where TimeGenerated > ago(24h)
| where ConditionalAccessStatus == "failure"
| where RiskLevelDuringSignIn in ("high", "medium")
| project TimeGenerated, UserPrincipalName, IpAddress, Location,
         RiskLevelDuringSignIn, ConditionalAccessStatus
| order by TimeGenerated desc

// 5. Criação/remoção de contas (lifecycle)
AuditLogs
| where TimeGenerated > ago(30d)
| where OperationName in ("Add user", "Delete user", "Update user")
| extend Action = OperationName
| extend TargetUser = tostring(parse_json(tostring(TargetResources[0].userPrincipalName)))
| project TimeGenerated, Action, TargetUser, InitiatedBy
| order by TimeGenerated desc

11. Terms of Use e Agreement Acceptance

Os Terms of Use (Termos de Utilização) permitem apresentar um documento legal que os utilizadores devem aceitar antes de aceder a recursos. Isto é especialmente útil para utilizadores externos (B2B guests) e para conformidade NIS2/GDPR. Documentação: Terms of Use. Para NIS2, consulta NIS2: Checklist em 90 Dias.

# Criar Terms of Use
# Portal > Entra ID > Security > Conditional Access > Terms of use
# Upload PDF com política de utilização

# Associar a Conditional Access policy
$termsCA = @{
    displayName = "CA-Require-ToU-External-Users"
    state = "enabled"
    conditions = @{
        applications = @{ includeApplications = @("All") }
        users = @{
            includeUsers = @("Guests")
        }
    }
    grantControls = @{
        operator = "AND"
        builtInControls = @("termsOfUse")
        termsOfUse = @("terms-of-use-id")
    }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $termsCA

# Verificar quem aceitou
Get-MgAgreementAcceptance |
    Select-Object UserId, AgreementId, AcceptedDateTime

12. Boas Práticas Microsoft para PME

A Microsoft publica boas práticas em Identity Governance best practices. As 10 mais importantes para PME portuguesas:

# Boa prática Impacto
1 Usar access packages para onboarding Reduz tempo onboarding de dias para minutos
2 Access reviews trimestrais em grupos privilegiados Remove acesso desnecessário
3 Expiração automática de acesso externo (90 dias) Elimina acesso órfão
4 Break-glass accounts (2, sem MFA, em cofre físico) Garante recuperação de lockout
5 User Risk Policy: bloquear risco High Conta comprometida é bloqueada automaticamente
6 Sign-in Risk Policy: MFA em risco Medium+ Desafia sessões suspeitas
7 PIM para todas as roles privilegiadas Elimina admin permanente (ver artigo PIM)
8 Terms of Use para guests B2B Conformidade legal
9 CAE (Continuous Access Evaluation) activo Revoga sessões em tempo real
10 Auditoria mensal: contas inativas + grupos sem owner Detecta contas órfãs

13. Cenário Prático PME (50 colaboradores)

Cenário real: PME com 50 colaboradores, Microsoft 365 E5 (inclui Entra ID P2), 5 consultores externos, 2 admins globais.

# Plano de implementação (3 meses)

# === MÊS 1: Quick wins ===
# 1. Criar 2 break-glass accounts
#    Portal > Entra ID > Users > New user
#    - Sem MFA, sem risk policies
#    - Passwords 20+ chars guardadas em cofre físico
#    - Excluir de todas as CA policies

# 2. Activar PIM para Global Admin
#    Portal > Entra ID > Identity Governance > PIM > Azure AD roles
#    - Converter Global Admin de "permanent" para "eligible"
#    - Requer aprovação + MFA + justification
#    Ver artigo: PIM no Entra ID

# 3. Criar access packages
New-MgEntitlementManagementAccessPackage `
    -DisplayName "Onboarding Base" `
    -Description "Acesso base: email, Teams, SharePoint, OneDrive"

# === MÊS 2: Access Reviews + Risk ===
# 4. Criar access review trimestral para grupos privilegiados
#    Portal > Identity Governance > Access Reviews > New

# 5. Activar User Risk Policy (block high)
#    Portal > Identity Protection > Policies > User risk policy

# 6. Activar Sign-in Risk Policy (MFA medium+)
#    Portal > Identity Protection > Policies > Sign-in risk policy

# === MÊS 3: Lifecycle + Terms ===
# 7. Criar access package para consultores (90 dias)
New-MgEntitlementManagementAccessPackage `
    -DisplayName "Consultor Externo" `
    -Description "Acesso limitado, expira em 90 dias"

# 8. Configurar Terms of Use para guests
#    Portal > Conditional Access > Terms of use > New

# 9. Importar Sentinel detection rules
#    Portal > Sentinel > Content hub > "Entra ID Protection"

# 10. Auditoria inicial
Get-MgUser -Filter "accountEnabled eq false" |
    Select-Object UserPrincipalName, CreatedDateTime, DeletedDateTime
# Relatório mensal: contas inativas (sem login há 90+ dias)
# Requer licença Entra ID P2 para SignInLogs

Connect-MgGraph -Scopes "AuditLog.Read.All"

$threshold = (Get-Date).AddDays(-90)

# Listar utilizadores sem login há 90 dias
Get-MgUser -Filter "accountEnabled eq true" -All |
    ForEach-Object {
        $lastLogin = Get-MgAuditLogSignIn -Filter "userId eq '$($_.Id)'" -Top 1 -Sort "createdDateTime DESC"
        if (-not $lastLogin -or $lastLogin[0].CreatedDateTime -lt $threshold) {
            [PSCustomObject]@{
                User = $_.UserPrincipalName
                LastLogin = if ($lastLogin) { $lastLogin[0].CreatedDateTime } else { "Nunca" }
                Days = if ($lastLogin) { ((Get-Date) - $lastLogin[0].CreatedDateTime).Days } else { 999 }
            }
        }
    } | Sort-Object Days -Descending | Select-Object -First 20

14. Checklist de Implementação

Etapa Prioridade Estado
Criar 2 break-glass accounts 🔴 Crítica
Activar PIM para roles privilegiadas 🔴 Crítica
Criar access packages (base + externos) 🟡 Alta
Activar User Risk Policy (block high) 🟡 Alta
Activar Sign-in Risk Policy (MFA medium+) 🟡 Alta
Criar access reviews trimestrais 🟡 Alta
Configurar Terms of Use para guests 🟢 Média
Activar CAE (Continuous Access Evaluation) 🟢 Média
Importar Sentinel detection rules 🟢 Média
Auditoria mensal de contas inativas 🟢 Média

Artigos Relacionados

Identity Governance · Risk Management · Entra ID · Entitlement Management · Access Reviews · Identity Protection · Conditional Access · Microsoft  |  ✎ Duarte Spínola  |  2026-07-08

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário