Skip to content
Go back

Utilizadores com Passkeys

Published:  at  10:00 AM

Í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:

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

  1. Comece com Utilizadores de Alto Valor: Implemente passkeys primeiro para administradores e utilizadores com acesso a dados sensíveis.

  2. Educação e Formação: Desenvolva materiais educativos sobre os benefícios de segurança das passkeys.

  3. Abordagem Gradual: Implemente passkeys em paralelo com palavras-passe antes de transicionar completamente.

  4. Suporte a Múltiplos Métodos: Permita que utilizadores registem várias passkeys para diferentes dispositivos.

  5. Monitore a Adoção: Utilize scripts como este para acompanhar e reportar a adoção na organização.

Considerações de Segurança

Recursos Adicionais


Suggest Changes

Previous Post
Utilizadores Capazes de SSPR
Next Post
Utilizadores Apenas em Cloud