Zum Hauptinhalt springen

Implementierung von FIDO2 / YubiKey in Microsoft Entra ID ohne Mobile Authenticator und Umgang mit Self-Service-Password-Reset (SSPR)

·823 Wörter·4 min

Hinweis: Dieser Artikel wurde automatisch übersetzt. Bei Unklarheiten oder Abweichungen gilt die englische Originalversion.

Übersicht #

FIDO2-Sicherheitsschlüssel ermöglichen eine sichere und bequeme passwortlose Authentifizierung. Für Organisationen, deren Mitarbeiter keine firmeneigenen Telefone besitzen oder keine persönlichen Geräte zur Authentifizierung nutzen möchten, stellt dieser Hardware-Token eine praktikable Alternative dar. Diese Anleitung zeigt die Implementierung von FIDO2/YubiKey als alleinige Authentifizierungsmethode in Microsoft Entra ID.

Wichtig: Ohne konfigurierte Ausnahme für das Self-Service-Passwort-Reset (SSPR) fordert das System Benutzer mit ausschließlicher FIDO2/Yubikey-Nutzung auf, den Microsoft Authenticator zu installieren.

Die Lösung hierfür befindet sich im Kapitel: Umgang mit SSPR

Implementierungsschritte #

FIDO2-Authentifizierung aktivieren

  • Microsoft Entra Admin Center öffnen
  • Zu Authentifizierungsmethoden im Bereich Sicherheit navigieren
  • Passkey (FIDO2) für die gewünschten Benutzer aktivieren

Temporären Zugangspass (TAP) konfigurieren

  • TAP in den Authentifizierungsmethoden-Einstellungen aktivieren
  • Gewünschte Gültigkeitsdauer festlegen (1 bis 24 Stunden)
  • TAP für die initiale FIDO2-Registrierung und Recovery-Szenarien nutzen

Benutzer-Registrierungsprozess

  1. Ein Administrator erstellt einen temporären Zugangspass (TAP) für den Benutzer
  2. Anmeldung unter mysignins.microsoft.com/security-info mit dem TAP
  3. Registrierung des FIDO2 Sicherheitsschlüssels

Sicherheitsvorteile #

  • Phishing-resistente Authentifizierung
  • Unabhängigkeit von mobilen Geräten
  • Minimierung des passwortbezogenen IT-Supports
  • Volle Kompatibilität mit Windows 10/11-Geräten und Webanwendungen

Diese Konfiguration macht den Microsoft Authenticator überflüssig und gewährleistet gleichzeitig robuste Sicherheit durch hardwarebasierte Authentifizierung.

Umgang mit SSPR #

Bei ausschließlicher FIDO2-Schlüssel-Nutzung müssen die betroffenen Benutzer von den SSPR-Konfigurationen ausgenommen werden.

Da SSPR nur eine Einschluss-Gruppe unterstützt, muss eine Gruppe mit allen Benutzern erstellt werden - außer denen, die ausschließlich FIDO2-Schlüssel verwenden. Bei 100 Benutzern, von denen 2 ausgeschlossen werden sollen, enthält die Gruppe entsprechend 98 Benutzer.

Password Properties

Folgende Optionen für die SSPR-Gruppenerstellung sind verfügbar:

  • Eine dynamische Gruppe erstellen, die alle Benutzer einschließt, außer diejenigen mit einem bestimmten Attribut.
    Nachteil: Für mehr als nur eine Handvoll Benutzer ist dies sehr viel manueller Aufwand.

  • Eine Azure Automation erstellen, die eine Gruppe mit Benutzern füllt, die SSPR nutzen dürfen:

    • Alle Benutzer auswählen, ausgenommen jene, die ein FIDO2-Hardware-Token besitzen.
      Nachteil: Neue Benutzer werden aufgefordert, einen Authenticator hinzuzufügen, bis das Skript ausgeführt wird.
    • Benutzer auswählen, die eine oder zwei SSPR-kompatible Authentifizierungsmethoden registriert haben.
      Nachteil: Benutzer ohne registrierte Authentifizierungsmethode werden nicht aufgefordert, eine Methode zu registrieren.

Alle diese Optionen erfordern eine Conditional-Access-Richtlinie, die alle Benutzer für die MFA-Registrierung einschließt, aus folgendem Grund:

