この記事では、Windows Server 上の Microsoft Active Directory フェデレーション サービス (AD FS) (AD FS) でのアカウント ロックアウトの問題をトラブルシューティングする手順について説明します。
元の製品バージョン: Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012
元の KB 番号: 4471013
Windows Server の AD FS でアカウントロックアウトの問題が発生する可能性があります。 この問題をトラブルシューティングするには、最初に次の点を確認します。
- AD FS サーバー用に構成 Microsoft Entra Connect Health がある場合は、「 接続正常性を使用してユーザー ログイン アクティビティのデータを生成する 」セクションに移動します。
- AD FS サーバー用に構成Microsoft Entra Connect Healthがない場合は、AD FS および Web アプリケーション プロキシ サーバーからの Collect AD FS イベント ログセクションに移動します。
Connect Health を使用してユーザー ログイン アクティビティのデータを生成する
Connect Health を使用して、ユーザー ログイン アクティビティに関するデータを生成できます。 Connect Health は、AD FS ファームで行われた不正なパスワード試行の上位に関するレポートを生成します。
不正なパスワード試行のユーザー アカウントと IP の一覧を分析するにはこの記事の情報を参照してください。 次に、 不適切なパスワード試行の影響を受けるアカウントの IP とユーザー名を分析します。
AD FS および Web アプリケーション プロキシ サーバーから AD FS イベント ログを収集する
手順 1: AD FS および Web アプリケーション プロキシ サーバーから AD FS イベント ログを収集する
イベント ログを収集するには、まず監査用に AD FS サーバーを構成する必要があります。 AD FS ファームのロード バランサーがある場合は、ファーム内の各 AD FS サーバーで監査を有効にする必要があります。 Web アプリケーション プロキシ サーバーで監査を構成する必要はありません。
監査用に AD FS サーバーを構成するには、次の方法を使用できます。
手順 2: AD FS ログを検索する
Windows Server 2012 R2 または Windows Server 2016 AD FS の場合は、すべての AD FS サーバーのセキュリティ イベント ログで"イベント ID 411 ソース AD FS 監査" イベントを検索します。 "411 イベント" に関する次の情報に注意してください。
- ADFS アカウント ロックアウトと Bad Cred Search (AD FSBadCredsSearch.ps1)PowerShell スクリプトをダウンロードして、AD FS サーバーで "411" イベントを検索できます。 このスクリプトは、UserPrincipalName、提出者の IP アドレス、AD FS ファームへの不正な資格情報の送信の時刻を含む CSV ファイルを提供します。 Excel で CSV ファイルを開き、ユーザー名、IP アドレス、または時刻ですばやくフィルター処理します。
- これらのイベントには、対象ユーザーのユーザー プリンシパル名 (UPN) が含まれます。
- これらのイベントには、"トークン検証に失敗しました" というメッセージが含まれています。このメッセージは、無効なパスワード試行またはアカウント ロックアウトを示すメッセージです。
- サーバーに "411" イベントが表示されていても、IP アドレス フィールドがイベントに含まれていない場合は、最新の AD FS 修正プログラムがサーバーに適用されていることを確認します。 詳細については、「MS16-020: サービス拒否に対処するためのActive Directory フェデレーション サービス (AD FS)のセキュリティ更新プログラム: 2016 年 2 月 9 日を参照してください。
Windows Server 2008 R2 または Windows Server 2012 AD FS の場合、必要なイベント 411 の詳細はありません。 代わりに、次の PowerShell スクリプトをダウンロードして実行し、セキュリティ イベント 4625 (不適切なパスワード試行) と 501 (AD FS 監査の詳細) を関連付けて、影響を受けるユーザーに関する詳細を見つけます。
- ADFS セキュリティ監査イベント パーサー (ADFSSecAuditParse.ps1) PowerShell スクリプトをダウンロードして、AD FS サーバーでイベントを検索できます。 このスクリプトは、UserPrincipalName、提出者の IP アドレス、AD FS ファームへの不正な資格情報の送信の時刻を含む CSV ファイルを提供します。
- また、このメソッドを使用して、"411" イベントのユーザーに対して成功した接続を調査することもできます。 詳細については、AD FS "501" イベントを検索できます。
- PowerShell スクリプトを実行してイベントを検索する場合は、"411" イベントで識別されたユーザーの UPN を渡すか、アカウント ロックアウト レポートで検索します。
- 悪意のある送信者の IP アドレスは、"501" イベントの 2 つのフィールドのいずれかに表示されます。
- Web ベースのシナリオとほとんどのアプリケーション認証シナリオでは、悪意のある IP が x-ms-client-ip フィールドに表示されます。
不正なパスワード試行の影響を受けるアカウントの IP とユーザー名を分析する
IP アドレスとユーザー名を列挙したら、予期しないアクセス場所の IP アドレスを特定します。
外部の不明な IP から試行されたかどうか。
- 外部の不明な IP から試行された場合は、最新の修正プログラム AD FS サーバーの更新に移動します。
- 外部の不明な IP から試行されない場合は、 Make に移動して、サービスまたはアプリケーションで資格情報が更新されていることを確認します。
最新の修正プログラムを使用して AD FS サーバーを更新する
AD FS サーバーに最新の機能があることを確認するには、AD FS サーバーと Web アプリケーション プロキシ サーバーの最新の修正プログラムを適用します。 さらに、Windows Server 2012 R2 で、後で使用されるイベント 411 の IP アドレスをログに記録するには、修正プログラムの 3134222 が必要です。
エクストラネット ロックアウトが有効になっているかどうかを確認する
Get-ADFSProperties を使用して、エクストラネット ロックアウトが有効になっているかどうかを確認します。
- エクストラネット ロックアウトが有効になっている場合は、「 エクストラネット ロックアウトと内部ロックアウトのしきい値を確認するに移動します。
- エクストラネット ロックアウトが有効になっていない場合は、適切なバージョンの AD FS に対して以下の手順を開始します。
ロックアウトの状態を確認する手順
Windows Server 2012 R2 以降のバージョンの場合
スマート ロックアウトは、AD FS 2016 および 2012 R2 で更新プログラムを通じて間もなく利用可能になる新機能です。 このセクションは、機能が使用可能になるとすぐにスマート ロックアウトを有効にするための適切な手順で更新されます。 次に、「 エクストラネット ロックアウトと内部ロックアウトのしきい値を確認するに移動します。
Windows Server 2008 R2 Windows 以前のバージョンの場合
AD FS サーバーを Windows Server 2012 R2 または Windows Server 2016 にアップグレードすることをお勧めします。 詳細については、「Windows Server 2016 での AD FS へのアップグレード」に関する記事を参照してください。 次に、Windows Server 2012 R2 以降のバージョンの手順に従います。
手順 1: エクストラネット ロックアウトと内部ロックアウトのしきい値を確認する
エクストラネット ロックアウトと内部ロックアウトのしきい値が正しく構成されていることを確認します。 詳細については、「 Recommended セキュリティ構成を参照してください。 一般に、 ExtranetLockoutThreshold は AD のロックアウトしきい値より小さくする必要があります。そのため、ユーザーは内部アクセスのために Active Directory でロックアウトされることなく、エクストラネット アクセスのためにのみロックアウトされます。
手順 2: 先進認証と証明書ベースの認証を有効にする
ブルート フォース攻撃のリスクを減らすために、先進認証、証明書ベースの認証、およびこの手順に記載されているその他の機能を有効にすることをお勧めします。
先進認証をデプロイする
Exchange Online で現在使用されている攻撃ベクトルの 1 つを削除するだけでなく、Office クライアント アプリケーションに先進認証を展開することで、組織は多要素認証の恩恵を受けることができます。 先進認証は、Windows、iOS、および Android プラットフォーム全体のすべての最新のOffice アプリでサポートされています。
詳細については、「 Office 365 の先進認証を展開する方法を参照してください。
ユーザー名とパスワードベースのアクセス要求は、プロアクティブで事後対応的な防御にもかかわらず引き続き脆弱であるため、組織はできるだけ早くパスワードベース以外のアクセス方法を採用することを計画する必要があります。
AD FS と Web アプリケーション プロキシでは、次のパスワードベース以外の認証の種類を使用できます。
証明書ベースの認証
ユーザー名とパスワードベースのアクセスの代わりに証明書ベースの認証を使用する場合、ユーザー アカウントとアクセスは次の方法で保護されます。
ユーザーはインターネット経由で自分のパスワードを使用しないため、これらのパスワードは漏えいの影響を受けにくいです。 ユーザー名とパスワードのエンドポイントは、ファイアウォールで完全にブロックできます。 これにより、ロックアウトまたはブルート フォース攻撃の攻撃ベクトルが削除されます。
ファイアウォールでユーザー名とパスワードのエンドポイントを使用できる状態が維持されている場合でも、ロックアウトを引き起こす悪意のあるユーザー名とパスワードベースの要求は、証明書を使用するアクセス要求には影響しません。 そのため、正当なユーザーのアクセスは保持されます。
Microsoft Entra ID と Office 365 の証明書ベースの認証の詳細については、この Microsoft Entra ID のブログ記事を参照してください。
Azure Multi-Factor Authentication (MFA)
Azure MFA は、パスワードとユーザー名のエンドポイントを完全に使用しないように、証明書ベースの認証と同じ方法で使用できる、パスワードベース以外のアクセス方法です。
Azure MFA は、次のシナリオでアカウントを保護するために使用できます。
シナリオ 長所 エクストラネット経由の追加認証として Azure MFA を使用する Azure MFA または追加の認証プロバイダーを AD FS に追加し、エクストラネット要求に使用する追加の方法を要求すると、盗まれたパスワードまたはブルート 強制パスワードを使用してアカウントがアクセスから保護されます。 これは、AD FS 2012 R2 および 2016 で実行できます。 プライマリ認証として Azure MFA を使用する これは、AD FS 2016 の新機能で、パスワードではなく Azure MFA を使用してパスワードを使用せずにアクセスできます。 これにより、パスワード侵害とロックアウトの両方が保護されます。 AD FS を使用して Azure MFA を構成する方法の詳細については、「 AD FS 2016 と Azure MFA の構成」を参照してください。
Windows Hello for Business
Windows Hello for Business は、Windows 10 で使用できます。 Windows Hello for Business では、ユーザーとデバイスの両方に関連付けられている強力な暗号化キーに基づいて、エクストラネットからパスワードを使用せずにアクセスできます。
Windows Hello for Business は、Windows Server 2016 の AD FS でサポートされています。 Windows Hello for Business を使用したパスワードなしの ID の認証を参照してください。
手順 3: レガシ認証と未使用のエンドポイントを無効にする
次のように、Exchange Online を通じて EAS クライアントによって使用されるレガシ エンドポイントを無効にします。
/adfs/services/trust/13/usernamemixed endpoint
Note
これを行うと、一部の機能が中断される可能性があります。 ただし、攻撃者が悪用できるサーフェス ベクトルを減らすのに役立ちます。 また、未使用のエンドポイントを無効にすることをお勧めします。
問題が解決しているかどうかを確認します。
サービスまたはアプリケーションで資格情報が更新されていることを確認します
ユーザー アカウントがサービス アカウントとして使用されている場合、サービスまたはアプリケーションの最新の資格情報が更新されない可能性があります。 このような状況では、サービスが間違った資格情報を使用して認証を試み続ける可能性があります。 これにより、ロックアウト状態が発生します。
この問題を解決するには、サービスまたはアプリケーションのサービス アカウント構成を調べて、資格情報が正しいことを確認します。 そうでない場合は、次の手順に従います。
アプリケーションでキャッシュされた資格情報をクリアする
ユーザー資格情報がいずれかのアプリケーションにキャッシュされている場合、認証を繰り返すとアカウントがロックされる可能性があります。 この問題を解決するには、アプリケーションでキャッシュされた資格情報をクリアします。 問題が解決しているかどうかを確認します。
ADFS アカウントロックアウトと不正な Cred 検索
PARAM ($PastDays = 1, $PastHours)
#************************************************
# ADFSBadCredsSearch.ps1
# Version 1.0
# Date: 6-20-2016
# Author: Tim Springston [MSFT]
# Description: This script will parse the ADFS server's (not proxy) security ADFS
# for events which indicate an incorrectly entered username or password. The script can specify a
# past period to search the log for and it defaults to the past 24 hours. Results will be placed into a CSV for
# review of UPN, IP address of submitter, and timestamp.
#************************************************
cls
if ($PastHours -gt 0)
{$PastPeriod = (Get-Date).AddHours(-($PastHours))}
else
{$PastPeriod = (Get-Date).AddDays(-($PastDays)) }
$Outputfile = $Pwd.path + "\BadCredAttempts.csv"
$CS = get-wmiobject -class win32_computersystem
$Hostname = $CS.Name + '.' + $CS.Domain
$Instances = @{}
$OSVersion = gwmi win32_operatingsystem
[int]$BN = $OSVersion.Buildnumber
if ($BN -lt 9200){$ADFSLogName = "AD FS 2.0/Admin"}
else {$ADFSLogName = "AD FS/Admin"}
$Users = @()
$IPAddresses = @()
$Times = @()
$AllInstances = @()
Write-Host "Searching event log for bad credential events..."
if ($BN -ge 9200) {Get-Winevent -FilterHashTable @{LogName= "Security"; StartTime=$PastPeriod; ID=411} -ErrorAction SilentlyContinue | Where-Object {$_.Message -match "The user name or password is incorrect"} | % {
$Instance = New-Object PSObject
$UPN = $_.Properties[2].Value
$UPN = $UPN.Split("-")[0]
$IPAddress = $_.Properties[4].Value
$Users += $UPN
$IPAddresses += $IPAddress
$Times += $_.TimeCreated
add-member -inputobject $Instance -membertype noteproperty -name "UserPrincipalName" -value $UPN
add-member -inputobject $Instance -membertype noteproperty -name "IP Address" -value $IPAddress
add-member -inputobject $Instance -membertype noteproperty -name "Time" -value ($_.TimeCreated).ToString()
$AllInstances += $Instance
$Instance = $null
}
}
$AllInstances | select * | Export-Csv -Path $Outputfile -append -force -NoTypeInformation
Write-Host "Data collection finished. The output file can be found at $outputfile`."
$AllInstances = $null
ADFS セキュリティ監査イベント パーサー
PARAM ($SearchCriteria, $PastDays = 1, $PastHours)
#************************************************
# ADFSSecAuditParse.ps1
# Version 1.0
# Date: 2-2-2016
# Author: Tim Springston [MSFT]
# Description: This script will parse an ADFS Security event log file (EVTX)
# and search for audit events related to a specific user or other criteria.
# The script will work for the each ADFS login instance for a given criteria during a stated time frame.
# If you need to locate a second then filter and save the event log to focus in.
# Return an array of initial instance IDs with the criteria, run the search function against each and output
# a unique text file for each.
#************************************************
cls
if ($PastHours -gt 0)
{
$PastPeriod = (Get-Date).AddHours(-($PastHours))
}
else
{$PastPeriod = $PastDays}
$CS = get-wmiobject -class win32_computersystem
$Hostname = $CS.Name + '.' + $CS.Domain
$Instances = @()
Get-Winevent -ComputerName $Hostname -LogName Security | Where-Object {(($_.ID -eq 501) `
-and ($_.Properties.Value -contains $SearchCriteria) -and ($_.TimeCreated -gt $PastPeriod))} | % { $Instances += $_.Properties[0].Value}
function FindADFSAuditEvents {
param ($valuetomatch, $counter, $instance, $PastPeriod)
$Results = $pwd.Path + "\" + $SearchCriteria + "-ADFSSecAudit" + '-' + $Counter + ".txt"
$SearchString = $SearchCriteria + " and instance " + $Instance + " in Security event log."
"Security Audit Events which match $SearchString" | Out-File $Results -Encoding UTF8
Get-WinEvent -ComputerName $Hostname -LogName Security -WarningAction SilentlyContinue | `
Where-Object -ErrorAction SilentlyContinue {($_.TimeCreated -gt $PastPeriod) -and (($_.Properties -contains $ValueToMatch) -or ($_.Properties[0].Value -match $Instance))} | % {
$Event = New-object PSObject
add-member -inputobject $Event -membertype noteproperty -name "Event ID" -value $_.ID
add-member -inputobject $Event -membertype noteproperty -name "Provider" -value $_.ProviderName
add-member -inputobject $Event -membertype noteproperty -name "Machine Name" -value $_.MachineName
add-member -inputobject $Event -membertype noteproperty -name "User ID" -value $_.UserID
add-member -inputobject $Event -membertype noteproperty -name "Time Created " -value $_.TimeCreated
$Event | FL *
$Event | Out-File $Results -Encoding UTF8 -Append
$_.Properties | FL *
$_.Properties | Out-File $Results -Encoding UTF8 -Append
$DateTimeExport = $_.TimeCreated
}
$DateTime = (($DateTimeExport.ToShortDateString()).Replace('/','-') + '@' + (($DateTimeExport.ToShortTimeString()).Replace(' ','')))
$DateTime = $DateTime.Replace(':','')
$Results2 = $pwd.Path + "\" + $SearchCriteria + '-' + $DateTime + "-ADFSSecAudit" + $Counter + ".txt"
Rename-Item -Path $Results -NewName $Results2
}
$Counter = 1
foreach ($instance in $Instances)
{
FindADFSAuditEvents -ValueToMatch $SearchCriteria -Instance $Instance -PastPeriod $PastPeriod -Counter $Counter
$Counter++
}
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。