Microsoft Local Administrator Password Solution (LAPS) 使组织能够在所有终端上管理本地管理员密码。若正确实施,它是一种有效的方式,可防止环境中某些潜在横向移动类型以及 privilege escalation ——但如果实施不当,就可能为攻击者打开巨大的漏洞。
本文将解释 LAPS 是什么、如何部署,以及如何使用 Netwrix Privilege Secure 来弥补其固有的安全漏洞。
Microsoft LAPS 是什么?
Microsoft LAPS 是一款密码管理工具,利用 Active Directory 来管理并轮换所有 Windows 终端上的本地管理员账户密码。通过确保所有本地管理员账户拥有唯一且复杂的密码,LAPS 有助于降低横向移动和权限提升的风险:攻击者一旦攻破某个本地管理员账户,就不能仅凭使用相同密码就横向移动到其他终端。
相比其他密码管理工具,LAPS 的优势在于:管理这些密码不需要额外的计算机;整个过程完全通过 download 和使用 LAPS 免费版。
设置 Microsoft LAPS
要在你的环境中设置 LAPS,请按照下载中包含的指南(LAPS_OperationsGuide.docx)中详细说明的步骤进行操作。下面,我将以高层次的方式带你了解其中一些步骤。
在你的终端上安装 LAPS
在终端上安装 LAPS 时,会部署以下组件:
- 胖客户端界面
- PowerShell 模块
- 组策略 模板
- AdmPwd GPO 扩展
管理控制台需要其中一项或多项功能,而由 LAPS 进行管理的终端只需要 AdmPwd GPO 扩展。操作指南提供了将此组件推送到你终端的几种方法。
扩展你的 Active Directory 架构以支持 LAPS
Microsoft 提供了一个 PowerShell 模块,帮助你完成这一步。它会向你的架构中添加两个计算机属性:
- ms-Mcs-AdmPwd — 以明文形式存储计算机对象的本地管理员密码(听起来很吓人,我知道,但我稍后会详细说明)
- ms-Mcs-AdmPwdExpirationTime — 存储密码到期的时间
一旦扩展了架构,你就可以使用组策略将 LAPS 的配置推送到所有成员服务器。然后,使用 Group Policy Management 编辑器来配置新的 LAPS 组策略对象(GPO):
LAPS GPO 包含以下设置:
- 密码设置 — 允许你指定本地 Administrator 账户密码的复杂性要求,包括长度和有效期
- 启用本地管理员密码管理 — 控制由 GPO 管辖的终端是否由 LAPS 进行管理
- 要管理的管理员账户名称 — 允许你管理非默认的本地管理员账户的密码(即,名称不是“Administrator”的本地账户)
- 不允许设置比策略要求更长的密码过期时间 — 允许你确保密码过期时间不会超过“密码有效期(天)”在“密码设置”中的配置
确保 LAPS 安全
在扩展 AD 架构之后,下一步是确保这些新属性的权限已正确应用。由于您希望仅向确实需要访问的对象授予权限,因此这是流程中最重要的步骤之一。Microsoft 提供 PowerShell 脚本,用于检查当前是谁拥有对该属性的访问权限,并在需要时应用新的权限。
从宏观角度来看,这里需要注意几个方面:
- 从不应能够查看本地 Administrator 账户密码的计算机对象上的用户和组中移除“All extended rights(所有扩展权限)”权限(请记住该密码以纯文本形式存储在属性中)。
- “SELF”主体需要具备向“ms-Mcs-AdmPwdExpirationTime”和“ms-Mcs-AdmPwd”属性写入的能力,以便在密码到期时更新密码及其过期时间。LAPS 管理的所有计算机对象上都需要为“SELF”配置 ACE。
- 被允许重置本地 Administrator 账户密码的用户和组,必须被授予对这些计算机对象上属性的访问权限。
下面是一段脚本,可帮助你了解今天是谁有权访问这些属性。
<#
Author: Kevin Joyce
Requirements: Active Directory PowerShell module, Domain Administrator privileges (to ensure the capability to get attribute GUIDs and view all permissions on all computer objects)
Description: Looks up permissions within Active Directory on a target (OU or Computer) to determine access to LAPS attributes (ms-Mcs-AdmPwdExpirationTime and ms-Mcs-AdmPwd).
Usage: Populate the $target variable with the DN of a computer object, or OU to search for computer objects within.
To output the results to a text file run the following .LAPS_Permissions_Collection.ps1 > output.txt
<#
Import-Module ActiveDirectory
##Get the GUID of the extended attributes ms-Mcs-AdmPwdExpirationTime and ms-Mcs-AdmPwd from Schema
$schemaIDGUID = @{}
Get-ADObject -SearchBase (Get-ADRootDSE).schemaNamingContext -LDAPFilter '(|(name=ms-Mcs-AdmPwdExpirationTime)(name=ms-Mcs-AdmPwd))' -Properties name, schemaIDGUID |
ForEach-Object {$schemaIDGUID.add([System.GUID]$_.schemaIDGUID,$_.name)}
<# **REPLACE DN VARIABLE BELOW**
Declare the distinguishedName of the Computer object directly or OU to search for computers within#>
$target = 'CN=Computers,DC=COMPANY,DC=NET'
##Get distinguished name of all Computer objects from the OU or of the target itself
$computers = Get-ADComputer -SearchBase $target -Filter {name -like '*'}
<#Get objects that have specific permissions on the target(s):
Full Control(GenericAll)
Read All Properties(GenericRead)
Write all Properties (WriteProperty where ObjectType = 00000000-0000-0000-0000-000000000000
#>
Set-Location ad:
foreach ($computer in $computers){
(Get-Acl $computer.distinguishedname).access |
Where-Object { (($_.AccessControlType -eq 'Allow') -and ($_.activedirectoryrights -in ('GenericRead','GenericAll') -and $_.inheritancetype -in ('All', 'None')) -or (($_.activedirectoryrights -like '*WriteProperty*')-or ($_.activedirectoryrights -like '*GenericRead*') -and ($_.objecttype -eq '00000000-0000-0000-0000-000000000000')))} |
ft ([string]$computer.name),identityreference, activedirectoryrights, objecttype, isinherited -autosize
}
<#Get objects that have specific permissions on the target(s) and specifically the LAPS attributes:
WriteProperty
ReadProperty
#>
Set-Location ad:
foreach ($computer in $computers){
(Get-Acl $computer.distinguishedname).access |
Where-Object {(($_.AccessControlType -eq 'Allow') -and (($_.activedirectoryrights -like '*WriteProperty*') -or ($_.activedirectoryrights -like '*ReadProperty*')) -and ($_.objecttype -in $schemaIDGUID.Keys))} |
ft ([string]$computer.name),identityreference, activedirectoryrights, objecttype, isinherited -AutoSize
}
安全提示:除了通过权限锁定这两个 LAPS 属性外,你还应该监控针对这些属性的 LDAP 流量,这样当权限配置不当允许攻击者查询时,你就能及时发现。 StealthDEFEND for Active Directory 可以对针对这些属性的 LDAP 流量提供实时告警。
观察 LAPS 的实际运行
通过 LAPS 获取特定终端当前的本地 Administrator 密码有几种方法,但最简单的方式是使用图形界面(GUI)。只需输入计算机名称,它就会显示明文的本地 Administrator 密码以及其到期日期,你可以对其进行修改。
或者,你也可以使用 PowerShell 获取这些信息:
借助 Netwrix Privilege Secure 弥补 Microsoft LAPS 的安全漏洞
Microsoft LAPS 是一款强大的解决方案,可在所有端点上管理本地 Administrator 密码。正确实施时,它是一种有效的方式,可以阻止某些潜在的横向移动或权限提升行为。不过不幸的是,如果未正确实施,它可能会为攻击者打开一个非常大的缺口。
LAPS 的安全漏洞包括以下内容:
- 过时的界面
- LAPS 不支持强身份验证和授权。
- LAPS 不提供 just-in-time access,因此管理员帐户始终容易被攻击者接管。
- 访问后没有强制重置密码,从而使攻击者能够使用被盗的密码。
- 用户始终必须知道帐户密码,这会带来运维和安全两方面的问题。
您可以使用 Netwrix Privilege Secure 来消除这些安全漏洞。 这款 privileged access management (PAM) solution 通过添加多级审批、just-in-time 和计划访问、强制密码轮换、对密码的可控披露,以及会话录制和回放等功能来增强 LAPS。
Netwrix Privilege Secure 的其他优势
大多数 PAM 解决方案只关注限制对高度特权账户的访问,例如 Domain Admin 和本地服务器 Administrator。虽然这种做法能为管理员提供按需的即时访问(just-in-time access),但所有这些强力账户即使在未使用时仍然保持可用状态——因此也就仍然存在被利用的风险。
Netwrix Privilege Secure 通过消除大多数此类“常驻(standing)”的特权账户,帮助您大幅缩减攻击面。取而代之的是,管理员只会在完成任务所需的确切时刻获得完成任务所需的精确权限级别,并且仅在所需的时间范围内获得权限。该方式还能让您减少需要成为 Domain Admins 成员的人数,从而进一步降低安全风险。此外,该解决方案会移除或尽可能减少那些经常被用来入侵账户的痕迹(artifacts)。
分享到
了解更多
关于作者
Kevin Joyce
产品管理总监
Netwrix 产品管理总监。Kevin 对网络安全充满热情,尤其致力于理解攻击者为利用组织环境所采用的策略与技术。凭借八年的产品管理经验,并专注于 Active Directory 和 Windows 安全,他将这种热情投入到帮助构建解决方案中,助力组织保护其身份、基础设施和数据。