Extranet 智能锁定(ESL)可保护用户免受恶意活动的 Extranet 帐户锁定。
ESL 使 AD FS 能够区分来自用户熟悉位置的登录尝试和可能是攻击者的登录尝试。 AD FS 可以锁定攻击者,同时让有效用户继续使用其帐户。 这种区别可以防护拒绝服务攻击和对用户某些类型的密码喷洒攻击。 ESL 适用于 Windows Server 2016 中的 AD FS,内置于 Windows Server 2019 中的 AD FS 中。
ESL 仅适用于使用 Web 应用程序代理或第三方代理通过 Extranet 发出的用户名和密码身份验证请求。 任何第三方代理都必须支持 MS-ADFSPIP 协议才能代替 Web 应用程序代理,例如 F5 BIG-IP 访问策略管理器。 请参阅第三方代理文档以确定代理是否支持 MS-ADFSPIP 协议。
AD FS 2019 中的功能
AD FS 2019 中的 Extranet Smart Lockout 与 AD FS 2016 相比,增加了以下优势:
- 为熟悉和不熟悉的位置设置独立的锁定阈值。 已知良好位置的用户的出错空间可能比来自可疑位置的请求要多。
- 启用智能锁定的审核模式,同时继续强制执行以前的软锁定行为。 通过此区别,可以了解用户熟悉的位置,并且仍受 AD FS 2012 R2 中提供的 Extranet 锁定功能的保护。
配置信息
启用 ESL 后,将创建 Artifact 数据库中 AdfsArtifactStore.AccountActivity
的新表。 AD FS 场中还会选择一个节点作为“用户活动”主节点。 在 Windows 内部数据库(WID)配置中,此节点始终是主节点。 在 SQL 配置中,选择一个节点作为用户活动主节点。
若要查看选择为“用户活动”主节点的节点,请使用 (Get-AdfsFarmInformation).FarmRoles
。
所有辅助节点都会通过端口 80 联系每个新登录的主节点,了解错误密码计数的最新值和新熟悉的位置值。 处理登录后,辅助节点还会更新主节点。
如果辅助节点无法联系主节点,则辅助节点会将错误事件写入 AD FS 管理员日志。 身份验证将继续处理,但 AD FS 仅在本地写入更新的状态。 AD FS 每 10 分钟重试一次联系主节点。 AD FS 在主节点可用后切换回主节点。
术语
- FamiliarLocation:在身份验证请求期间,ESL 会检查所有显示的 Internet 协议(IP)。 这些 IP 将是网络 IP、转发 IP 和可选的 x-forwarded-for IP 的组合。 如果请求成功,所有 IP 都会作为“熟悉的 IP”添加到帐户活动表中。 如果请求包含“熟悉 IP”中存在的所有 IP,则请求被视为“熟悉”位置。
- UnknownLocation:如果传入的请求在现有 FamiliarLocation 列表中至少有一个 IP 不存在,则请求被视为“未知”位置。 此操作处理代理场景,例如 Exchange Online 旧版身份验证,在这些场景中,Exchange Online 地址同时处理成功和失败的请求。
- badPwdCount:一个值,表示提交的密码不正确次数,身份验证失败。 对于每个用户,将为熟悉的位置和未知位置保留单独的计数器。
- UnknownLockout:在用户被锁定,无法从未知位置访问的情况下,针对每个用户设置的布尔值。 此值是根据 badPwdCountUnfamiliar 和 ExtranetLockoutThreshold 值计算的。
- ExtranetLockoutThreshold:此值确定错误密码尝试的最大数目。 达到阈值后,AD FS 会拒绝来自 Extranet 的请求,直到观察窗口通过。
- ExtranetObservationWindow:此值确定从未知位置锁定用户名和密码请求的持续时间。窗口通过后,AD FS 将再次从未知位置执行用户名和密码身份验证。
- ExtranetLockoutRequirePDC:启用后,Extranet 锁定需要主域控制器(PDC)。 禁用时:如果 PDC 不可用,Extranet 锁定将回退到另一个域控制器。
- 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 是否小于设置的阈值限制,或者上次失败尝试的发生时间是否超过观察窗口时间范围。 如果其中一个条件为 true,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 小时的“仅记录”模式,以防止合法用户被锁定。
Extranet 智能锁定配置
以下部分介绍了为 AD FS 2016 启用 ESL 的先决条件和配置。
AD FS 2016 的先决条件
在场域中的所有节点上安装更新。
首先,确保所有 Windows Server 2016 AD FS 服务器自 2018 年 6 月 Windows 更新起保持最新状态,并且 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 数据库中手动配置数据库权限:
# 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 中的 Extranet 软锁定。 如果启用了 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 不可用,Extranet 锁定将回退到另一个域控制器。
若要设置此属性,请运行:
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 上,如果在启用 Extranet 智能锁定之前启用了 2012R2“Extranet 软锁定”行为,则“仅记录”模式将禁用“Extranet 软锁定”行为。 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 对非admin 用户的访问权限。
可以通过传递 -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”>。
- 熟悉 IP:最多 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 和错误的密码尝试的可下载报告。 Risky IP 报告中的每个项显示有关超出指定阈值的失败 AD FS 登录活动的聚合信息。 当发生 AD FS 登录活动失败时,可以将电子邮件通知设置为使用可自定义的电子邮件设置提醒管理员。 有关详细信息和设置说明,请参阅使用 Microsoft Entra Connect Health 监视 AD FS。
AD FS 外联网智能锁定事件
注释
若要排查 ESL 问题,请参阅 缓解密码喷射攻击和帐户锁定。
若要写入 Extranet 智能锁定事件,必须在 “仅登录 ”或“ 强制 ”模式下启用 ESL,并且必须启用 AD FS 安全审核。 AD FS 在以下情况下将 Extranet 锁定事件写入安全审核日志:
- 用户被锁定,这意味着用户达到未成功登录尝试的锁定阈值。
- AD FS 收到已处于锁定状态的用户的登录尝试。
在 “仅登录 ”模式下,可以检查安全审核日志中是否存在锁定事件。 对于找到的任何事件,可以使用 Get-ADFSAccountActivity
检查用户状态,以确定锁定是发生在熟悉 IP 地址还是不熟悉的 IP 地址。 还可以使用 Get-ADFSAccountActivity
cmdlet 仔细检查该用户的熟悉 IP 地址列表。
事件编号 | DESCRIPTION |
---|---|
1203 | 每次尝试使用错误密码时都会写入此事件。 当 badPwdCount 达到 ExtranetLockoutThreshold 中指定的值后,该帐户在 ExtranetObservationWindow 中指定的持续时间内被锁定在 AD FS 上。 活动 ID:%1 XML:%2 |
1210 | 每次用户被锁定时都会写入此事件。 活动 ID:%1 XML:%2 |
557 (AD FS 2019) | 在尝试与节点 %1上的账户储存 REST 服务进行通信时发生错误。 如果使用 WID 场,主节点可能处于脱机状态。 如果使用 SQL 场,AD FS 会自动选择一个新节点来托管用户存储主角色。 |
562 (AD FS 2019) | 与服务器 %1上的帐户存储终结点通信时出错。 异常消息:%2 |
563 (AD FS 2019) | 计算 Extranet 锁定状态时出错。 由于值为 %1,允许为此用户设置身份验证,并且令牌颁发将继续。 如果使用 WID 场,主节点可能处于脱机状态。 如果使用 SQL 场,AD FS 会自动选择一个新节点来托管用户存储主角色。 帐户存储服务器名称:%2 用户 ID:%3 异常消息:%4 |
512 | 以下用户的帐户被锁定。由于系统配置,允许登录尝试。 活动 ID:%1 用户:%2 客户端 IP:%3 密码错误计数:%4 上次错误的密码尝试:%5 |
515 | 以下用户帐户处于锁定状态,并且提供了正确的密码。 此帐户可能遭到入侵。 更多数据 活动 ID:%1 用户:%2 客户端 IP:%3 |
516 | 由于密码尝试过多,以下用户帐户已被锁定。 活动 ID:%1 用户:%2 客户端 IP:%3 密码错误计数:%4 上次错误的密码尝试:%5 |
ESL 常见问题解答
在“强制”模式下使用 Extranet 智能锁定的 AD FS 场是否会看到恶意用户锁定?
如果 AD FS 智能锁定设置为 “强制 ”模式,则永远不会看到合法用户帐户被暴力破解或拒绝服务锁定。 恶意帐户锁定可以阻止用户登录的唯一方法是,如果不良参与者具有用户密码,或者可以从该用户的已知良好(熟悉)IP 地址发送请求。
如果启用了 ESL,并且坏执行组件具有用户密码,会发生什么情况?
暴力攻击方案的典型目标是猜测密码并成功登录。 如果用户被钓鱼或密码被猜测,则 ESL 功能不会阻止访问,因为登录符合正确密码和新 IP 的成功条件。 然后,恶意行为者的 IP 会看起来像是一个熟悉的 IP。 此方案中的最佳缓解措施是清除 AD FS 中的用户活动,并要求用户进行多重身份验证。 应安装 Microsoft Entra Password Protection,以确保可猜测的密码不会进入系统。
如果用户从未从 IP 成功登录,然后多次尝试使用错误的密码,那么在用户最终键入密码正确后,他们能否登录?
如果用户提交多个错误的密码(例如,误报),并在以下尝试中获取正确的密码,则用户会立即成功登录。 此成功登录会清除错误的密码计数,并将该 IP 添加到 “熟悉 IP ”列表中。 但是,如果他们超出来自未知位置的登录失败次数阈值,就会进入账户锁定状态。 然后,他们必须在观察窗口结束后等待,并使用有效的密码登录。 他们可能需要管理员干预才能重置其帐户。
ESL 是否也适用于 Intranet?
如果客户端直接连接到 AD FS 服务器,而不是通过 Web 应用程序代理服务器,则 ESL 行为不适用。
我在“客户端 IP”字段中看到Microsoft IP 地址。 ESL 能阻止 EXO 代理的暴力攻击吗?
ESL 非常适用于防止 Exchange Online 或其他旧式身份验证暴力攻击方案。 旧式身份验证的“活动 ID”为 00000000-0000-0000-00000-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。 若要防止填充此驱动器,请确保在启用 ESL 之前至少具有 5 GB 的免费存储。 除了磁盘存储,计划在为 500,000 或更少的用户启用 ESL 后,进程内存总量将最多增加 1 GB 的 RAM。