共用方式為


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 2019 中的外部網路智能鎖定相較於 AD FS 2016,新增了下列優點:

  • 熟悉和不熟悉位置的獨立鎖定閾值。 在已知安全位置的使用者可能會比來自可疑位置的請求擁有更多的容錯空間。
  • 智慧鎖定的稽核模式,同時繼續強制執行先前的軟鎖定行為。 這項區別可讓您了解使用者熟悉的位置,但仍受到AD FS 2012 R2 中可用的外部網路鎖定功能保護。

組態資訊

開啟 ESL 時,會建立 Artifact 資料庫中的新資料表,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 列表中,則要求會被視為「未知」位置。 此動作會處理 Proxy 處理案例,例如 Exchange Online 舊版驗證,其中 Exchange Online 位址會同時處理成功和失敗的要求。
  • badPwdCount:值,代表提交不正確密碼的次數,且驗證失敗。 針對每個使用者,系統會針對熟悉的位置和未知的位置保留個別計數器。
  • UnknownLockout:每位使用者都有一個布爾值,以判斷該使用者是否被鎖定在未知位置而無法存取。 此值是根據 badPwdCountUnfamiliarExtranetLockoutThreshold 值來計算。
  • ExtranetLockoutThreshold:此值決定了最多錯誤密碼嘗試次數的上限。 達到閾值時,AD FS 會拒絕來自外部網路的要求,直到觀察窗口通過為止。
  • ExtranetObservationWindow:這個值會決定從未知位置鎖定使用者名稱和密碼要求的持續時間。當窗口通過時,AD FS 會再次開始從未知位置執行使用者名稱和密碼驗證。
  • ExtranetLockoutRequirePDC:啟用時,外部網絡鎖定需要主要域控制器(PDC)。 當停用時,外部網路鎖定會切換到另一個網域控制器,以防 PDC 無法使用。
  • ExtranetLockoutMode:管理 僅限記錄 vs 強制 模式的 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-ADFSAccountLockoutbadPwdCount 重設為零。

如果沒有重設,則每個帳戶在每個觀察窗口中皆可嘗試一次輸入密碼以驗證 AD。 嘗試之後,帳戶會回到鎖定狀態,而觀察視窗會重新啟動。 badPwdCount 值只會在密碼驗證成功後自動重設。

Log-Only 模式與強制模式

AccountActivity 數據表會在 僅限記錄 模式和 強制 模式期間填入。 如果略過 僅限記錄 模式,並且在沒有遵循建議的等候期間的情況下,直接將 ESL 移至 強制 模式,則 AD FS 將無法識別使用者熟悉的 IP。 然後,ESL 的行為就像 ADBadPasswordCounter,如果用戶帳戶正遭受暴力破解攻擊,可能會封鎖合法的使用者連線。 當跳過 僅限記錄 模式時,且使用者進入一個鎖定狀態,UnknownLockout 等於 True,並嘗試從不在「熟悉」IP 清單中的 IP 使用正確的密碼登入,則無法完成登入。 僅限記錄 模式建議使用 3-7 天,以避免這種情況發生。 如果帳戶正受到攻擊,至少需要 24 小時的 僅限記錄 模式,以避免合法用戶被鎖住。

外部網路智慧鎖定設定

下列各節說明啟用AD FS 2016 ESL的必要條件和設定。

AD FS 2016 的必要條件

  1. 在伺服器陣列中的所有節點上安裝更新。

    首先,確保所有 Windows Server 2016 AD FS 伺服器自 2018 年 6 月的 Windows 更新起都是最新狀態,且 AD FS 2016 伺服陣列在 2016 功能層級運行。

  2. 確認許可權。

    ESL 要求在每個 AD FS 伺服器上啟用 Windows 遠端管理。

  3. 更新工件資料庫權限。

    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 上沒有管理員許可權。 在此情況下,您可以執行下列命令,在 SQL Server Database 中手動設定資料庫許可權:當您連線到 AdfsArtifactStore 資料庫時:

    # 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

啟用 Log-Only 模式

僅記錄 模式中,AD FS 會填入使用者熟悉的位置資訊,並記錄安全性稽核事件,但不會阻擋任何請求。 此模式可用來驗證智能鎖定是否正在執行,並讓AD FS在啟用 強制 模式之前,先「瞭解」使用者熟悉的位置。 如 AD FS 所瞭解,它會儲存每個使用者的登入活動(無論是 僅限記錄 模式還是 強制 模式)。 執行下列 Cmdlet,將鎖定行為設定為 僅限記錄

Set-AdfsProperties -ExtranetLockoutMode AdfsSmartlockoutLogOnly

僅限記錄 模式的目的是暫時狀態,讓系統可以在引入智慧鎖定行為強制鎖定之前先瞭解登入行為。 僅限記錄 模式的建議持續時間為 3-7 天。 如果帳戶正受到攻擊,僅記錄模式 必須至少執行 24 小時。

