Índice
Passkeys: A Nova Fronteira da Segurança de Autenticação
As passkeys (chaves de segurança FIDO2) representam uma evolução significativa na segurança de autenticação, oferecendo:
- Resistência a ataques de phishing
- Autenticação forte sem palavras-passe
- Segurança baseada em hardware
- Experiência de utilizador simplificada
- Proteção contra reutilização de credenciais
Identificar utilizadores que já registaram passkeys é crucial para medir a adoção destas tecnologias avançadas e planear estratégias futuras.
Identificação via Microsoft Graph
Para identificar utilizadores com passkeys registadas:
# Ligar ao Microsoft Graph
Connect-MgGraph -Scopes "User.Read.All", "UserAuthenticationMethod.Read.All"
# Obter todos os utilizadores
$users = Get-MgUser -All
# Array para resultados
$passkeyUsers = @()
foreach ($user in $users) {
# Obter métodos de autenticação do utilizador
$authMethods = Get-MgUserAuthenticationMethod -UserId $user.Id
# Filtrar para encontrar passkeys (FIDO2)
$fido2Methods = $authMethods | Where-Object {
$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.fido2AuthenticationMethod'
}
# Se tiver passkeys registadas, adicionar aos resultados
if ($fido2Methods.Count -gt 0) {
# Extrair detalhes das chaves
$keyDetails = @()
foreach ($method in $fido2Methods) {
$keyDetails += [PSCustomObject]@{
Model = $method.AdditionalProperties.model
DisplayName = $method.AdditionalProperties.displayName
CreatedDateTime = $method.AdditionalProperties.createdDateTime
}
}
$passkeyUsers += [PSCustomObject]@{
DisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
PasskeyCount = $fido2Methods.Count
Keys = $keyDetails
}
}
}
# Apresentar utilizadores com passkeys
$passkeyUsers |
Sort-Object -Property PasskeyCount -Descending |
Format-Table DisplayName, UserPrincipalName, PasskeyCount -AutoSize
Detalhes das Passkeys Registadas
Para analisar em detalhe as passkeys registadas:
# Mostrar detalhes de todas as passkeys registadas
$allPasskeys = @()
foreach ($user in $passkeyUsers) {
foreach ($key in $user.Keys) {
$allPasskeys += [PSCustomObject]@{
UserDisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
KeyModel = $key.Model
KeyName = $key.DisplayName
RegisteredDate = [DateTime]$key.CreatedDateTime
DaysSinceRegistration = [math]::Round(((Get-Date) - [DateTime]$key.CreatedDateTime).TotalDays)
}
}
}
# Apresentar todas as passkeys
$allPasskeys |
Sort-Object -Property UserDisplayName, RegisteredDate |
Format-Table UserDisplayName, KeyModel, KeyName, RegisteredDate, DaysSinceRegistration -AutoSize
Relatório de Adoção de Passkeys
Para gerar um relatório sobre a adoção de passkeys na organização:
$totalUsers = $users.Count
$passkeyUserCount = $passkeyUsers.Count
$percentAdoption = [math]::Round(($passkeyUserCount / $totalUsers) * 100, 2)
$totalPasskeys = $allPasskeys.Count
$avgKeysPerUser = [math]::Round(($totalPasskeys / $passkeyUserCount), 1)
# Detetar modelos de passkeys
$modelCounts = @{}
foreach ($passkey in $allPasskeys) {
$model = if ([string]::IsNullOrEmpty($passkey.KeyModel)) { "Desconhecido" } else { $passkey.KeyModel }
if (-not $modelCounts.ContainsKey($model)) {
$modelCounts[$model] = 0
}
$modelCounts[$model]++
}
# Tendência de registo
$last30Days = ($allPasskeys | Where-Object { $_.DaysSinceRegistration -le 30 }).Count
$last90Days = ($allPasskeys | Where-Object { $_.DaysSinceRegistration -le 90 }).Count
$last180Days = ($allPasskeys | Where-Object { $_.DaysSinceRegistration -le 180 }).Count
Write-Output "=== Relatório de Adoção de Passkeys ==="
Write-Output "Total de Utilizadores: $totalUsers"
Write-Output "Utilizadores com Passkeys: $passkeyUserCount ($percentAdoption%)"
Write-Output "Total de Passkeys Registadas: $totalPasskeys"
Write-Output "Média de Passkeys por Utilizador: $avgKeysPerUser"
Write-Output ""
Write-Output "Modelos de Passkeys:"
foreach ($model in $modelCounts.Keys) {
$count = $modelCounts[$model]
$percent = [math]::Round(($count / $totalPasskeys) * 100, 1)
Write-Output "- $model: $count ($percent%)"
}
Write-Output ""
Write-Output "Tendência de Registo:"
Write-Output "- Últimos 30 dias: $last30Days passkeys"
Write-Output "- Últimos 90 dias: $last90Days passkeys"
Write-Output "- Últimos 180 dias: $last180Days passkeys"
Utilizadores com Potencial para Passkeys
Para identificar utilizadores que são bons candidatos para adotar passkeys:
# Identificar utilizadores prioritários sem passkeys
$priorityUsers = @()
foreach ($user in $users) {
# Ignorar utilizadores que já têm passkeys
if ($passkeyUsers.UserPrincipalName -contains $user.UserPrincipalName) {
continue
}
# Obter funções do utilizador
$roles = Get-MgUserMemberOf -UserId $user.Id | Where-Object {
$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.directoryRole'
}
# Verificar se é um administrador
$isAdmin = $roles.Count -gt 0
# Obter licenças
$licenses = Get-MgUserLicenseDetail -UserId $user.Id
$hasE5 = $false
foreach ($license in $licenses) {
if ($license.SkuPartNumber -like "*E5*") {
$hasE5 = $true
break
}
}
# Avaliar prioridade baseado em critérios
# (administradores e utilizadores com licenças E5 são bons candidatos)
if ($isAdmin -or $hasE5) {
$priorityUsers += [PSCustomObject]@{
DisplayName = $user.DisplayName
UserPrincipalName = $user.UserPrincipalName
IsAdmin = $isAdmin
HasE5License = $hasE5
Priority = if ($isAdmin) { "Alta" } else { "Média" }
}
}
}
# Apresentar utilizadores prioritários para adoção de passkeys
$priorityUsers |
Sort-Object -Property Priority -Descending |
Format-Table DisplayName, UserPrincipalName, IsAdmin, HasE5License, Priority
Recomendações para Implementação de Passkeys
-
Comece com Utilizadores de Alto Valor: Implemente passkeys primeiro para administradores e utilizadores com acesso a dados sensíveis.
-
Educação e Formação: Desenvolva materiais educativos sobre os benefícios de segurança das passkeys.
-
Abordagem Gradual: Implemente passkeys em paralelo com palavras-passe antes de transicionar completamente.
-
Suporte a Múltiplos Métodos: Permita que utilizadores registem várias passkeys para diferentes dispositivos.
-
Monitore a Adoção: Utilize scripts como este para acompanhar e reportar a adoção na organização.
Considerações de Segurança
- Recuperação de Conta: Desenvolva processos claros de recuperação quando passkeys forem perdidas.
- Integração com MFA: Avalie como passkeys se integram com suas políticas de MFA existentes.
- Compatibilidade: Verifique a compatibilidade com sistemas, browsers e aplicações da sua organização.
- Políticas de Conformidade: Atualize políticas de segurança para incluir o uso de passkeys.