Die Option “Benutzer bei der Anmeldung zur Registrierung auffordern?” gilt ausschließlich für die definierte SSPR-Registrierungsgruppe.

Password reset | Registration

Azure Automation #

Für diese Implementierung kommt Option 2.2 zum Einsatz:

Benutzer auswählen, die eine SSPR-kompatible Authentifizierungsmethoden registriert haben.

Folgenden Code in der Automation verwenden (nicht empfohlen, aber das Skript kann auch manuell ausgeführt werden): Anschließend die Gruppe $groupId als SSPR-fähige Gruppe hinzufügen.

Erforderliche Module:

  • Microsoft.Graph

Code: #

Der Code kann auch in unserem Repository gefunden werden: Samily-Scripts

## Variable Declartion Start ##

$clientId = "InsertClientID"
$tenantId = "InsertTenantID"
$thumbprint = "InsertThumbprint"
$groupId = "InsertGroupID" # Replace with the Object ID of your target group

# Insert Enabled Authentication Methods
$authMethodsToCheck = @("#microsoft.graph.microsoftAuthenticatorAuthenticationMethod", 
                        "#microsoft.graph.smsAuthenticationMethod", 
                        "#microsoft.graph.emailAuthenticationMethod")

#Optional UPN Filter
#$UPNs = @("xyz.com",
#          "abc.com")

## Variable Declartion End ##

Connect-MgGraph -ClientId $clientId -TenantId $tenantId -CertificateThumbprint $thumbprint -NoWelcome

# Get all users in Azure AD
$users = Get-MgUser -All -ConsistencyLevel eventual -Property Id,UserPrincipalName
$totalUsers = $users.Count # Total number of users for progress tracking
$currentUser = 0         # Counter for processed users

Write-Output "Getting Users"

# Initialize list for eligible users
$eligibleUsers = @()

Write-Output "Checking Users - Outputting Status in 50 User Increments"

# Iterate through each user and check their authentication methods
foreach ($user in $users) {
    $currentUser++

    if ($currentUser % 50 -eq 0) {
        Write-Output "Checking user $currentUser/$totalUsers"
    }

    $eligible = $true
#Optional UPN Filter
#    foreach ($UPN in $UPNs) {
#        if ($user.UserPrincipalName -like "*$UPN") {
#            $eligible = $false
#            break
#        }
#    }

    if ($eligible) {
        try {
            # Retrieve authentication methods for the user
            $authMethods = Get-MgUserAuthenticationMethod -UserId $user.Id -ErrorAction SilentlyContinue

            # Extract method types
            $authMethodTypes = $authMethods | ForEach-Object { $_.AdditionalProperties["@odata.type"] }

            # Check if user has at least one of the allowed authentication methods
            $hasAllowedAuthMethod = $false
            foreach ($method in $authMethodTypes) {
                if ($authMethodsToCheck -contains $method) {
                    $hasAllowedAuthMethod = $true
                    break
                }
            }

            # Add user to eligible list only if they have an allowed method
            if ($hasAllowedAuthMethod) {
                $eligibleUsers += $user.Id
            }
        } catch {
            Write-Output "Error processing user $($user.UserPrincipalName): $_"
            continue
        }
    }
}

Write-Output "`nFinished checking users."

# Add eligible users to the group, with progress updates
$totalEligibleUsers = $eligibleUsers.Count # Total number of eligible users
$currentEligibleUser = 0                   # Counter for added eligible users
$newMembersAdded = 0

foreach ($userId in $eligibleUsers) {
    $currentEligibleUser++

    # Update progress on the same line for adding users to the group
    Write-Output -NoNewline "`rAdding eligible user $currentEligibleUser/$totalEligibleUsers to the group"

    try {
        # Check if user is already a member of the group
        $isMember = Get-MgGroupMember -GroupId $groupId -All | Where-Object { $_.Id -eq $userId }

        if (-not $isMember) {
            New-MgGroupMember -GroupId $groupId -DirectoryObjectId $userId
            $newMembersAdded++
        }
    } catch {
        Write-Output "Could not add $userId to Group."
        continue
    }
}

Write-Output "`n`n----------------------------------------`n`n"
Write-Output "Process finished - Checked $totalUsers users - $($eligibleUsers.Count) users were eligible - Added $newMembersAdded new members to group"