在AD FS 2016上,如果在啟用外部網路智慧鎖定之前啟用 2012 R2 外部網路軟鎖定行為,僅限記錄 模式會停用外部網路軟鎖定行為。 AD FS 智慧鎖定不會鎖定 僅限記錄 模式的使用者。 不過,內部部署 AD 可能會根據 AD 設定鎖定使用者。 檢討 Active Directory (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命令行。 如需詳細資訊,請參閱 將AD FS Powershell命令程式存取權委派給非系統管理員使用者

您可以傳遞 -Server 參數來覆寫此行為。

Get-ADFSAccountActivity -UserPrincipalName

Cmdlet 會使用帳戶活動 REST 端點自動連線到伺服器陣列主要節點。 因此,所有資料都應該一律保持一致。 使用以下方法讀取使用者帳戶的當前帳戶活動:

Get-ADFSAccountActivity user@contoso.com

屬性:

  • BadPwdCountFamiliar:當從已知位置驗證失敗時,次數會遞增。
  • BadPwdCountUnknown:當來自未知位置的驗證失敗時遞增。
  • LastFailedAuthFamiliar:如果在熟悉的位置進行驗證不成功,則將 LastFailedAuthFamiliar 設定為該次驗證失敗的時間。
  • LastFailedAuthUnknown:如果驗證從未知的位置失敗,LastFailedAuthUnknown 設定為驗證失敗的時間。
  • FamiliarLockout:布爾值 True,若 BadPwdCountFamiliar>ExtranetLockoutThreshold
  • UnknownLockout:布爾值為 true,若 BadPwdCountUnknown>ExtranetLockoutThreshold
  • 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)。 當您重設計數器時,FamiliarLockoutUnfamiliarLockout 的值會更新,因為重設計數器小於閾值。

Reset-ADFSAccountLockout user@contoso.com -Location Familiar

Reset-ADFSAccountLockout user@contoso.com -Location Unknown

事件記錄 & AD FS 外部網路鎖定的用戶活動資訊

下列各節說明如何監視事件記錄、使用者帳戶活動和帳戶鎖定。

連接健康

監視用戶帳戶活動的建議方式是透過 Connect Health。 Connect Health 會生成有關風險 IP 和無效密碼嘗試的可下載報告。 Risky 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 Smart Lockout 設定為 強制 模式,您將永遠不會看到合法用戶的帳戶因暴力攻擊或阻斷服務而遭到鎖定。 惡意帳戶鎖定能夠防止使用者登入的唯一情況是,攻擊者擁有用戶密碼,或能從該使用者的已知信任的 IP 位址發送請求。

如果已啟用ESL,且惡意行為者擁有用户的密碼,會發生什麼事?

暴力密碼破解攻擊案例的典型目標是猜測密碼並成功登入。 如果使用者遭到網路釣魚或密碼被猜測,則ESL功能不會封鎖存取,因為登入符合正確密碼加上新IP的成功準則。 惡意行為者的 IP 接著會顯示為熟悉的 IP。 此案例中最好的緩和措施是清除AD FS中的用戶活動,並要求用戶進行多重要素驗證。 您應該安裝 Microsoft Entra Password Protection,以確保可猜測的密碼不會進入系統。

如果我的用戶從未從IP成功登入,然後嘗試輸入錯誤的密碼幾次,他們能否在最後正確輸入密碼之後登入?

如果使用者提交多個不正確的密碼(例如,誤鍵入),並在下一次嘗試時輸入正確的密碼,則使用者會立即成功登入。 此成功登入會清除不正確的密碼計數,並將該IP新增至 FamiliarIPs 清單。 不過,如果他們來自未知位置的失敗登入次數超過了臨界值,則會進入被鎖定狀態。 然後,他們必須等候通過觀察期,並使用有效的密碼登入。 他們可能需要系統管理員介入才能重設其帳戶。

ESL 在內部網路上運作嗎?

如果用戶端直接連線到 AD FS 伺服器,而不是透過 Web 應用程式 Proxy 伺服器,則 ESL 行為不會套用。

我在 [用戶端 IP] 欄位中看到Microsoft IP 位址。 ESL 是否封鎖 EXO 代理暴力密碼破解攻擊?  

ESL 可正常運作,以防止 Exchange Online 或其他舊版驗證暴力密碼破解攻擊案例。 舊版驗證的「活動標識符」為 000000000-0000-0000-0000-000000000000。 在這些攻擊中,不良動作專案會利用 Exchange Online 基本身份驗證(也稱為舊版驗證),讓用戶端 IP 位址顯示為Microsoft。 雲端中的 Exchange Online 伺服器作為代理,代表 Outlook 用戶端進行驗證。 在這些案例中,惡意送出者的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位使用者最多1 GB的速度成長。 如果 AD FS 伺服器陣列使用 Windows 內部資料庫 (WID),資料庫檔案的預設位置為 C:\Windows\WID\Data。 若要防止填滿此磁碟驅動器,請先確定您至少要有 5 GB 的免費記憶體,才能啟用 ESL。 除了磁碟儲存之外,還應計劃在啟用 ESL 後,為不超過 500,000 名使用者增加最多 1 GB 的 RAM,從而使進程記憶體總量增長。

另請參閱