Configurações do Microsoft Entra PIM com PowerShell
Olá, pessoal!
Gerenciar acessos privilegiados em ambientes de nuvem é um dos maiores desafios de segurança atualmente. Por isso, o Microsoft Entra Privileged Identity Management (PIM) se torna uma peça essencial para qualquer organização que deseje proteger recursos sensíveis sem comprometer a produtividade.
Obs: O PIM exige licenciamento: Microsoft Entra ID P2, Microsoft 365 E5, Microsoft 365 E5 Security ou Enterprise Mobility + Security E5
Neste segundo post sobre o PIM, vamos ver como configurar alguns recursos via PowerShell. Isso me ajudou muito em um projeto de implantação do PIM, onde uma das etapas era a configuração de vários grupos e funções no PIM, e sem os scripts eu levaria muito mais tempo para finalizar.
Refrescando a memória de todos: O PIM é uma solução da Microsoft que permite conceder acessos privilegiados de forma just-in-time, ou seja, temporária, controlada e com requisitos adicionais de segurança, como autenticação multifator (MFA), justificativas e aprovações.
Então com o PIM, é possível:
- Controlar quem pode ativar funções privilegiadas;
- Exigir justificativas e MFA antes da ativação;
- Configurar limites de duração da sessão (ex: 4h);
- Gerar alertas e notificações sobre acessos e ativações;
- Delegar acesso sem adicionar diretamente permissões permanentes;
Bom, vamos lá! Há algumas estratégias para implementações, uma bastante utilizada, é a adoção de Grupos de Segurança do Microsoft Entra ID, definindo os grupos por ‘roles’ e/ou ‘subscriptions’, por exemplo. Vamos seguir desta forma (com grupos), pois é uma estratégia amplamente utilizada, e pouco demonstrada/utilizada nos laboratórios de procedimentos e vídeos de implementação do PIM.
Os grupos podem ser criados via PowerShell e depois associados às funções específicas dentro do PIM. Você pode criar um arquivo CSV e incluir o nome de todos os grupos que você deseja criar. Pode ser uma etapa importante, para já criar um padrão de nomenclatura dos grupos, nem que seja pelo menos para os grupos do PIM.
1
2
3
4
5
6
7
8
9
10
$csvPath = "groups.csv"
$groups = Import-Csv -Path $csvPath
foreach ($group in $groups) {
New-AzureADMSGroup -DisplayName $group.GroupName `
-MailEnabled $false `
-MailNickName $group.GroupName `
-SecurityEnabled $true `
-IsAssignableToRole $true
}
Write-Output "Grupos criados e processo concluido."
Importante definir o parâmetro “IsAssignableToRole” como $true para que o grupo possa receber atribuições de funções.
⚙️ Automações via PowerShell
Obter informações dos grupos
Se você for utilizar Grupos de Segurança, você deve primeiro obter o ObjectId dos grupos que você criou para o PIM.
1
Get-MgPolicyRoleManagementPolicy -Filter "scopeId eq '<GroupId>' and scopeType eq 'Group'"
Salve estes IDs em um arquivo CSV para seguirmos para a próxima etapa. Vamos obter agora o “PolicyID Group”, que é diferente do GroupID. Aqui, você irá obter o ID das políticas do PIM for Groups.
1
2
3
4
5
6
7
8
9
10
11
$inputFilePath = "input.csv"
$outputFilePath = "output.csv"
$scopeIDs = Import-Csv -Path $inputFilePath | Select-Object -ExpandProperty
scopeID
$resultados = @()
foreach ($scopeID in $scopeIDs) {
$policy = Get-MgPolicyRoleManagementPolicy -Filter "scopeId eq '$scopeID'
and scopeType eq 'Group'"
$resultados += $policy
}
$resultados | Export-Csv -Path $outputFilePath -NoTypeInformation
Você verá que os IDs exportados possuem muito mais caracteres do que os ObjectIDs dos grupos. O resultado é a “concatenação” do ID do Grupo + ID das políticas do PIM for Groups.
Configurações do PIM
As imagens abaixo, vão ajudar a entender, onde é aplicado cada uma das configurações realizadas através dos scripts, que veremos a seguir.
Os scripts para as configurações do PIM, utilizam o módulo do Microsoft Graph para Powershell. Você pode baixar os scripts no seguinte link: GitHub - PIM Settings PowerShell
Number | Script | Description |
---|---|---|
1 | DurationTime.ps1 | Configuração do tempo de ativação da função. |
3 | ConditionalAccess.ps1 | Solicitação do MFA através de Conditional Access para ativação da função. |
9 | Notification_Admin_Admin_Eligibility.ps1 | Notificações aos “Administradores” quando um usuário for atribuído como “Elegível”. |
10 | Notification_Requestor_Admin_Eligibility.ps1 | Notificações aos “Solicitantes” quando um usuário for atribuído como “Elegível”. |
11 | Notification_Approver_Admin_Eligibility.ps1 | Notificações aos “Aprovadores” quando um usuário for atribuído como “Elegível”. |
12 | Notification_Admin_Admin_Assignment.ps1 | Notificações aos Administradores quando um usuário for atribuído como “Ativo”. |
13 | Notification_Requestor_Admin_Assignment.ps1 | Notificações aos “Solicitantes” quando um usuário for atribuído como “Ativo”. |
14 | Notification_Approver_Admin_Assignment.ps1 | Notificações aos “Aprovadores” quando um usuário for atribuído como “Ativo”. |
15 | Notification_Admin_EndUser_Assignment.ps1 | Notificações aos Administradores quando um usuário “Elegível” ativar a função. |
16 | Notification_Requestor_EndUser_Assignment.ps1 | Notificações aos “Solicitantes” quando um usuário “Elegível” ativar a função. |
17 | Notification_Approver_EndUser_Assignment.ps1 | Notificações aos “Aprovadores” quando um usuário “Elegível” ativar a função. |
Todos os scripts .ps1 no GitHub iniciam o nome com “PIM-Settings” (Ex: PIM-Settings_DurationTime.ps1). Porém, removi desta tabela, para ter mais espaço e ficar um pouco mais harmonioso, rs.
As configurações dos parâmetros dos grupos no PIM, podem ser totalmente automatizadas por scripts. Cada grupo ou função passa por uma série de definições:
- Duração de ativação: 4 horas (exemplo);
- MFA obrigatório via política de acesso condicional;
- Notificações ativadas/desativadas dependendo do tipo de usuário (Admin, Solicitante ou Aprovador);
- Controle de notificações para atribuições e ativações;
Além disso, os scripts também podem ser utilizados para:
- Realizar o onboarding dos grupos no PIM;
- Aplicar políticas de expiração e autenticação;
- Listar todos os usuários elegíveis a ativar funções dentro do PIM;
- Exigência de MFA via Contexto de Autenticação (aqui tem um pulo do gato);
Solicitar MFA para ativar função no PIM
Uma política de acesso condicional deve ser criada com um Authentication Context, caso você queira exigir o MFA toda vez que um usuário ativar uma função no PIM. Isso cria uma camada adicional de proteção, garantindo que apenas usuários validados e confiáveis executem ações sensíveis. E aqui esta o “segredo”, o Authentication Context. Você precisa dele se quiser utilizar o MFA cada vez que for ativar uma função através do PIM. Não adianta apenas marcar o Azure MFA nas configurações da função ou do grupo, que não irá funcionar como o esperado. Com a opção Azure MFA, os usuários podem não ser solicitados a efetuar autenticação multifator se tiverem se autenticado com credenciais fortes ou fornecido autenticação multifator anteriormente na sessão.
Nas configurações (Settings) do grupo, selecione Microsoft Entra Conditional Access authentication context:
Authentication Context
Também será necessário configurarmos um Conditional Access. Mas antes, vamos criar o Authentication Context.
- Vá até Entra ID > Conditional Access > Authentication context;
- New authentication context > Dê um nome, uma descrição e escolha um ID;
- Clique em Save;
Conditional Access
Crie uma nova política de acesso condicional e faça o seguinte:
. Users: Selecione os grupos/usuários que você quer aplicar;
. Target resources: Select what this policy applies to: Authentication Context;
. Authentication Context: Selecione o que você criou anteriormente;
. Grant: Selecione Require authentication strength com a opção Multifactor Authentication;
. Session: Sign-in frequency - Every time;
. Enable policy: On;
Podemos ver através das configurações do grupo em questão, que o Authentication Context esta definido:
Agora é só testar e… Voilà!
Sempre que for ativar uma função ou atribuição ao grupo do PIM, será solicitado o MFA.
🔍 Bônus: Listar usuários elegíveis dos Grupos no PIM
Os usuários elegíveis aos grupos de segurança no PIM, podem ser visualizados através do Portal da Azure, de forma individual, escolhendo o grupo e visualizando os usuários elegíveis (conforme imagem abaixo), mas como a ideia aqui é utilizar o Microsoft Graph via Powershell, vamos fazer isso através de script! O script abaixo, exporta para um arquivo CSV os usuários elegíves de todos os grupos do PIM, neste exemplo, grupos que iniciam com o nome “G-PIM” (como é bom ter um padrão de nomenclatura, hein?!).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Connect-MgGraph -Scopes "Group.Read.All", "User.Read.All"
$outputCsvPath = "C:\Temp\EligibleUsers_PIMforGroups_G-PIM.csv"
$results = @()
$groups = Get-MgGroup -Filter "startswith(DisplayName, 'G-PIM')" -Property Id, DisplayName
foreach ($group in $groups) {
$groupId = $group.Id
$members = Get-MgBetaIdentityGovernancePrivilegedAccessGroupEligibilitySchedule -Filter "groupId eq '$groupId'"
foreach ($member in $members) {
$user = Get-MgUser -UserId $member.PrincipalId -Property Id, DisplayName, UserPrincipalName, AccountEnabled
$result = [PSCustomObject]@{
GroupId = $group.Id
GroupName = $group.DisplayName
UserId = $user.Id
UserDisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
AccountEnabled = $user.AccountEnabled
}
$results += $result
}
}
$results | Export-Csv -Path $outputCsvPath -NoTypeInformation -Encoding UTF8
Write-Output "Os dados foram exportados para $outputCsvPath"
É uma boa forma de criar um report de quais usuários são elegíveis aos grupos do PIM.
📚 Documentação oficial
📖 Microsoft Entra PIM
📖 Rules in PIM - Mapping guide
📖 Configure authentication contexts
✅ Conclusão
O PIM é uma ferramenta poderosa para reduzir riscos, reforçar controles e garantir que o princípio do menor privilégio seja uma realidade no seu ambiente Microsoft. Se você ainda não está usando o PIM no seu ambiente, este é um excelente momento para começar a planejar! Ainda mais agora, que você possui dicas valiosas (e scripts) de como executar algumas ações.
Bom, fechamos aqui. Até a próxima! 🤘