本地管理员密码在Windows Server环境中一直是个令人头疼的安全黑洞。为了运维方便,很多团队习惯给所有服务器设置相同的本地管理员密码,一旦一台机器被攻破,攻击者就能用哈希传递攻击在内网横向移动,几分钟内拿下整个域。微软显然意识到了这个问题的严重性,于是推出了LAPS(Local Administrator Password Solution),专门用来解决本地管理员密码的统一管理和自动轮换问题。LAPS不是什么新工具,但直到今天,它依然是Windows域环境中性价比最高的安全配置之一,而且完全免费,不需要额外购买授权。

LAPS的工作原理其实非常直观

LAPS的核心机制并不复杂。它在每台加入域的计算机上安装一个客户端组件,这个组件会定期生成新的随机密码,更新本地管理员账户的密码,然后把新密码加密存储在Active Directory中该计算机对象的两个机密属性里。只有被授权的用户或组才能读取这些密码。整个过程完全自动化,管理员不需要手动维护任何密码列表,每台服务器的本地管理员密码都可以做到独一无二且定期轮换。当需要紧急登录某台服务器进行离线维护时,授权管理员从AD中查询到当前密码即可使用,密码过期时间也是透明可见的。

部署前的环境检查

在动手部署之前,需要确认几个前提条件。首先,域控制器至少需要运行Windows Server 2016或更高版本,但实际上LAPS支持从Windows Server 2008 R2开始的所有域功能级别。其次,所有需要管理的客户端计算机必须运行Windows Vista或更高版本的操作系统,Windows Server 2008及以上的服务器系统也都在支持范围内。第三,需要在域控制器上扩展Active Directory架构,这一步会向AD中添加两个新属性,用于存储加密后的密码和过期时间戳。扩展架构是不可逆操作,但影响范围非常小,只添加属性不修改现有对象,风险极低。第四,需要有一个专门的服务账号或安全组来授予读取密码的权限,这个权限的规划直接决定了整个方案的安全性。

第一步:扩展Active Directory架构

从微软官方下载LAPS安装包后,在域控制器上以架构管理员身份运行PowerShell。安装包中包含了必要的DLL文件和PowerShell模块。扩展架构的具体命令如下:

Import-Module AdmPwd.PS
Update-AdmPwdADSchema

执行成功后,可以在ADSI编辑器中验证ms-Mcs-AdmPwd和ms-Mcs-AdmPwdExpirationTime两个属性是否已经添加到计算机对象类中。这一步只需要在架构主机上执行一次,整个林中的域控制器都会自动同步架构变更。如果组织中有多个域,每个域都需要单独进行后续的配置,但架构扩展只需做一次。

第二步:配置权限和安装客户端

架构扩展完成后,需要为计算机对象设置安全权限。LAPS使用AD中计算机对象自身的ACL来控制谁能读取密码。微软推荐的做法是创建一个专用的安全组,比如命名为LAPS_Password_Readers,然后把需要查看密码的IT人员加入这个组。接下来用Set-AdmPwdComputerSelfPermission这个cmdlet为指定OU中的计算机对象配置自写入权限,让计算机能够更新自己的密码属性:

Set-AdmPwdComputerSelfPermission -OrgUnit "OU=Servers,DC=contoso,DC=com"

然后为授权用户组赋予读取权限:

Set-AdmPwdReadPasswordPermission -OrgUnit "OU=Servers,DC=contoso,DC=com" -AllowedPrincipals "contoso\LAPS_Password_Readers"

权限配置完成后,在每台需要管理的服务器上安装LAPS客户端组件。这一步可以通过组策略软件安装、SCCM分发或者手动安装MSI包来完成。客户端安装后,本地管理员密码不会立即更改,需要等待组策略生效。

第三步:通过组策略启用LAPS功能

LAPS安装包会自动向域控制器的组策略管理模板中添加新的管理模板文件AdmPwd.admx。在组策略管理控制台中,找到需要应用LAPS策略的OU所链接的GPO,进入计算机配置、管理模板、LAPS,这里有四个关键设置需要配置。启用本地管理员密码管理必须设置为已启用。密码设置中可以指定密码复杂度,包括长度、是否使用大写字母、小写字母、数字和特殊字符,建议密码长度至少14位,四种字符类型全选。密码过期时间根据安全策略设定,通常建议30天轮换一次。还有一个容易被忽略的设置是启用本地管理员账户,如果环境中某些服务器禁用了内置Administrator账户,LAPS会重新启用它,这个行为可以通过策略控制。配置完成后,客户端在下一次组策略刷新周期内就会执行密码轮换。

验证LAPS是否正常工作

