本文介绍 Windows Server 2016 中的 Extranet 智能锁定功能。
适用于:Windows Server 2016
原始 KB 数: 4096478
概述
自 2018 年 3 月 Windows Server 2016 更新起,Active Directory 联合身份验证服务(AD FS)具有名为Extranet Smart Lockout(ESL)的新功能。 在身份验证服务攻击增加的时代,ESL 使 AD FS 能够区分来自有效用户的登录尝试与攻击者的登录尝试。 因此,AD FS 可以锁定攻击者,同时让有效用户继续使用其帐户。 这可以防止用户的拒绝服务,并防范针对已知用户帐户的目标攻击。
ESL 功能适用于 Windows Server 2016 中的 AD FS。
如何安装和配置 ESL
在场中的所有节点上安装更新
首先,请确保截至 2018 年 3 月Windows 更新,所有 Windows Server 2016 AD FS 服务器都处于最新状态。
更新项目数据库权限
外联网智能锁定要求 AD FS 服务帐户具有在 AD FS 项目数据库中创建新表的权限。 以 AD FS 管理员身份登录到任何 AD FS 服务器,然后在 PowerShell 命令提示符窗口中执行以下命令来授予此权限:
$cred= Get-Credential
Update-AdfsArtifactDatabasePermission -Credential$cred
注意
$cred 占位符是具有 AD FS 管理员权限的帐户。 这应该提供创建表的写权限。
由于你的 AD FS 场正在使用 SQL Server,并且上面提供的凭据在你的 SQL Server 上没有管理权限,因此上述命令可能会因缺乏足够的权限而失败。 在这种情况下,可以在连接到 AdfsArtifactStore 数据库时运行以下命令,从而在 SQL Server 数据库中手动配置数据库权限。
ALTER AUTHORIZATION ON SCHEMA::[ArtifactStore] TO [db_genevaservice]
配置 ESL
添加了名为 ExtranetLockoutMode 的新参数以支持 ESL。 包含下列值:
- ADPasswordCounter - 这是旧的 AD FS“Extranet 软锁定”模式,该模式不基于位置进行区分。 这是默认值。
- ADFSSmartLockoutLogOnly - 这是 Extranet 智能锁定。 AD FS 不会拒绝身份验证请求,而是写入管理员和审核事件。
- ADFSSmartLockoutEnforce - 这是 Extranet 智能锁定,完全支持在达到阈值时阻止不熟悉的请求。
建议首先通过运行以下 cmdlet,将锁定提供程序设置为仅短时间内(1 到 3 天)的记录。 查看此时间段内的审核(详情见下文),以确定可能受到影响的帐户数以及这些事件的频率。 成功评估审核后,将设置设为“ADFSSmartLockoutEnforce”模式:
Set-AdfsProperties -ExtranetLockoutMode AdfsSmartlockoutLogOnly
在此模式下,AD FS 会执行分析,但由于锁定计数器,不会阻止任何请求。 此模式用于在启用“强制”模式之前验证智能锁定是否成功运行。
若要使新模式生效,请运行以下命令,在场中的所有节点上重启 AD FS 服务:
Restart-service adfssrv
设置锁定阈值和观察窗口
ESL 有两个关键设置:锁定阈值和观察窗口。
锁定阈值设置
每次基于密码的身份验证成功时,AD FS 都会将客户端 IP 存储为帐户活动表中的熟悉位置。
如果基于密码的身份验证失败,并且凭据不来自熟悉的位置,则会递增失败的身份验证计数。
如果来自不熟悉位置的密码尝试次数达到锁定阈值,如果来自不熟悉位置的基于密码的身份验证失败,则帐户将被锁定。
注意
锁定将继续应用于熟悉的位置,这与这个新不熟悉的锁定计数器分开。
阈值是使用 Set-AdfsProperties
.
示例:
Set-AdfsProperties -ExtranetLockoutThreshold 10
观察窗口设置
观察窗口设置允许帐户在一段时间后自动解锁。 帐户解锁后,允许进行一次身份验证尝试。 如果身份验证成功,则失败的身份验证计数将重置为 0。 如果失败,系统会等待另一个观察窗口,然后用户才能重试。
观察窗口按 Set-AdfsProperties
以下示例命令所示进行设置:
Set-AdfsProperties -ExtranetObservationWindow ( new-timespan -minutes 5 )
启用锁定
可以使用 EnableExtranetLockout 参数启用或禁用 Extranet 锁定,如以下示例所示。
若要启用锁定,请运行以下命令:
Set-AdfsProperties -EnableExtranetLockout $true
若要禁用锁定,请运行以下命令:
Set-AdfsProperties -EnableExtranetLockout $false
启用强制模式
熟悉锁定阈值和观察窗口后,可以使用以下 PSH cmdlet 将 ESL 移动到“强制”模式:
Set-AdfsProperties -ExtranetLockoutMode AdfsSmartLockoutEnforce
若要使新模式生效,请使用以下命令在场中的所有节点上重启 AD FS 服务:
Restart-service adfssrv
管理 ESL
管理用户帐户活动
AD FS 提供三个 cmdlet 来管理用户帐户活动数据。 这些 cmdlet 自动连接到场中具有主角色的节点。
注意
可以通过传递 -Server 参数来覆盖此行为。
Get-ADFSAccountActivity
读取用户帐户的当前帐户活动。 cmdlet 始终使用帐户活动 REST 终结点自动连接到场主服务器。 因此,所有数据应始终保持一致。
Get-ADFSAccountActivity user@contoso.com
Set-ADFSAccountActivity
更新用户帐户的帐户活动。 这可用于为任何帐户添加新的熟悉位置或擦除状态。
Set-ADFSAccountActivity user@contoso.com -FamiliarLocation "1.2.3.4"
Reset-ADFSAccountLockout
重置用户帐户的锁定计数器。
Reset-ADFSAccountLockout user@contoso.com -Familiar
故障排除
更新数据库权限
如果从 Update-AdfsArtifactDatabasePermission
cmdlet 返回任何错误,请验证以下内容:
- 如果节点位于服务器场列表中,但不再是服务器场的成员,则验证将失败。 可以通过运行
remove-adfsnode <node name>
来修复此问题。 - 验证更新是否已部署在场中的所有节点上。
- 验证传递给 cmdlet 的凭据是否有权修改 AD FS 项目数据库架构的所有者。
日志记录/审核
由于帐户超出锁定阈值而拒绝身份验证请求时,AD FS 会将 ExtranetLockoutEvent 写入安全审核流。
记录事件示例
已发生 Extranet 锁定事件。 有关失败详细信息,请参阅 XML。
活动 ID:172332e1-1301-4e56-0e00-0080000000db
其他数据
XML: <?xml version=“1.0” encoding=“utf-16”?><AuditBase xmlns:xsd=“http://www.w3.org/2001/XMLSchema
” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance
” xsi:type=“ExtranetLockoutAudit”><AuditType>ExtranetLockout</AuditType>
<AuditResult>Failure</AuditResult>
<FailureType>ExtranetLockoutError</FailureType>
<ErrorCode>AccountRestrictedAudit</ErrorCode>
<ContextComponents>
<组件 xsi:type=“ResourceAuditComponent”>
<RelyingParty>http://contoso.com
/adfs/services/trust</RelyingParty>
<ClaimsProvider>N/A</ClaimsProvider>
<UserId>TQDFTD\Administrator</UserId>
</元件>
<组件 xsi:type=“RequestAuditComponent”>
<服务器>N/A</服务器>
<AuthProtocol>WSFederation</AuthProtocol>
<NetworkLocation>Intranet</NetworkLocation>
<IpAddress>4.4.4.4</IpAddress>
<ForwardedIpAddress />
<ProxyIpAddress>1.2.3.4</ProxyIpAddress>
<NetworkIpAddress>1.2.3.4</NetworkIpAddress>
<ProxyServer>N/A</ProxyServer>
<UserAgentString>Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/63.0.3239.132 Safari/537.36</UserAgentString>
<Endpoint>/adfs/ls</Endpoint>
</元件>
<组件 xsi:type=“LockoutConfigAuditComponent”>
<CurrentBadPasswordCount>5</CurrentBadPasswordCount>
<ConfigBadPasswordCount>5</ConfigBadPasswordCount>
<LastBadAttempt>02/07/2018 21:47:44</LastBadAttempt>
<LockoutWindowConfig>00:30:00</LockoutWindowConfig>
</元件>
</ContextComponents>
</AuditBase>
卸载
SQL Server 数据库场可以使用“设置”应用程序卸载更新,而不会出现问题。
由于更新的 WID 数据库验证二进制文件,WID 数据库场必须遵循以下步骤:
运行卸载 psh 脚本以停止服务并删除帐户活动表。
Stop-Service adfssrv -ErrorAction Stop $doc = new-object Xml $doc.Load("$env:windir\ADFS\Microsoft.IdentityServer.Servicehost.exe.config") $connString = $doc.configuration.'microsoft.identityServer.service'.policystore.connectionString if ( -not $connString -like "*##wid*" ) { Write-Error "SQL installs don't require DB updates, skipping DB table drop" } else { $connString = "Data Source=np:\\.\pipe\microsoft##wid\tsql\query;Initial Catalog=AdfsArtifactStore;Integrated Security=True" stop-service adfssrv $cli = new-object System.Data.SqlClient.SqlConnection $cli.ConnectionString = $connString $cli.Open() try { $cmd = new-object System.Data.SqlClient.SqlCommand $cmd.CommandText = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[ArtifactStore].[AccountActivity]') AND type in (N'U')) DROP TABLE [ArtifactStore].[AccountActivity]" $cmd.Connection = $cli $cmd.ExecuteNonQuery() } finally { $cli.CLose() } write-warning "Finish removing the patch using the Settings app and then restart the complete to complete the uninstall" }
使用设置应用程序卸载更新。
重新启动计算机。