在 Windows Server 2012 R2 上的 AD FS 中,我们引入了一个名为“Extranet 锁定”的安全功能。 借助此功能,AD FS 将“停止”对来自外部的“恶意”用户帐户进行身份验证一段时间。 这可以防止你的用户帐户在 Active Directory 中被锁定。 除了保护用户免受 AD 帐户锁定之外,AD FS Extranet 锁定还可以防止暴力密码猜测攻击。
Note
此功能仅适用于 Extranet 方案 ,其中身份验证请求通过 Web 应用程序代理,仅适用于 用户名和密码身份验证。
Extranet 锁定的优势
Extranet 锁定提供以下关键优势:
- 保护用户帐户免受暴力攻击:攻击者通过持续不断地发送身份验证请求来尝试猜出用户的密码。 在这种情况下,AD FS 将锁定用于 Extranet 访问的恶意用户帐户
- 保护用户帐户免遭恶意帐户锁定:攻击者企图通过发送包含错误密码的身份验证请求来锁定某个用户帐户。 在这种情况下,尽管 AD FS 会锁定该用户帐户,使其无法访问 Extranet,但并不会锁定 AD 中的实际用户帐户,用户仍可以访问组织中的企业资源。 这称为 软锁定。
工作原理
需要配置 AD FS 中的三项设置才能启用此功能:
- EnableExtranetLockout <布尔值>:如果你想要启用 Extranet 锁定,请将此布尔值设置为 True。
- ExtranetLockoutThreshold <整数>:定义错误密码尝试的最大次数。 一旦达到阈值,AD FS 就会立即拒绝来自 Extranet 的请求,而不会尝试联系域控制器进行身份验证(无论密码是否错误),直到 Extranet 观察期限已过。 这意味着 AD 帐户的 badPwdCount 属性的值在帐户软锁定时不会增加。
- ExtranetObservationWindow <时间范围>:确定将用户帐户软锁定多长时间。该期限过后,AD FS 将再次开始执行用户名和密码身份验证。 AD FS 参考 AD 属性 badPasswordTime 来确定 Extranet 观察期限是否已过。 如果当前时间 > badPasswordTime + ExtranetObservationWindow,则表示该期限已过。
Note
AD FS Extranet 锁定独立于 AD 锁定策略运行。 但是,强烈建议将 ExtranetLockoutThreshold 参数值设置为小于 AD 帐户锁定阈值的值。 如果不这样做,将导致 AD FS 无法防止帐户在 Active Directory 中被锁定。
下面是使用最多 15 次错误密码尝试和 30 分钟软锁定持续时间启用 Extranet 锁定功能的示例:
Set-AdfsProperties -EnableExtranetLockout $true -ExtranetLockoutThreshold 15 -ExtranetObservationWindow (new-timespan -Minutes 30)
这些设置适用于 AD FS 服务可对其进行身份验证的所有域。 其工作方式是,当 AD FS 收到身份验证请求时,它将通过 LDAP 调用访问主域控制器(PDC),并针对 PDC 上的用户执行 badPwdCount 属性的查找。 如果 AD FS 找到 badPwdCount>= ExtranetLockoutThreshold 设置的值,并且 Extranet 观察窗口中定义的时间尚未通过,AD FS 将立即拒绝请求,这意味着无论用户是否从 Extranet 输入良好或错误的密码,登录将失败,因为 AD FS 不会将凭据发送到 AD。 AD FS 不会保留与 badPwdCount 或锁定用户帐户相关的任何状态。 AD FS 将 AD 用于所有状态跟踪。
Warning
在 Server 2012 R2 上启用 AD FS Extranet 锁定时,所有通过 WAP 发送的身份验证请求都由 PDC 上的 AD FS 验证。 当 PDC 不可用时,用户将无法从 Extranet 进行身份验证。
Server 2016 提供了一个附加参数,使 AD FS 可以在 PDC 不可用时回退到另一个域控制器:
- ExtranetLockoutRequirePDC <布尔值> - 启用时:Extranet 锁定需要主域控制器 (PDC)。 禁用时:如果 PDC 不可用,Extranet 锁定将回退到另一个域控制器。
可以使用以下 Windows PowerShell 命令在 Server 2016 上配置 AD FS Extranet 锁定:
Set-AdfsProperties -EnableExtranetLockout $true -ExtranetLockoutThreshold 15 -ExtranetObservationWindow (new-timespan -Minutes 30) -ExtranetLockoutRequirePDC $false
使用 Active Directory 锁定策略
AD FS 中的 Extranet 锁定功能独立于 AD 锁定策略工作。 但是,需要确保 Extranet 锁定的设置已正确配置,只有这样,该功能才能配合 AD 锁定策略发挥其安全作用。
让我们先了解 AD 锁定策略。 AD 中的锁定策略有三项设置:
- 帐户锁定阈值:此设置类似于 AD FS 中的 ExtranetLockoutThreshold 设置。 它确定在登录尝试失败几次后会导致用户帐户被锁定。为了保护用户帐户免受恶意帐户锁定攻击,建议将 AD FS < 中的 ExtranetLockoutThreshold 值设置为小于 AD 中的帐户锁定阈值
- 帐户锁定持续时间:此设置确定锁定用户帐户多长时间。此设置在此话题中无关紧要,因为如果配置正确,Extranet 锁定始终应在 AD 锁定之前发生
- 在此时间后重置帐户锁定计数器:此设置确定在用户上次登录失败过去多长时间后,将 badPwdCount 重置为 0。 为使 AD FS 中的 Extranet 锁定功能与 AD 锁定策略正常地配合工作,需要确保 AD FS > 中的 ExtranetObservationWindow 值大于 AD 中的“在此时间后重置帐户锁定计数器”值。 以下示例解释了原因。
让我们看一下两个示例,看看基于不同设置和状态随时间变化 的 badPwdCount 。 假设在这两个示例中,帐户锁定阈值 = 4,ExtranetLockoutThreshold = 2。 红色箭头表示错误的密码尝试,绿色箭头表示良好的密码尝试。 在示例 #1 中, ExtranetObservationWindow>重置帐户锁定计数器 After。 在示例 #2 中, ExtranetObservationWindow<重置帐户锁定计数器 After。
示例 1
示例 2
如上所示, 将 badPwdCount 重置为 0 时有两个条件。 一个条件是成功登录。 另一个条件是到了重置此计数器的时间,该时间在“在此时间后重置帐户锁定计数器”设置中定义。 如果在此时间后重置帐户锁定计数器”值<ExtranetObservationWindow,则帐户不会面临任何被 AD 锁定的风险。 但是,如果在此时间后重置帐户锁定计数器”值>ExtranetObservationWindow,则帐户可能会被 AD 锁定,不过是以“延迟方式”锁定。 AD 锁定帐户可能需要一段时间,具体取决于你的配置,因为 AD FS 只会在其观察窗口中允许一次错误的密码尝试,直到 badPwdCount 达到 帐户锁定阈值。
有关详细信息,请参阅配置帐户锁定。
已知问题
存在一个已知问题,即 AD 用户帐户无法使用 AD FS 进行身份验证,因为 badPwdCount 属性不会复制到 ADFS 正在查询的域控制器。 有关详细信息 ,请参阅2971171 。 可在此处 找到到目前为止发布的所有 AD FS FPGA。
需记住的要点
- Extranet 锁定功能仅适用于通过 Web 应用程序代理发出的身份验证请求的 Extranet 方案
- Extranet 锁定功能仅适用于用户名和密码身份验证
- AD FS 不会跟踪已软锁定的 badPwdCount 或用户。AD FS 将 AD 用于所有状态跟踪
- AD FS 通过针对 PDC 上的用户的 LDAP 调用执行 对 badPwdCount 属性的查找,以执行每次身份验证尝试
- 如果无法访问 PDC,版本低于 2016 的 AD FS 将会失败。 AD FS 2016 引入了一些改进,使 AD FS 可以在 PDC 不可用的情况下回退到其他域控制器。
- 如果 badPwdCount < ExtranetLockoutThreshold,AD FS 将允许来自 Extranet 的身份验证请求
- 如果 badPwdCount>= ExtranetLockoutThreshold AND badPasswordTime + ExtranetObservationWindow< 当前时间,AD FS 将拒绝来自 Extranet 的身份验证请求
- 为了避免恶意帐户锁定,应确保 ExtranetLockoutThreshold<帐户锁定阈值 和 ExtranetObservationWindow>重置帐户锁定计数器