Implementierung von FIDO2 / YubiKey in Microsoft Entra ID ohne Mobile Authenticator und Umgang mit Self-Service-Password-Reset (SSPR)
Inhaltsverzeichnis
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
- Ein Administrator erstellt einen temporären Zugangspass (TAP) für den Benutzer
- Anmeldung unter mysignins.microsoft.com/security-info mit dem TAP
- 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 #
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.
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 Benutzer auswählen, ausgenommen jene, die ein FIDO2-Hardware-Token besitzen.
Alle diese Optionen erfordern eine Conditional-Access-Richtlinie, die alle Benutzer für die MFA-Registrierung einschließt, aus folgendem Grund:
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"