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]

  • scope com principalResourceMembershipsScope é o tipo correto quando você quer revisar atribuições de papel (role assignments), tanto diretas quanto elegíveis via PIM.
  • resourceScopes aponta 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 = $true ativa 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 = $false significa 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 via New-MgIdentityGovernanceAccessReviewDefinition;
  • Exige a permissão AccessReview.ReadWrite.All;
  • Para papéis privilegiados, use principalResourceMembershipsScope apontando para o roleDefinitionId;
  • Comece com defaultDecisionEnabled = $false e sem auto-apply até validar o processo.

📚 Recursos recomendados

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