部署完成后,验证是必不可少的一步。在域控制器上使用PowerShell查询某台计算机的LAPS密码:

Get-AdmPwdPassword -ComputerName "SERVER01"

命令会返回计算机名称、密码值和过期时间戳。如果返回了随机密码且时间戳正确,说明整个链路已经打通。还可以在目标服务器上检查事件查看器,LAPS会在应用程序日志中记录密码更改事件,事件ID通常为6和12,分别对应密码更新成功和策略处理结果。如果发现密码没有更新,常见原因包括:计算机对象权限配置不正确、组策略未正确应用、客户端服务未启动、或者计算机账户本身与域控制器的安全通道存在问题。

LAPS的权限模型与安全考量

LAPS的安全性高度依赖AD权限模型的正确配置。密码存储在AD中,任何拥有对计算机对象ms-Mcs-AdmPwd属性读取权限的用户都能看到明文密码。因此,必须严格控制LAPS_Password_Readers组的成员,定期审计这个组的成员列表。域管理员默认拥有对所有计算机对象的完全控制权限,自然也就能读取LAPS密码,这一点无法通过LAPS本身来限制,需要从域管理员组的成员管控入手。另外,LAPS密码在客户端和域控制器之间通过网络传输时是加密的,使用的是Kerberos加密通道,不需要额外配置证书。但密码在AD数据库中存储时,默认情况下并不加密,只是通过ACL限制访问。如果攻击者获得了AD数据库文件NTDS.dit的访问权限,就能直接提取LAPS密码,所以AD数据库本身的保护同样重要。

处理特殊场景:域控制器、DMZ和旧系统

LAPS默认不支持管理域控制器的本地管理员密码,因为域控制器没有本地SAM数据库,其本地管理员账户实际上是域管理员。对于DMZ环境中的工作组服务器,LAPS也无法直接管理,但可以通过部署本地管理密码解决方案的变通方式来处理。对于Windows Server 2003这类已经停止支持的系统,LAPS客户端无法安装,建议尽快升级或者通过网络隔离来降低风险。如果环境中存在大量非Windows系统,LAPS无法覆盖,需要考虑使用第三方特权访问管理工具来统一管理。

LAPS的日志审计与监控

密码被读取的事件会记录在域控制器的安全日志中,事件ID为4662,表示对AD对象的读取操作。通过配置高级审计策略,可以追踪谁在什么时间读取了哪台计算机的LAPS密码。建议将这类审计事件集中到SIEM系统中,设置告警规则,当非授权用户尝试读取密码或者授权用户在非工作时间大量读取密码时触发告警。这种监控能力是LAPS相比手动密码管理方案的一个重要优势,所有密码访问行为都有迹可循。

从LAPS迁移到Windows LAPS的注意事项

2023年4月,微软发布了Windows LAPS,这是LAPS的新一代版本,直接内置于Windows Server 2019和Windows 11的最新更新中,不再需要单独安装MSI包。Windows LAPS带来了几个关键改进:支持Azure AD加入的设备、密码加密存储在AD中、支持DCSync保护、以及更灵活的策略配置。如果是从传统LAPS迁移,需要先在域控制器上更新架构,然后逐步替换客户端的组策略配置。迁移过程可以分阶段进行,新旧版本可以共存一段时间。对于新建环境,直接使用Windows LAPS是更合理的选择,但传统LAPS在旧版Windows Server上依然稳定可靠。

实际运维中的经验与建议

在实际运维中,有几个经验值得分享。第一,不要把所有服务器的密码轮换周期设成一样,可以按照服务器的重要程度分层设置,核心业务服务器的轮换周期可以短一些,非关键服务器可以适当放长。第二,LAPS管理的本地管理员账户名称可以自定义,不一定非要用默认的Administrator,通过组策略可以指定管理其他本地管理员账户。第三,定期用脚本批量检查LAPS密码的过期状态,确保没有机器因为通信问题导致密码长期未更新。第四,建立紧急访问流程,当需要离线登录服务器但无法联系AD时,需要有破窗恢复机制,比如通过物理访问或者带外管理卡重置密码。第五,LAPS不能替代特权访问工作站和其他纵深防御措施,它解决的是本地管理员密码管理这个特定问题,整体的安全防护体系还需要其他组件配合。

LAPS的部署成本极低,安全收益却非常显著。它从根本上消除了本地管理员密码硬编码、密码复用和密码长期不变这三大顽疾。对于任何使用Active Directory的组织来说,部署LAPS应该成为安全基线的一部分,而不是可选项。从微软持续投入开发Windows LAPS也能看出,这个解决方案在微软自身的安全体系中也占据着重要位置。如果你所在的环境还没有实施LAPS,现在就是最好的时机。