Azure IT Powershell

Report User with not configured MFA Settings in Azure

Ausgangslage

Es sind zwei AD Gruppen vorhanden die den Zugang der User via Conditional Access auf Azure/O365 ressourcen steuern.

Gruppe A: User in der Gruppe haben Zugriff auf die Azure / O365 Ressourcen von einem Azure AD Hybrid Joined Device, ohne das MFA verlangt wird. Findet der Zugriff von einem nicht Azure AD Hybrid Joined Device statt, wird der Zugriff blockiert

Gruppe B: User in der Gruppe haben Zugriff auf Azure / O365 REssourcen von einem Azure AD Hybrid Joined Deivce, ohne das MFA verlangt wird. Findet der Zugriff von einem nicht Azure AD Hybrid Joined Device statt, so erhält der User Zugriff, muss aber zusätlich die MFA authentifizierung bestätigen.

Das heisst somit, das ein User der Gruppe B, wenn er von z.B. seinem privaten Gerät auf eine entsprechende Ressource zugreifen will, beim ersten Zugriff die seite des MFA Setup (https://aka.ms/mfasetup) erhält. Er muss dann dort für sich seine MFA Settings defineren. Findet nach dieser initial Konfiguration wieder ein Zugriff auf die entsprechenden Ressourcen statt, so erhält der User nach Eingabe seiner Credentials die entsprechende MFA benachrichtigung.

Problematik

Wenn ein User dieser Gruppe B für sich MFA initial nie konfiguriert (er logt sich z.B. gar nicht von extern ein und erhält so gar nie die MFA Initial Konfig aufforderung), so stellt dies ein potentielles Sicherheitsrisiko dar. Erhält ein dritter die Credential des Users und loggt sich damit von extern ein, so erhält er die initiale MFA Setupaufforderung. Er kann diese dann für sich konfigurieren und erhält so eigentlich unbemerkt Zugriff auf die Ressourcen. Genau das möchte man mit MFA aber vermeiden.

Workarround / Lösung

Eine Möglichkeit diese Problematik zu entschärfen, ist zu kontrollieren ob es User Accounts in der Gruppe B gibt, welche das initiale MFA setup noch nicht vorgenommen haben. Dazu kann man z.B. einmal in der Woche einen Report generieren lassen der die User der Gruppe B ausliest und prüft, ob sie die MFA konfig vorgenommen haben. Alle User die dies nicht gemacht haben, werden dann in einer Email zusammengefasst und z.B. an den Servicedesk zur Überprüfung gesendet.

Hier das Script:

<# 1. Read Users from Condi Access Groups which are allowed to Access Cloud Ressources with MFA
   2. Filter those Users and List only Users older than 30 Days (exclude newly Created users)
   3. Check if those Users did initial MFA config
   4. Create Report of Users
   5. Send Email with UserList to Ticketing System
#>

  # Variables
  $CredAccount = "<Account Name in Credential Store where script is scheduled>"
  $ADGroup = "<AD Grupp with User used in Condi Access for Access with MFA>"
  $MailServer = "smtp.domain.com"
  $MailFrom = "report@domain.com"
  $MailTo = "servicedesk@domain.com"


  # Get Credentials to connect to Azure AD from local Credential Store
  $cred = Get-StoredCredential -Target $CredAccount
 
  # 1. Connect to MsolService and List Users in Condi Access Groups
  Connect-MsolService -Credential $cred
  $users = Get-ADGroupMember $ADGroup -Recursive

  # 2. Get User Account older than 30 Days (created) - or in other words, exclude newly created user accounts whitin 60 days which maybe have not started working
  $age = ((Get-Date).AddDays(-30)).Date
  $users = $users | Get-ADUser -Properties whenCreated | where {$_.whenCreated -le $age}

  # 3. Get users which have not completed initial MFA configuration
  $nomfaconfigusers = $users | get-msoluser | where {$_.StrongAuthenticationMethods.count -eq 0}

  # 4. Create User Report
  $userarray=@()
  foreach ($u in $nomfaconfigusers) {
    
    $CondiGroup= get-aduser -filter {UserPrincipalName -eq $u.UserPrincipalName} | Get-ADPrincipalGroupMembership | where {$_.Name -match "$ADGroup"} | Select-Object Name

    #aggregate results
    $user = New-Object Object
    $user|Add-Member -NotePropertyName UserName -NotePropertyValue $u.Displayname
    $user|Add-Member -NotePropertyName UserPrincipalName -NotePropertyValue $u.UserPrincipalName
    $user|Add-Member -NotePropertyName Country -NotePropertyValue $u.country
    $user|Add-Member -NotePropertyName CondiAccessGroup -NotePropertyValue $CondiGroup.name

    $userarray += $user

   }

  #4. Send EmailReport to Ticketing if Users are present with to report

  if ($userarray.count -ge 1) {

  #region mailsend
  #create empty credentials, otherwise mailsend will fail because of powershell authentictaion (error 5.7.1)
  $pass = ConvertTo-SecureString "whatever" -asplaintext -force
  $MailCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "NT AUTHORITY\ANONYMOUS LOGON", $pass
  $MailSubject = "Azure MFA User Report"
  $MailBody = @"
  <style>
  TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
  TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
  TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
  </style>
"@
  $MailBody += "<b><font face=verdana size=3 color=Black>Azure MFA User Report</b><br></font><br>"
  $MailBody += "<br><font face=verdana size=2>Following Users are enabled for accessing Leister Group Cloud Resources from non Leister Devices with MFA, but did not complete initial MFA configuration for their Account.<br>"
  $MailBody += "<br><b><font color=red>!! This is a potential security risk !! </font></b><br><br>"
  $MailBody += "Contact User and ask if Access from non Leister Device is needed. If yes, configure MFA with User. If not, move user to block Group for MFA / Condi Access.<br>"

  $MailBody += $userarray | Sort-Object -Property "Username" | ConvertTo-Html

  send-mailmessage -to $MailTo -from $MailFrom -Encoding UTF8 -BodyAsHtml -Subject $MailSubject -body "$MailBody" -credential $MailCreds -smtpserver $MailServer
  }
  else
  {exit}
#endregion mailsend

Man könnte natürlich das Script auch so anpassen, das der User direkt per Mail informiert wird es müsse MFA initial konfigurieren. Je nach Prozess wie so was ablaufen soll.

Hinweis: Es ist via Conditional Access möglich (aktuell in Preview), das man die Initiale MFA Registrierung nur ab Trusted Locations (z.b ab gewissen IP ranges) vornehmen kann. Dies kann die Problematik auch entschärfen. Infos dazu sind hier zu finden.