Azure AD 認証方法のスクリプト作成

Azure AD 認証方法のスクリプト作成

PowerShell を使用した Azure AD アカウントのすべての認証方法の削除

マイクロソフトのプロダクトマネージャーであるMerill Fernando(Graph X-Rayで有名な)は、彼が書いたスクリプトについて興味深いツイートを投稿しました Azure AD アカウントからすべての認証方法を削除する.Azure AD は、 幅広い認証方法 (図1)従来のユーザー名とパスワードの組み合わせから、Microsoft認証アプリの使用まで。

Azure AD Authentication Methods (source: Microsoft)
図 1: Azure AD 認証方法 (ソース: マイクロソフト)

最近のTEC会議, アイデンティティセキュリティのためのマイクロソフトVPアレックスWeinertは、より多くのMicrosoft 365テナントがMFAで自分のアカウントを保護するために情熱的な嘆願をしました.すべての Azure AD アカウントの 26.64% のみが MFA を使用しているのは衝撃的です。管理職を担うアカウントの数字は34.15%と高くなっていますが、それでもまだ不十分です。図 1 に示す右側の方法にアカウントを移動するには、より適切な作業を行う必要があります。

認証方法のスクリプト化

メリルは、スクリプト"ことを認めるきれいではない" これは、Microsoft Graph が現在、アカウントの既定の認証方法を見つける方法をサポートしていないためです。要するに、スクリプトは認証方法を削除しようと試み、失敗した場合は、その方法(Microsoft Authenticatorアプリなど)がデフォルトであると見なし、最後まで残します。既定の認証方法をアカウントから削除できるのは、それが最後の唯一の方法である場合のみです。

いずれにせよ、アカウントをリセットする必要がある場合に備えて、良いスクリプトです。どのくらいの頻度でこれをやりたいのかはわかりませんが、そうかもしれないと思います。管理ツールボックスへのすべての貢献は感謝して受け取られます。

Authentication Methods and the Microsoft Graph PowerShell SDK

Merill のスクリプトは、Microsoft Graph PowerShell SDK のコマンドレットを使用しています。私はPowerShell SDKが大好きですが、使用するコマンドレットの数の点では船外に出てしまうことがあります。これは、MicrosoftがGraph APIからSDKモジュールとコマンドレットを生成する方法が原因だと思います。 オートレスト.コードを自動的に生成する方法があるのは良いことですが、時には人間の知能がもっとうまくいくことがあります。通常、MicrosoftはSDKの新しいバージョンを毎月生成しますが、エラーが忍び寄って1か月にいくつかのバージョンが表示されることがあります(これは、バージョン1.12にいくつかのマイナーアップデート(現在のバージョンは1.12.3)があったときに起こりました)。

たとえば、すべての認証方法には、アカウントに追加 (新規)、更新、および削除するための個別のコマンドレットがあります。Merill のスクリプトでメソッドを削除するために使用されるコマンドレットのセットは次のとおりです。

  • Remove-MgUserAuthenticationFido2Method
  • Remove-MgUserAuthenticationEmailMethod
  • Remove-MgUserAuthenticationMicrosoftAuthenticatorMethod
  • Remove-MgUserAuthenticationPhoneMethod
  • Remove-MgUserAuthenticationSoftwareOathMethod
  • Remove-MgUserAuthenticationTemporaryAccessPassMetho
  • Remove-MgUserAuthenticationWindowHelloForBusinessMethod

7 つの異なるコマンドレット (これらのコマンドレットのいずれかで従来のパスワード メソッドを削除することはできません)、またはメソッドを追加および更新するために他のコマンドレットを追加する場合は 21。SDK がすべてを統合して、追加するコマンドレット、更新するコマンドレット、認証方法を削除するコマンドレットを 1 つ用意すると、全体的に簡単になります。しかし、メソッドごとに別々のAPIリクエストが存在するため、混乱を招く大量のコマンドレットを扱うことが非難されていると思います。

認証方法のレポート

私は、どのような認証方法が使用されているかを調べるのが良い考えだと判断しました。Azure AD の認証方法レポートを作成するスクリプトと、MFA で保護されていない管理者アカウントを報告するスクリプトを既に用意していますが、常に別のスクリプトの余地があります (このバージョンでは、SMS チャレンジに使用される電話番号など、各認証方法に関するもう少し多くの情報が抽出されます)。コードの重要な部分は次のとおりです(完全なスクリプトは GitHub から入手できます。):

