配置 AD FS Extranet 锁定保护

在 Windows Server 2012 R2 上的 AD FS 中,我们引入了一个名为“Extranet 锁定”的安全功能。 借助此功能,AD FS 将“停止”对来自外部的“恶意”用户帐户进行身份验证一段时间。 这可以防止你的用户帐户在 Active Directory 中被锁定。 除了保护用户免受 AD 帐户锁定之外,AD FS Extranet 锁定还可以防止暴力密码猜测攻击。

注意

此功能仅适用于通过 Web 应用程序代理传送身份验证请求的 Extranet 方案,并且仅适用于用户名和密码身份验证。

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,则表示该期限已过。

注意

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 用于所有状态跟踪。

警告

在 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 >“在此时间后重置帐户锁定计数器”值。 在示例 #2 中,ExtranetObservationWindow <“在此时间后重置帐户锁定计数器”值。

示例 1

Diagram that shows how badPwdCount changes over time based on different settings and states.

示例 2

Example1

从上面可以看出,将 badPwdCount 重置为 0 需要满足两个条件。 一个条件是成功登录。 另一个条件是到了重置此计数器的时间,该时间在“在此时间后重置帐户锁定计数器”设置中定义。 如果“在此时间后重置帐户锁定计数器”值 < ExtranetObservationWindow,则帐户不会面临任何被 AD 锁定的风险。 但是,如果“在此时间后重置帐户锁定计数器”值 > ExtranetObservationWindow,则帐户可能会被 AD 锁定,不过是以“延迟方式”锁定。 根据具体的配置,AD 锁定帐户可能需要一段时间,因为在 badPwdCount 达到“帐户锁定阈值”之前,AD FS 在其观察期限内只允许一次错误密码尝试。

有关详细信息,请参阅配置帐户锁定

已知问题

有一个已知问题:AD 用户帐户无法使用 AD FS 进行身份验证,因为 badPwdCount 属性不会复制到 ADFS 正在查询的域控制器。 有关更多详细信息,请参阅 2971171。 可在此处找到迄今为止发布的所有 AD FS QFE。

需记住的要点

  • Extranet 锁定功能仅适用于通过 Web 应用程序代理传送身份验证请求的 Extranet 方案
  • Extranet 锁定功能仅适用于“用户名和密码身份验证”
  • AD FS 不会跟踪 badPwdCount 或已软锁定的用户。AD FS 将 AD 用于所有状态跟踪
  • 对于每次身份验证尝试,AD FS 将通过 LDAP 调用对 PDC 上的用户执行 badPwdCount 属性查找
  • 如果无法访问 PDC,版本低于 2016 的 AD FS 将会失败。 AD FS 2016 引入了一些改进,使 AD FS 可以在 PDC 不可用的情况下回退到其他域控制器。
  • 如果 badPwdCount < ExtranetLockoutThreshold,AD FS 将允许来自 Extranet 的身份验证请求
  • 如果 badPwdCount >= ExtranetLockoutThreshold 并且 badPasswordTime + ExtranetObservationWindow < 当前时间,AD FS 将拒绝来自 Extranet 的身份验证请求
  • 为避免出现恶意帐户锁定,应确保 ExtranetLockoutThreshold < 帐户锁定阈值,并且 ExtranetObservationWindow > 重置帐户锁定计数器