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 上,如果在启用 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 访问权限委托给非管理员用户。
可以通过传递 -Server
参数来替代此行为。
Get-ADFSAccountActivity -UserPrincipalName
cmdlet 使用帐户活动 REST 终结点自动连接到场主节点。 因此,所有数据应始终保持一致。 通过以下命令读取用户帐户的当前帐户活动:
Get-ADFSAccountActivity [email protected]
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 [email protected] -AdditionalFamiliarIps “1.2.3.4”
Reset-ADFSAccountLockout
为每个熟悉的位置 (badPwdCountFamiliar) 或不熟悉的位置计数器 (badPwdCountUnfamiliar) 重置用户帐户的锁定计数器。 重置计数器时,“FamiliarLockout”或“UnfamiliarLockout”值将更新,因为重置计数器小于阈值。
Reset-ADFSAccountLockout [email protected] -Location Familiar
Reset-ADFSAccountLockout [email protected] -Location Unknown
以下部分介绍如何监视事件日志记录、用户帐户活动和锁定。
Connect Health
建议通过 Connect Health 来监视用户帐户活动。 Connect Health 可生成有关危险 IP 和错误密码尝试的可下载报告。 风险 IP 报告中的每个项目都会显示有关失败的 AD FS 登录活动(失败次数超出指定阈值)的聚合信息。 可以将电子邮件通知设置为在 AD FS 登录活动失败时使用可自定义的电子邮件设置向管理员发出警报。 有关详细信息和设置说明,请参阅使用 Microsoft Entra Connect Health 监视 AD FS。
若要排查 ESL 问题,请参阅缓解密码喷射攻击和帐户锁定。
对于要写入的 Extranet 智能锁定事件,必须在“仅记录”或“强制”模式下启用 ESL,并且必须启用 AD FS 安全审核。
AD FS 在以下情况下将 Extranet 锁定事件写入安全审核日志:
用户被锁定,这意味着用户达到登录尝试失败的锁定阈值。
AD FS 收到已处于锁定状态的用户的登录尝试。
在“仅记录”模式下,你可以检查锁定事件的安全审核日志。 对于找到的任何事件,可以使用 Get-ADFSAccountActivity
检查用户状态,以确定锁定是发生在熟悉 IP 地址还是不熟悉的 IP 地址。 还可以使用 Get-ADFSAccountActivity
cmdlet 仔细检查该用户的熟悉 IP 地址列表。
事件 ID
每次尝试使用错误密码时都会写入此事件。 一旦 badPwdCount 达到 ExtranetLockoutThreshold 中指定的值,帐户将在 AD FS 上锁定 ExtranetObservationWindow 中指定的持续时间。
活动 ID:%1
XML:%2
每次锁定用户时都会写入此事件。
活动 ID:%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
用户 ID:%3
异常消息:%4
以下用户的帐户已被锁定。由于系统配置,允许登录尝试。
活动 ID:%1
用户:%2
客户端 IP:%3
错误密码计数:%4
上次错误密码尝试:%5
以下用户帐户处于锁定状态,并且提供了正确的密码。 此帐户可能已泄露。
其他数据
活动 ID:%1
用户:%2
客户端 IP:%3
由于错误密码尝试次数过多,以下用户帐户已被锁定。
活动 ID:%1
用户:%2
客户端 IP:%3
错误密码计数:%4
上次错误密码尝试:%5
ESL 常见问题
在“强制”模式下使用 Extranet 智能锁定的 AD FS 场是否会看到恶意用户锁定?
如果 AD FS 智能锁定设置为“强制”模式,则将永远不会看到合法用户的帐户被暴力破解或拒绝服务锁定。 恶意帐户锁定阻止用户登录的唯一方式是,恶意行为者拥有用户密码,或者可以从该用户的已知良好(熟悉)IP 地址发送请求。
如果启用了 ESL,而恶意行为者有用户密码,会发生什么情况?
暴力攻击场景的典型目标是猜测密码并成功登录。 如果用户被钓鱼或密码被猜中,则 ESL 功能将不会阻止访问,因为登录将满足正确密码加上新 IP 的“成功”标准。 然后,恶意行为者 IP 将以“熟悉”的形式出现。 在这种情况下,最好的缓解方法是清除用户在 AD FS 中的活动,并要求对用户进行多因素身份验证。 应安装 Microsoft Entra 密码保护,确保可猜测的密码不会进入系统。
如果我的用户从未从 IP 成功登录,然后使用错误的密码尝试了几次,那么在用户最终正确输入密码后,是否能够登录?
如果用户提交了多个错误密码(如键入错误),并且在接下来的尝试中获得了正确的密码,则用户将立即成功登录。 成功登录将清除错误密码计数,并将该 IP 添加到 FamiliarIPs 列表中。 但是,如果用户超过了从未知位置登录失败的阈值,则将进入锁定状态。 然后必须等待观察时间窗口结束并使用有效密码登录。 他们可能需要管理员干预才能重置其帐户。
ESL 是否也适用于内联网?
如果客户端直接连接到 AD FS 服务器,而不是通过 Web 应用程序代理服务器,则 ESL 行为将不适用。
我在“客户端 IP”字段中看到 Microsoft IP 地址。 ESL 能阻止 EXO 代理的暴力攻击吗?
ESL 可以很好地防止 Exchange Online 或其他传统身份验证暴力攻击场景。 传统身份验证的“活动 ID”为 00000000-0000-0000-00000000-00000000。 在这些攻击中,恶意行为者利用 Exchange Online 基本身份验证(也称为旧版身份验证),使客户端 IP 地址显示为 Microsoft IP 地址。 云中的 Exchange Online 服务器代表 Outlook 客户端代理身份验证验证。 在这些情况下,恶意提交者的 IP 地址位于 x-ms-forwarded-client-ip 中,而 Microsoft Exchange Online Server 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,从而计划增加总进程内存。
有关保护 Active Directory 联合身份验证服务的最佳做法
Set-AdfsProperties
AD FS 操作