Write-Host "Finding licensed Azure AD accounts"
[array]$Users = Get-MgUser -Filter "assignedLicenses/`$count ne 0 and userType eq 'Member'" -ConsistencyLevel eventual -CountVariable Records -All
If (!($Users)) { Write-Host "No licensed users found in Azure AD... exiting!"; break }

$i = 0
$Report = [System.Collections.Generic.List[Object]]::new()
ForEach ($User in $Users) {
 $i++
 Write-Host ("Processing user {0} {1}/{2}." -f $User.DisplayName, $i, $Users.Count)
 $AuthMethods = Get-MgUserAuthenticationMethod -UserId $User.Id
 ForEach ($AuthMethod in $AuthMethods) {
  $P1 = $Null; $P2 = $Null
  $Method = $AuthMethod.AdditionalProperties['@odata.type']
  Switch ($Method) {
     "#microsoft.graph.passwordAuthenticationMethod" {
       $DisplayMethod = "Password"
       $P1 = "Traditional password"
     }
     "#microsoft.graph.microsoftAuthenticatorAuthenticationMethod" {
       $DisplayMethod = "Authenticator" 
       $P1 = $AuthMethod.AdditionalProperties['displayName']
       $P2 = $AuthMethod.AdditionalProperties['deviceTag'] + ": " + $AuthMethod.AdditionalProperties['clientAppName'] 
     }
     "#microsoft.graph.fido2AuthenticationMethod" {
       $DisplayMethod = "Fido 2 Key"
       $P1 = $AuthMethod.AdditionalProperties['displayName']
       $P2 = Get-Date($AuthMethod.AdditionalProperties['creationDateTime']) -format g
     }
     "#microsoft.graph.phoneAuthenticationMethod" {
       $DisplayMethod = "Phone" 
       $P1 = "Number: " + $AuthMethod.AdditionalProperties['phoneNumber']
       $P2 = "Type: " + $AuthMethod.AdditionalProperties['phoneType']
     }
    "#microsoft.graph.emailAuthenticationMethod" {
      $DisplayMethod = "Email"
      $P1 = "Address: " + $AuthMethod.AdditionalProperties['emailAddress']
     }
    "#microsoft.graph.passwordlessMicrosoftAuthenticatorAuthenticationMethod" {
      $DisplayMethod = "Passwordless"
      $P1 = $AuthMethod.AdditionalProperties['displayName']
      $P2 = Get-Date($AuthMethod.AdditionalProperties['creationDateTime']) -format g
    }
  }
  
  $ReportLine   = [PSCustomObject] @{ 
     User   = $User.DisplayName
     Method = $DisplayMethod
     Id     = $AuthMethod.Id
     P1     = $P1
     P2     = $P2 
     UserId = $User.Id }
  $Report.Add($ReportLine)
 } #End ForEach Authentication Method
} #End ForEach User

このコードには、テナントで例が利用できないため、考えられるすべての認証方法の選択肢は含まれていません。一時パスのようなメソッドを処理するようにコードを更新するのは簡単です。図 2 は、スクリプトによって生成される出力を示しています。

Azure AD アカウントで見つかった認証方法の一覧
図 2: Azure AD アカウントで見つかった認証方法の一覧

私を困惑させる1つのことは、私のアカウントにMicrosoft Authenticato用に複数のメソッドがリストされている理由ですr アプリ。どちらも私のiPhone 11に関連していますが、電話の名前を変更した後、Azure ADが2番目のレコードを作成した可能性があります。それは時間があるときに見るべきものです。

データを分析して、さらに洞察を得ることができます。例えば:

Write-Host ""
Write-Host "Authentication Methods found"
Write-Host "----------------------------"
Write-Host ""
$Report | Group-Object Method | Sort-Object Count -Descending | Select Name, Count
Authentication Methods found
----------------------------

Name          Count
----          -----
Password         33
Phone            21
Email            11
Authenticator     5
Fido 2 Key        2
Passwordless      1

他のスクリプトは、管理者の役割の当座預金口座、最終サインイン日など、自分にとって重要と思われるレポートの他の側面に対処する方法を示しています。PowerShell の優れた点は、その柔軟性です。さまざまなスクリプトから切り取り&ペーストして、新しいテイクを作成し、要件を満たします。それは素晴らしい能力です。


Azure AD と Office 365 アプリケーションが実際に継続的にどのように動作するかについては、 IT プロフェッショナル向け Office 365 電子ブック。毎月の更新プログラムにより、サブスクライバーは Office 365 エコシステム全体で何が重要かを常に把握できます。

未分類

Posted by admin