Azure MFA automatisiert für alle Accounts einer Domain aktivieren

Im folgenden Beitrag möchte ich automatisiert per Script sicherstellen, dass sich alle Microsoft Online (MSO) User meiner Custom Domain per Azure Multifactor-Authentication (MFA) anmelden müssen. User der Tenant Default-Domain (…@<Tenant>.microsoftonline.com) bleiben unverändert.

Vorarbeit

Bevor man z.B. per Scheduled Task regelmäßig ein Script mit Credentials zur Anmeldung an MSO ausführen lassen kann, muss dafür gesorgt werden, dass dem Script auch Credentials zur Verfügung stehen. Hierzu muss einmalig (oder bei Änderung des Passworts) eine verschlüsselte Credential Datei erzeugt werden, mit der im Folgenden dann gearbeitet wird. Wie diese Datei erzeugt wird, ist in diesem Beitrag erläutert.

Wichtig:
Der User, dessen Credentials man für das Script verwendet, sollte selbst kein Synced Account sein, sondern ein In-Cloud Account. Da mit dem Script MFA für alle Synced Accounts aktiviert wird (bzw. für alle Accounts einer Custom Domain), würde dann natürlich auch der „Script-User“ MFA aktiviert werden – mit MFA ist allerdings dann keine Anmeldung an Azure per Script mehr möglich. Klar soweit, oder?

Option 1: MFA-Aktivierung mit Lizenzierung

Option 1 führt die Lizenzierung und MFA-Aktivierung in einem Schritt durch. Um die zu bearbeitenden User Accounts zu ermitteln, wird daher der Lizenzierungsstatus herangezogen. Zudem ist für eine Lizenz-Zuweisung im Vorfeld die Definition der User Location erforderlich.

# MS Online PowerShell Modul importieren
Import-Module MSOnline

# Anmelden/Verbinden an MS Online
$Credentials = Import-Clixml -Path ".\Credentials.xml"
Connect-MsolService -Credential $Credentials

# Usage Location konfigurieren (z.B. "DE" für Deutschland)
Get-MsolUser -All | Where-Object {$_.UsageLocation -eq $null} | Set-MsolUser -UsageLocaton "DE"

# Unlizenzierte Benutzer ermitteln und in Variable $users umleiten
$users = Get-MsolUser -All -DomainName <Domain-Name> -UnlicensedUsersOnly

# Lizenz zuweisen und MFA aktivieren für alle Benutzer in $users
$users | foreach {
Set-MsolUserLicense -UserPrincipalName $_.UserPrincipalName -AddLicenses "<Tenant-Name>:MFA_PREMIUM"
$mfa = New-Object -TypeName Microsoft.Online.Administration.StrongAuthenticationRequirement
$mfa.RelyingPart = "*"
$mfa.State = "Enabled"
Set-MsolUser -UserPrincipalName $_.UserPrincipalName -StrongAuthentication Requirements $mfa
}

Im obigen Beispiel verwende ich die MFA_PREMIUM Lizenz; der Wert ist natürlich entsprechend der Lizenzierung des Tenants ggf. anzupassen.

Option 2: MFA-Aktivierung ohne Lizenzierung

Bei Option 2 wird nur die MFA-Aktivierung durchgeführt. Das ist z.B. dann erforderlich, wenn die Lizenzierung schon über eine AD-Gruppe automatisiert im Azure Portal durchgeführt wird. In diesem Fall wird der zu bearbeitende User Account nicht am Lizenzierungsstatus, sondern am MFA-Status ausgewählt.

# MS Online PowerShell Modul importieren
Import-Module MSOnline

# Anmelden/Verbinden an MS Online
$Credentials = Import-Clixml -Path ".\Credentials.xml"
Connect-MsolService -Credential $Credentials

# MFA-disabled Users ermitteln und in Variable $users umleiten
$users = Get-MsolUser -All -DomainName <Domain-Name> | Where-Object {$_.StrongAuthenticationRequirements.State -eq $null}

# MFA aktivieren für alle Benutzer in $users
$users | foreach {
$mfa = New-Object -TypeName Microsoft.Online.Administration.StrongAuthenticationRequirement
$mfa.RelyingPart = "*"
$mfa.State = "Enabled"
Set-MsolUser -UserPrincipalName $_.UserPrincipalName -StrongAuthentication Requirements $mfa
}

Komplikationen bei der Ermittlung des MFA-Status

Obwohl das vorherige Script i.d.R. funktioniert, hatte ich auch schon den Fall, dass nicht-MFA-aktivierte User Accounts anhand des o.g. Attributs nicht ausgelesen werden konnten, bzw. die Abfrage keine Werte zurückgeliefert hat. Ist dies der Fall, wird es komplizierter, da die Filterung umgekehrt erfolgen muss, d.h. alle MFA-aktivierten Accounts müssen aus der Gesamtliste ausgeschlossen werden und nur der Rest wird bearbeitet. Dazu ist etwas Trickserei notwendig. Gelöst habe ich das, indem ich alle Benutzer abfrage und eine eigene Spalte MultiFactorAuthentication definiere (da kann man natürlich auch was Kürzeres für nehmen :-)). Bei MFA-aktivierten Benutzern befülle ich das Feld mit ihrem Wert aus StrongAuthenticationRequirements.State („Enabled“ oder „Enforced“), bei nicht MFA-aktivierten Benutzern befülle ich die Spalte manuell mit dem String „Disabled“. Als letzten Schritt filtere ich auf Benutzer, bei denen die Spalte den String „Disabled“ enthält.

# MS Online PowerShell Modul importieren
Import-Module MSOnline

# Anmelden/Verbinden an MS Online
$Credentials = Import-Clixml -Path ".\Credentials.xml"
Connect-MsolService -Credential $Credentials

# MFA-disabled Users ermitteln und in Variable $users umleiten
$users = Get-MsolUser -All -DomainName <Domain-Name> | select UserPrincipalName,@{N="MultiFactorAuthentication"; E={ if( $_.StrongAuthenticationRequirements.State -ne $null){ $_.StrongAuthenticationRequirements.State} else { "Disabled"}}} | Where-Object {$_.MultiFactorAuthentication -eq "Disabled"}

# MFA aktivieren für alle Benutzer in $users
$users | foreach {
$mfa = New-Object -TypeName Microsoft.Online.Administration.StrongAuthenticationRequirement
$mfa.RelyingPart = "*"
$mfa.State = "Enabled"
Set-MsolUser -UserPrincipalName $_.UserPrincipalName -StrongAuthentication Requirements $mfa
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.