Access Reviews no Microsoft Entra ID: automatizando a revisão periódica de acessos privilegiados com Microsoft Graph PowerShell
Quem administra Microsoft Entra ID sabe o problema: usuários acumulam permissões, grupos de acesso crescem sem controle, e ninguém revisa quem ainda precisa daquele papel de administrador que recebeu "temporariamente" há oito meses. O Microsoft Entra ID Governance resolve isso com Access Reviews (revisões de acesso) — e a parte boa é que você não precisa clicar manualmente no portal todo trimestre: dá para criar, agendar e até aplicar os resultados via Microsoft Graph PowerShell.
Neste artigo, vou mostrar como montar uma revisão de acesso recorrente para um papel privilegiado do Entra ID (role) usando PowerShell, de ponta a ponta.
O que é um Access Review
Um Access Review é uma definição (accessReviewScheduleDefinition) que diz:
- Quem está sendo revisado (escopo — usuários, grupos, aplicações ou papéis do Entra ID);
- Quem vai revisar (reviewers — pode ser um revisor específico, os próprios usuários, ou os gestores);
- Com que frequência (recorrência — única vez, mensal, trimestral, etc.);
- O que fazer quando a revisão termina (aplicar automaticamente a remoção de acesso ou deixar manual).
Isso faz parte do módulo Microsoft.Graph.Identity.Governance, dentro do Microsoft Graph PowerShell SDK, e também pode ser feito via chamada direta à API REST em /identityGovernance/accessReviews/definitions.[1][3]
Pré-requisitos
# Instalar o módulo (se ainda não tiver) Install-Module Microsoft.Graph.Identity.Governance -Scope CurrentUser # Conectar com a permissão necessária Connect-MgGraph -Scopes "AccessReview.ReadWrite.All", "RoleManagement.Read.Directory" Import-Module Microsoft.Graph.Identity.Governance A permissão delegada mínima é AccessReview.ReadWrite.All — sem ela o New-MgIdentityGovernanceAccessReviewDefinition falha com erro de autorização.[1]
Passo 1 — Identifique o papel a revisar
Vamos revisar quem tem o papel User Administrator (um papel sensível, que pode resetar senhas e gerenciar contas). O template global desse papel tem ID fixo fe930be7-5e62-47db-91af-98c3a49a38b1.[2]
Para descobrir o ID de qualquer outro papel:
Get-MgRoleManagementDirectoryRoleDefinition -Filter "displayName eq 'User Administrator'" | Select-Object DisplayName, Id Passo 2 — Monte a definição da revisão
$revisor = "2560f739-2e0e-4550-9fa0-1a1e67ae0ab8" # ObjectId do revisor no Entra ID $params = @{ displayName = "Revisao trimestral - User Administrator" descriptionForAdmins = "Revisao de quem possui o papel User Administrator" descriptionForReviewers = "Confirme se cada usuario ainda precisa deste papel privilegiado" scope = @{ "@odata.type" = "#microsoft.graph.principalResourceMembershipsScope" principalScopes = @( @{ "@odata.type" = "#microsoft.graph.accessReviewQueryScope"; query = "/users"; queryType = "MicrosoftGraph" } @{ "@odata.type" = "#microsoft.graph.accessReviewQueryScope"; query = "/groups"; queryType = "MicrosoftGraph" } ) resourceScopes = @( @{ "@odata.type" = "#microsoft.graph.accessReviewQueryScope" query = "/roleManagement/directory/roleDefinitions/fe930be7-5e62-47db-91af-98c3a49a38b1" queryType = "MicrosoftGraph" } ) } reviewers = @( @{ query = "/users/$revisor"; queryType = "MicrosoftGraph" } ) settings = @{ mailNotificationsEnabled = $true reminderNotificationsEnabled = $true justificationRequiredOnApproval = $true defaultDecisionEnabled = $false defaultDecision = "None" instanceDurationInDays = 7 recommendationsEnabled = $true recurrence = @{ pattern = @{ type = "absoluteMonthly"; interval = 3 } range = @{ type = "noEnd"; startDate = (Get-Date).ToString("yyyy-MM-dd") } } } } New-MgIdentityGovernanceAccessReviewDefinition -BodyParameter $params Pontos importantes dessa definição:[1][2]
-
scopecomprincipalResourceMembershipsScopeé o tipo correto quando você quer revisar atribuições de papel (role assignments), tanto diretas quanto elegíveis via PIM. -
resourceScopesaponta para o papel específico — repita a definição para cada papel que quiser revisar separadamente (não dá para misturar vários papéis numa única definição). -
recommendationsEnabled = $trueativa as sugestões automáticas do Entra ID baseadas em padrão de uso (ex: "este usuário não acessa há 90 dias, recomendamos remover"). -
defaultDecisionEnabled = $falsesignifica que, se o revisor não responder, nada é decidido automaticamente — mais seguro para o primeiro ciclo, até a equipe se acostumar com o processo.
Passo 3 — Acompanhe e aplique os resultados
Depois que a revisão roda e os prazos vencem, você pode consultar o status:
Get-MgIdentityGovernanceAccessReviewDefinition | Select-Object Id, DisplayName, Status Se autoApplyDecisionsEnabled não estiver marcado como $true na definição, as decisões não removem acesso automaticamente — é preciso aplicar manualmente ou via Add-MgIdentityGovernanceAccessReviewInstanceDecision depois de revisar o relatório. Isso é intencional: antes de automatizar a remoção, vale rodar algumas revisões no modo manual para validar que o escopo está certo e não vai remover acesso de quem não devia.[3]
Por que automatizar isso em vez de usar só o portal
O portal do Entra ID (Identity Governance > Access Reviews) cobre o mesmo cenário por clique, e para uma revisão única ele é mais rápido. Mas via PowerShell/Graph você ganha:
- Padronização: todo papel crítico (Global Admin, Privileged Role Admin, User Admin, etc.) recebe a mesma estrutura de revisão, sem depender de alguém lembrar de configurar certo no portal;
- Versionamento: o script fica num repositório, documentado, revisável por outra pessoa da equipe;
- Escala: rodar o mesmo bloco de código para 10 papéis diferentes é trivial; fazer isso manualmente no portal 10 vezes não é.
Conclusão
Access Reviews fecham um buraco comum em ambientes Entra ID: a permissão concedida que ninguém revisa depois. Com Microsoft.Graph.Identity.Governance, a criação, o agendamento e o acompanhamento das revisões saem do clique manual e entram no mesmo pipeline de automação que você já usa para outras tarefas de administração — e isso vale tanto para papéis do Entra ID quanto para grupos e aplicações, trocando apenas o scope e o resourceScopes da definição.
Principais pontos:
- Access Review =
accessReviewScheduleDefinition, criada viaNew-MgIdentityGovernanceAccessReviewDefinition; - Exige a permissão
AccessReview.ReadWrite.All; - Para papéis privilegiados, use
principalResourceMembershipsScopeapontando para oroleDefinitionId; - Comece com
defaultDecisionEnabled = $falsee sem auto-apply até validar o processo.
📚 Recursos recomendados
- Exam Ref AZ-500 Microsoft Azure Security Technologies, 3rd Edition — cobre justamente governança de identidade, Conditional Access e PIM no Entra ID, a base teórica por trás dos Access Reviews deste artigo.
Sources
[1] https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.governance/new-mgidentitygovernanceaccessreviewdefinition?view=graph-powershell-1.0 — New-MgIdentityGovernanceAccessReviewDefinition - Microsoft Learn
[2] https://learn.microsoft.com/en-us/graph/tutorial-accessreviews-roleassignments — Review admin role assignments using access reviews APIs - Microsoft Graph
[3] https://learn.microsoft.com/en-us/entra/id-governance/deploy-access-reviews — Plan a Microsoft Entra access reviews deployment


