AD FS 外部網路鎖定和外部網路智慧鎖定概觀
外部網路智慧鎖定 (ESL) 可保護使用者免於遭受來自惡意活動的外部網路帳戶鎖定。
ESL 可讓 AD FS 區分登入嘗試與使用者的熟悉位置,以及區分登入嘗試與可能是攻擊者的嘗試。 AD FS 可以鎖定攻擊者,同時讓有效的使用者繼續使用其帳戶。 這項區別可防止和防禦拒絕服務,以及使用者的特定密碼噴灑攻擊類別。 ESL 適用於 Windows Server 2016 中的 AD FS,並且建置至 Windows Server 2019 中的 AD FS。
ESL 僅適用於使用者名稱和密碼驗證要求,而這些要求使用 Web 應用程式 Proxy 或協力廠商 Proxy 來穿過外部網路。 任何協力廠商 Proxy 都必須支援使用 MS-ADFSPIP 通訊協定來取代 Web 應用程式 Proxy (例如 F5 BIG-IP 存取原則管理員)。 請參閱協力廠商 Proxy 文件,以判斷 Proxy 是否支援 MS-ADFSPIP 通訊協定。
AD FS 2019 中的功能
與 AD FS 2016 相較之下,AD FS 2019 中的外部網路智慧鎖定新增下列優點:
- 熟悉和不熟悉位置的獨立鎖定閾值。 已知良好位置中使用者的錯誤空間可能多於來自可疑位置的要求。
- 智慧鎖定的稽核模式,同時繼續強制執行先前的軟鎖定行為。 這項區別可讓您瞭解使用者熟悉位置,而且仍然受到可從 AD FS 2012 R2 提供的外部網路鎖定功能保護。
設定資訊
啟用 ESL 時,會在成品資料庫 AdfsArtifactStore.AccountActivity
中建立新表格。 在 AD FS 伺服器陣列中,也會選取節點作為「使用者活動」主要節點。 在 Windows 內部資料庫 (WID) 設定中,此節點一律是主要節點。 在 SQL 設定中,會選取一個節點作為「使用者活動」主要節點。
若要檢視已選取為「使用者活動」主要節點的節點,請使用 (Get-AdfsFarmInformation).FarmRoles
。
所有次要節點都會在每次全新登入時透過連接埠 80 連絡主要節點,以瞭解錯誤密碼計數和新熟悉位置值的最新值。 次要節點也會在處理登入之後更新主要節點。
如果次要節點無法連絡主要節點,則次要節點會將錯誤事件寫入至 AD FS 系統管理員記錄。 會繼續處理驗證,但 AD FS 只會在本機寫入已更新的狀態。 AD FS 會每隔 10 分鐘重試連絡主要節點。 主要節點可用之後,AD FS 會切換回主要節點。
辭彙
- FamiliarLocation:在驗證要求期間,ESL 會檢查所有呈現的網際網路通訊協定 (IP)。 這些 IP 是網路 IP、已轉送 IP 與選用 x-forwarded-for IP 的組合。 如果要求成功,則會將所有 IP 都新增至「帳戶活動」表格,以作為「熟悉 IP」。 如果要求具有「熟悉 IP」中的所有 IP,則會將要求視為「熟悉」位置。
- UnknownLocation:如果傳入的要求至少有一個 IP 不在現有 FamiliarLocation 清單中,則會將要求視為「未知」位置。 此動作會處理 Exchange Online 舊版驗證這類 Proxy 處理案例,而在此驗證中,Exchange Online 位址會同時處理成功和失敗要求。
- badPwdCount:代表不正確密碼提交次數的值,而且驗證失敗。 針對每位使用者,會為熟悉位置和未知位置保留個別計數器。
- UnknownLockout:如果鎖定使用者,使其無法從未知位置進行存取,則為個別使用者的布林值。 此值是根據 badPwdCountUnfamiliar 和 ExtranetLockoutThreshold 值計算而來。
- ExtranetLockoutThreshold:此值決定錯誤密碼嘗試次數上限。 達到閾值時,除非已過觀察時間範圍,否則 AD FS 會拒絕來自外部網路的要求。
- ExtranetObservationWindow:此值決定鎖定來自未知位置之使用者名稱和密碼要求的期間。已過該時間範圍時,AD FS 會再次開始執行未知位置的使用者名稱和密碼驗證。
- ExtranetLockoutRequirePDC:啟用時,外部網路鎖定需要主要網域控制站 (PDC)。 停用時,如果 PDC 無法使用,則外部網路鎖定會回復到另一個網域控制站。
- ExtranetLockoutMode:控制 ESL 的 [僅限記錄] 與 [強制執行] 模式。
- ADFSSmartLockoutLogOnly:啟用 ESL。 AD FS 會寫入系統管理員和稽核事件,但不會拒絕驗證要求。 針對要在啟用 ADFSSmartLockoutEnforce 之前填入的 FamiliarLocation,預計要啟用此模式。
- ADFSSmartLockoutEnforce:完全支援在達到閾值時封鎖不熟悉驗證要求。
支援 IPv4 和 IPv6 位址。
交易的結構
驗證前檢查:在驗證要求期間,ESL 會檢查所有呈現的 IP。 這些 IP 是網路 IP、已轉送 IP 與選用 x-forwarded-for IP 的組合。 在稽核記錄中,這些 IP 會以 x-ms-forwarded-client-ip、x-forwarded-for、x-ms-proxy-client-ip 的順序列在
<IpAddress>
欄位中。根據這些 IP,AD FS 會判斷要求是否來自熟悉位置,然後檢查個別 badPwdCount 是否小於設定的臨界值限制,或上次失敗嘗試的發生時間是否超過觀察時間範圍時段。 如果其中一個條件成立,則 AD FS 允許此交易進一步處理和進一步進行認證驗證。 如果這兩個條件都是 false,則除非過了觀察時間範圍,否則帳戶已處於鎖定狀態。 過了觀察時間範圍之後,允許使用者嘗試進行驗證。 在 Windows Server 2019 中,AD FS 會根據 IP 位址是否符合熟悉位置來檢查適當的閾值限制。
成功登入:如果登入成功,則會將要求中的 IP 新增至使用者的熟悉位置 IP 清單。
失敗登入:如果登入失敗,則會增加 badPwdCount。 如果攻擊者傳送給系統的錯誤密碼多於閾值所允許的值,則使用者會進入鎖定狀態。 (badPwdCount > ExtranetLockoutThreshold)
帳戶遭到鎖定時,UnknownLockout 值會等於 True。此鎖定表示使用者的 badPwdCount 超過閾值。 例如,有人的密碼嘗試次數超過系統所允許的次數。 在此狀態下,有兩種方式可讓有效使用者登入:
- 等待過了 ObservationWindow 時間。
- 若要重設鎖定狀態,請使用 Reset-ADFSAccountLockout 以將 badPwdCount 重設回零。
如果未進行重設,則每個觀察時間範圍都允許帳戶對 AD 嘗試單一密碼。 在該嘗試之後,帳戶會回復為已鎖定狀態,而觀察時間範圍會重新開始。 badPwdCount 值只會在成功密碼登入後自動重設。
僅限記錄模式與強制執行模式
在 [僅限記錄] 模式和 [強制執行] 期間,都會填入 AccountActivity 表格。 如果略過 [僅限記錄] 模式,而且在不等待所建議等候期間的情況下直接將 ESL 移至 [強制執行] 模式,則 AD FS 不會知道使用者的熟悉 IP。 然後,ESL 的行為會像 ADBadPasswordCounter,而且,如果使用者帳戶受到主動暴力密碼破解攻擊,則可能會封鎖合法的使用者流量。 如果略過 [僅限記錄] 模式,而且使用者進入已鎖定狀態 (其中 UnknownLockout 等於 True),並嘗試使用良好的密碼以從不在「熟悉」IP 清單中的 IP 進行登入,則他們會無法登入。 建議使用 [僅限記錄] 模式 3-7 天,以避免這種情況。 如果帳戶正在受到攻擊,則至少需要 24 小時的 [僅限記錄] 模式,才能防止鎖定合法使用者。
外部網路智慧鎖定設定
下列各節描述針對 AD FS 2016 啟用 ESL 的必要條件和設定。
AD FS 2016 的必要條件
在伺服器陣列的所有節點上安裝更新。
首先,確定自 2018 年 6 月 Windows Update 起,所有 Windows Server 2016 AD FS 伺服器都處於最新狀態,而且 AD FS 2016 伺服器陣列會在 2016 伺服器陣列行為層級執行。
驗證權限。
ESL 需要在每部 AD FS 伺服器上啟用 Windows 遠端管理。
更新成品資料庫權限。
ESL 需要 AD FS 服務帳戶具有在 AD FS 成品資料庫中建立新表格的權限。 以 AD FS 系統管理員身分登入任何 AD FS 伺服器。然後,執行下列命令,以在 [PowerShell 命令提示字元] 視窗中授與此權限:
PS C:\>$cred = Get-Credential PS C:\>Update-AdfsArtifactDatabasePermission -Credential $cred
注意
$cred 預留位置是具有 AD FS 系統管理員權限的帳戶。 這應該提供可建立表格的寫入權限。
先前的命令可能會因缺少足夠的權限而失敗,因為您的 AD FS 伺服器陣列使用 SQL Server,而且先前所提供的認證沒有 SQL Server 的系統管理員權限。 在此情況下,您可以執行下列命令,以在連線至 AdfsArtifactStore 資料庫時於 SQL Server Database 中手動設定資料庫權限:
# when prompted with “Are you sure you want to perform this action?”, enter Y. [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact = 'High')] Param() $fileLocation = "$env:windir\ADFS\Microsoft.IdentityServer.Servicehost.exe.config" if (-not [System.IO.File]::Exists($fileLocation)) { write-error "Unable to open AD FS configuration file." return } $doc = new-object Xml $doc.Load($fileLocation) $connString = $doc.configuration.'microsoft.identityServer.service'.policystore.connectionString $connString = $connString -replace "Initial Catalog=AdfsConfigurationV[0-9]*", "Initial Catalog=AdfsArtifactStore" if ($PSCmdlet.ShouldProcess($connString, "Executing SQL command sp_addrolemember 'db_owner', 'db_genevaservice' ")) { $cli = new-object System.Data.SqlClient.SqlConnection $cli.ConnectionString = $connString $cli.Open() try { $cmd = new-object System.Data.SqlClient.SqlCommand $cmd.CommandText = "sp_addrolemember 'db_owner', 'db_genevaservice'" $cmd.Connection = $cli $rowsAffected = $cmd.ExecuteNonQuery() if ( -1 -eq $rowsAffected ) { write-host "Success" } } finally { $cli.CLose() } }
確定已啟用 [AD FS 安全性稽核記錄]
此功能利用安全性稽核記錄,因此必須在 AD FS 以及所有 AD FS 伺服器的本機原則中啟用稽核。
設定指示
ESL 使用 AD FS 屬性 ExtranetLockoutEnabled。 此屬性先前用來控制 Server 2012 R2 中的外部網路軟鎖定。 如果已啟用 ESL,而且您想要檢視目前屬性設定,則請執行 Get-AdfsProperties
。
設定建議
設定 ESL 時,請遵循設定閾值的最佳做法:
ExtranetObservationWindow (new-timespan -Minutes 30)
ExtranetLockoutThreshold: Half of AD Threshold Value
AD value: 20, ExtranetLockoutThreshold: 10
Active Directory 鎖定會與 ESL 分開運作。 不過,如果已啟用 Active Directory 鎖定,則請選取 AD FS 中的 [ExtranetLockoutThreshold] 以及 AD 中的 [帳戶鎖定閾值]。
ExtranetLockoutRequirePDC - $false
啟用時,外部網路鎖定需要主要網域控制站 (PDC)。 停用並設定為 false 時,如果 PDC 無法使用,則外部網路鎖定會回復到另一個網域控制站。
若要設定此屬性,請執行:
Set-AdfsProperties -EnableExtranetLockout $true -ExtranetLockoutThreshold 15 -ExtranetObservationWindow (New-TimeSpan -Minutes 30) -ExtranetLockoutRequirePDC $false
啟用僅限記錄模式
在 [僅限記錄] 模式中,AD FS 會填入使用者的熟悉位置資訊,並寫入安全性稽核事件,但不會封鎖任何要求。 此模式用來驗證是否正在執行智慧鎖定,並先讓 AD FS「瞭解」使用者的熟悉位置,再啟用 [強制執行] 模式。 如 AD FS 所瞭解,其會儲存個別使用者的登入活動 (無論處於 [僅限記錄] 模式還是 [強制執行] 模式)。 執行下列 Cmdlet,以將鎖定行為設定為 [僅限記錄]:
Set-AdfsProperties -ExtranetLockoutMode AdfsSmartlockoutLogOnly
[僅限記錄] 模式預定為暫時狀態,讓系統可以在使用智慧鎖定行為來引進鎖定強制執行之前先瞭解登入行為。 [僅限記錄] 模式的建議期間為 3-7 天。 如果帳戶正在受到攻擊,則 [僅限記錄] 模式至少必須執行 24 小時。
在 AD FS 2016 上,如果在啟用外部網路智慧鎖定之前啟用 2012 R2 外部網路軟鎖定行為,則 [僅限記錄] 模式會停用外部網路軟鎖定行為。 AD FS 智慧鎖定不會鎖定處於 [僅限記錄] 模式的使用者。 不過,內部部署 AD 可能會根據 AD 設定來鎖定使用者。 檢閱「AD 鎖定」原則,以瞭解內部部署 AD 如何鎖定使用者。
在 AD FS 2019 上,另一個優點是能夠針對智慧鎖定啟用 [僅限記錄] 模式,同時繼續使用下面的 PowerShell 來繼續強制執行先前的軟鎖定行為:
Set-AdfsProperties -ExtranetLockoutMode 3
若要讓新模式生效,請使用下列方式來重新啟動伺服器陣列中所有節點上的 AD FS 服務:
Restart-service adfssrv
設定模式之後,您可以使用 EnableExtranetLockout 參數來啟用智慧鎖定:
Set-AdfsProperties -EnableExtranetLockout $true
啟用強制執行模式
在您熟悉鎖定閾值和觀察時間範圍之後,可以使用下列 PSH Cmdlet,以將 ESL 移至 [強制執行] 模式:
Set-AdfsProperties -ExtranetLockoutMode AdfsSmartLockoutEnforce
若要讓新模式生效,請使用下列命令來重新啟動伺服器陣列中所有節點上的 AD FS 服務。
Restart-service adfssrv
管理使用者帳戶活動
AD FS 提供三個 Cmdlet 來管理帳戶活動資料。 這些 Cmdlet 會自動連線至伺服器陣列中保有主要角色的節點。
注意
您可以使用 Just Enough Administration (JEA) 來委派 AD FS Commandlet,以重設帳戶鎖定。 例如,您可以將權限委派給技術支援中心人員,以使用 ESL Commandlet。 如需詳細資訊,請參閱將 AD FS Powershell Commandlet 存取權委派給非系統管理員使用者。
您可以傳遞 -Server
參數來覆寫此行為。
Get-ADFSAccountActivity -UserPrincipalName
此 Cmdlet 會使用「帳戶活動 REST」端點自動連線至伺服器陣列主要節點。 因此,所有資料都應該一律保持一致。 使用下列方式來讀取使用者帳戶的目前帳戶活動:
Get-ADFSAccountActivity user@contoso.com
屬性:
- BadPwdCountFamiliar:從已知位置驗證失敗時遞增。
- BadPwdCountUnknown:從未知位置驗證失敗時遞增。
- LastFailedAuthFamiliar:如果從熟悉位置的驗證失敗,則會將 LastFailedAuthFamiliar 設定為失敗驗證時間。
- LastFailedAuthUnknown:如果從未知位置的驗證失敗,則會將 LastFailedAuthUnknown 設定為失敗驗證時間。
- FamiliarLockout:如果 BadPwdCountFamiliar>ExtranetLockoutThreshold,則為本身為 True 的布林值。
- UnknownLockout:如果 BadPwdCountUnknown>ExtranetLockoutThreshold,則為本身為 True 的布林值。
- FamiliarIPs:最多 20 個使用者熟悉的 IP。 超過 20 個 IP 時,會移除清單中最舊的 IP。
Set-ADFSAccountActivity
Set-ADFSAccountActivity 會新增熟悉位置。 熟悉 IP 清單最多有 20 個項目。 如果超過 20 個項目,則會移除清單中最舊的 IP。
Set-ADFSAccountActivity user@contoso.com -AdditionalFamiliarIps “1.2.3.4”
Reset-ADFSAccountLockout
重設每個熟悉位置之使用者帳戶的鎖定計數器 (badPwdCountFamiliar) 或不熟悉位置計數器 (badPwdCountUnfamiliar)。 當您重設計數器時,會更新 FamiliarLockout 或 UnfamiliarLockout 值,因為重設計數器小於閾值。
Reset-ADFSAccountLockout user@contoso.com -Location Familiar
Reset-ADFSAccountLockout user@contoso.com -Location Unknown
AD FS Extranet 鎖定的事件日誌記錄 & 使用者活動資訊
下列各節描述如何監視事件記錄、使用者帳戶活動和鎖定。
連線情況
監視使用者帳戶活動的建議方式是透過 Connect Health。 Connect Health 會產生具風險 IP 和錯誤密碼嘗試的可下載報告。 「具風險 IP」報告中的每個項目都會顯示超過所指定閾值之失敗 AD FS 登入活動的彙總資訊。 AD FS 登入活動失敗時,可以使用可自訂的電子郵件設定來設定電子郵件通知以警示系統管理員。 有關詳細資訊和設定指示,請參閱 使用 Microsoft Entra Connect Health 監視 AD FS。
AD FS 外部網路智慧鎖定事件
注意
若要針對 ESL 進行疑難排解,請參閱降低密碼噴灑攻擊和帳戶鎖定。
若要寫入外部網路智慧鎖定事件,必須在 [僅限記錄] 或 [強制執行] 模式中啟用 ESL,而且必須啟用 AD FS 安全性稽核。 在下列情況下,AD FS 會將外部網路鎖定事件寫入至安全性稽核記錄:
- 使用者遭到鎖定,這表示使用者達到未成功登入嘗試的鎖定閾值。
- AD FS 會收到已處於鎖定狀態之使用者的登入嘗試。
處於 [僅限記錄] 模式時,您可以檢查安全性稽核記錄中是否有鎖定事件。 針對任何找到的事件,您可以使用 Get-ADFSAccountActivity
Cmdlet 來檢查使用者狀態,以判斷鎖定來自熟悉還是不熟悉 IP 位址。 您也可以使用 Get-ADFSAccountActivity
Cmdlet 來仔細檢查該使用者的熟悉 IP 位址清單。
事件識別碼 | 描述 |
---|---|
1203 | 每次錯誤密碼嘗試都會寫入此事件。 只要 badPwdCount 達到 ExtranetLockoutThreshold 中所指定的值,就會將 AD FS 上的帳戶鎖定 ExtranetObservationWindow 中所指定的持續時間。 活動識別碼:%1 XML:%2 |
1210 | 每次鎖定使用者時,都會寫入此事件。 活動識別碼:%1 XML:%2 |
557 (AD FS 2019) | 嘗試與節點 %1 上的帳戶存放區 REST 服務通訊時發生錯誤。 如果您使用 WID 伺服器陣列,則主要節點可能會離線。 如果您使用 SQL 伺服器陣列,則 AD FS 會自動選取新的節點來裝載使用者存放區主要角色。 |
562 (AD FS 2019) | 與伺服器 %1 上的帳戶存放區端點通訊時發生錯誤。 例外狀況訊息:%2 |
563 (AD FS 2019) | 計算外部網路鎖定狀態時發生錯誤。 因為 %1 的值,所以允許此使用者設定驗證,而且權杖發行會繼續。 如果您使用 WID 伺服器陣列,則主要節點可能會離線。 如果您使用 SQL 伺服器陣列,則 AD FS 會自動選取新的節點來裝載使用者存放區主要角色。 帳戶存放區伺服器名稱:%2 使用者識別碼:%3 例外狀況訊息:%4 |
512 | 下列使用者的帳戶已遭鎖定。因系統設定而允許登入嘗試。 活動識別碼:%1 使用者:%2 用戶端 IP:%3 錯誤密碼計數:%4 上次錯誤密碼嘗試:%5 |
515 | 下列使用者帳戶已處於已鎖定狀態,並且提供正確的密碼。 此帳戶可能遭到入侵。 更多資料 活動識別碼:%1 使用者:%2 用戶端 IP:%3 |
516 | 因為錯誤的密碼嘗試次數太多,所以已鎖定下列使用者帳戶。 活動識別碼:%1 使用者:%2 用戶端 IP:%3 錯誤密碼計數:%4 上次錯誤密碼嘗試:%5 |
ESL 常見問題集
在強制執行模式中使用外部網路智慧鎖定的 AD FS 伺服器陣列是否將會看到惡意使用者鎖定?
如果 AD FS 智慧鎖定設定為 [強制執行] 模式,則您永遠看不到暴力密碼破解或拒絕服務鎖定合法使用者帳戶。 威脅行為者惡意帳戶鎖定可防止使用者登入的唯一方式是,如果不良的行為者具有使用者密碼,或可以從該使用者的已知良好 (熟悉) IP 位址傳送要求。
如果啟用 ESL,而且不良行為者具有使用者密碼,則會發生什麼事?
暴力密碼破解攻擊案例的典型目標是猜測密碼並成功登入。 如果使用者遇到網路釣魚或猜測到密碼,則 ESL 功能不會封鎖存取,因為登入符合正確密碼加上新 IP 的成功準則。 不良行為者 IP 接著會顯示為熟悉 IP。 在此案例中,最好的緩和措施是清除 AD FS 中的使用者活動,並需要進行使用者的多重要素驗證。 您應該安裝 Microsoft Entra 密碼保護功能,確保可猜出的密碼不會進入系統。
如果我的使用者從未從 IP 成功登入,然後嘗試使用錯誤的密碼幾次,則他們是否可以在最後正確地輸入密碼之後登入?
如果使用者提交多個錯誤密碼 (例如,錯誤輸入),並在下列嘗試時取得正確密碼,則使用者會立即成功登入。 此成功登入會清除錯誤密碼計數,並將該 IP 新增至 FamiliarIPs 清單。 不過,如果他們超出未知位置失敗登入的閾值,則會進入鎖定狀態。 他們接著必須等待過了觀察時間範圍,並使用有效的密碼進行登入。 他們可能需要系統管理員介入才能重設其帳戶。
ESL 是否也在內部網路上運作?
如果用戶端直接連線至 AD FS 伺服器,而且未透過 Web 應用程式 Proxy 伺服器,則 ESL 行為不適用。
我在 [用戶端 IP] 欄位中看到 Microsoft IP 位址。 ESL 是否封鎖 EXO 代理的暴力密碼破解攻擊?
ESL 會正常運作,以防止 Exchange Online 或其他舊版驗證暴力密碼破解攻擊案例。 舊版驗證的「活動識別碼」為 00000000-0000-0000-0000-000000000000。 在這些攻擊中,不良行為者會利用 Exchange Online 基本驗證 (也稱為舊版驗證),以讓用戶端 IP 位址顯示為 Microsoft IP 位址。 雲端中的 Exchange Online 伺服器會代表 Outlook 用戶端對驗證確認進行 Proxy 處理。 在這些情況下,惡意提交者的 IP 位址位於 x-ms-forwarded-client-ip 中,而 Microsoft Exchange Online 伺服器 IP 則位於 x-ms-client-ip 值中。 外部網路智慧鎖定會檢查網路 IP、轉送 IP、x-forwarded-client-IP 和 x-ms-client-ip 值。 如果要求成功,則會將所有 IP 都新增至熟悉清單。 如果傳入要求,而且任何呈現的 IP 都不在熟悉清單中,則會將要求標記為不熟悉。 熟悉的使用者能夠在封鎖來自不熟悉位置的要求時成功登入。
我可以在啟用 ESL 之前,先估計 ADFSArtifactStore 的大小嗎?
啟用 ESL 時,AD FS 會追蹤 ADFSArtifactStore 資料庫中使用者的帳戶活動和已知位置。 此資料庫的大小會隨著所追蹤的使用者數目和已知位置數目而相對調整。 規劃啟用 ESL 時,您可以估計 ADFSArtifactStore 資料庫的大小會以每 100,000 位使用者最多 1GB 的速率成長。 如果 AD FS 伺服器陣列使用 Windows 內部資料庫 (WID),則資料庫檔案的預設位置為 C:\Windows\WID\Data。 若要防止填滿此磁碟機,請在啟用 ESL 之前,先確定您至少有 5GB 的可用儲存體。 除了磁碟儲存體以外,請在啟用 ESL 之後,規劃總處理序記憶體以 500,000 或更少的使用者人口數最多 1GB 的 RAM 成長。