Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

Active Directory 属性:Last Logon

Active Directory 属性:Last Logon

Nov 3, 2022

Active Directory 用户对象拥有多种登录元数据属性,这些属性对 Active Directory 的审计报表和管理非常有价值。例如,它们通常用于识别在较长时间内未活动的用户账户,或作为“stale”账户。

但是,每个登录元数据属性都有一些需要理解的独特行为。否则,组织最终可能会得到:充其量令人困惑的报表,甚至可能是不准确或具有误导性的报表。

Last-Logon 属性包含一个 Windows FileTime 格式,用于表示域控制器成功对用户进行身份验证的最后时间。它是用户登录元数据的“元老级”字段,自从最初版本的 Active Directory 出现以来就一直存在。

使用下面的 PowerShell 命令,你可以从域控制器中获取最后登录时间和其他用户属性:

      Get-ADUser -Filter * -Properties lastLogon | Select samaccountname, @{Name="lastLogon";Expression={[datetime]::FromFileTime($_.'lastLogon')}}
      

Last-Logon 属性会在域控制器成功处理某个登录请求时每次更新,因此它似乎提供了一种准确识别“过期”用户账户的完美方式。然而,这里有一个需要重点考虑的重大注意点。

AD Last-Logon 并不是一个会复制(replicated)的属性;每个域控制器(DCs)都会为任意特定用户维护该属性的自己的版本。该行为是有意为之的——为了让该属性在网络中的各个域控制器之间保持同步,所需要的复制流量激增将会非常巨大,尤其是在二十年前刚引入时更是如此。但这种行为也正是为什么在使用该属性来报告“过期”用户账户时,需要格外小心。

由于 Last-Logon 不会进行复制(域控制器不会交换这项信息),因此属性值只能在所查询的域控制器的上下文中进行解释。也就是说,该属性的值并不一定是用户最近一次登录的时间,而是指用户通过正在检查的域控制器成功完成身份验证的最近时间。类似地,属性值为 0 并不必然表示该用户从未登录过;这可能意味着返回该值的域控制器从未处理过该用户的登录请求。

简而言之,虽然可以使用 Last-Logon 属性来进行与登录相关的审计,但要生成准确的报告,需要查询每一台能够处理登录请求的域控制器,以便识别特定用户帐户中最近一次更新的值。或者,你也可以使用本文后面将讨论的第三方报表解决方案。

Last-Logon-Timestamp

Last-Logon-Timestamp 包含一个用于表示“用户最近一次登录到域的时间”的 Windows FileTime 格式。最近的 时间。该用户属性是在 Microsoft Windows Server 2003 中引入的。与较早的 Last-Logon 属性不同,Last-Logon-Timestamp 属性是一个复制属性;针对任何特定用户,其值都会同步到每一台域控制器。相较于 Last-Logon 属性,这是一个巨大的改进。这意味着识别“过期用户账户”的最佳方法就是使用 Last-Logon-Timestamp,对吗?不过,使用该属性也有自己的注意事项。

与 Last-Logon-Timestamp 属性相关的“坑点”在于:当域控制器成功处理登录请求时,它并不总是会立即更新。相反,该属性具有动态的更新频率,其更新间隔受 ms-DS-Logon-Time-Sync-Interval 属性的值限制。该属性默认是 NOT SET,并按 14 天来处理。该属性被更改的情况并不常见,但如果你想了解实际设置,你可以使用下面的 PowerShell 脚本轻松识别其真实值:

      $lastLogonReplicationInterval = (Get-ADDomain).LastLogonReplicationInterval
if( $lastLogonReplicationInterval )
{
    Write-Host "ms-DS-Logon-Time-Sync-Interval is set to $($lastLogonReplicationInterval) days"
}
else {
    Write-Host "ms-DS-Logon-Time-Sync-Interval is not set and will be treated as 14 days"
      

在采用默认 14 天最大更新时间边界(maximum update boundary)的域中,只有当域控制器成功处理一次登录请求,并且该属性(attribute)上次更新时间以来的时间间隔介于 9 到 14 天之间的某个值以上时,才会更新 Last-Logon-Timestamp。该时间间隔的差异源自用于控制更新时间频率的逻辑中包含的随机百分比(random percentage)。这种行为体现了两者之间的折中:一方面限制为保持该属性在网络中的各域控制器之间同步所必需的复制流量;另一方面也限制需要在大约相同时间更新了 Last-Logon-Timestamp 的大量用户,从而不得不复制这些用户的可能性。

下面是一个简化示例,用于说明控制 Last-Logon-Timestamp 属性更新时间频率的逻辑:

      (Current Datetime – Last-Logon-Timestamp) ? (ms-DS-Logon-Time-Sync-Interval – (Random % * 5 days))
      

在实际应用中,Last-Logon-Timestamp 属性将简化与登录相关的审计和报告。唯一值得关注的潜在问题涉及对非活动用户的报告。当用它来识别非活动用户时,“陈旧度(staleness)”的阈值需要比域的 ms-DS-Logon-Time-Sync-Interval 值再多出足够的时间,以确保复制(replication)已经能够传播任何有意义的更新。

LastLogonDate (PowerShell)

熟悉 PowerShell 的人可能会认识 LastLogonDate,但你在 Active Directory 中的任何位置都找不到它 全局编录(global catalog) 架构(schema)。这是因为 LastLogonDate 实际上是一个在本地计算的值,它会以更易读的格式显示 Last-Logon-Timestamp 属性的复制(replicated)值。毫不意外,LastLogonDate 既继承了 Last-Logon-Timestamp 属性的所有优点,也保留了所有缺点。不过,由于它不需要从 Windows DateTime 进行转换,因此在大多数与用户登录相关的审计报表中是最佳选择。

Active Directory 上次成功的交互式登录属性

属性 ms-DS-Last-Successful-Interactive-Logon-Time 在 Windows Server 2008 中引入,但由于默认处于禁用状态,很多人并不熟悉它。启用后,它会包含用户上次成功的交互式登录的日期和时间。尽管这看起来是一个非常有用的功能,但仍有一些令人信服的理由让它保持禁用,下面我会马上讲到。

如果你有实验环境,并希望对属性 ms-DS-Last-Successful-Interactive-Logon-Time 进行一些测试,可以启用以下项:计算机配置 ? 策略 ? 管理模板 ? Windows 组件 ? Windows 登录选项 ? 在用户登录期间显示有关以前登录的信息 的 GPO。然后强制执行 组策略更新。不要为了好玩而在生产域中启用此设置,否则你会度过一段糟糕的时光。

ms-DS-Last-Successful-Interactive-Logon-Time 属性的第一个问题是:只有在 交互式 登录被认证时,其值才会更新(可以把它理解为“Ctrl-Alt-Del” 登录)。这意味着诸如网络共享登录和 LDAP 认证等重要的认证活动将不会触发更新。因此,如果你使用该属性生成与登录相关的审计报告,得到的结果很可能会有些不准确。例如,识别处于非活动状态的用户帐户的报告,往往会列出域服务帐户——它们通常非常活跃,只是以非交互的方式活跃。简而言之,该属性确实让“过时用户”报告变得非常简单且可靠,但仅适用于用于交互式会话的用户帐户。

摘要

如果你需要生成 Active Directory log用于审计报告,最佳做法可能是汇总域控制器的事件日志并对其进行处理。虽然事件日志噪声极大,但它们同样非常可靠,并提供 Active Directory 无法提供的历史信息。

如果这不可行,请使用 LastLogonDate。或者更好的做法是,使用内置在 Active Directory PowerShell 模块中的 Search-ADAccount cmdlet 获取所需信息,并将其输出到 CSV 文件:

      Search-ADAccount -AccountInactive -DateTime ((Get-Date).AddDays(-30)) -UsersOnly | Select Name,LastLogonDate,DistinguishedName| Export-CSV c:psinactive_users.csv
      

Search-ADAccount cmdlet 实际上在幕后利用的是 LastLogonDate。其非活动(inactivity)期限默认是 15 天,在大多数环境中应该都没问题。上面的示例包含了将非活动期限覆盖为 30 天所需的语法。对于更喜欢系统化方法的用户,还有一些有用的免费工具,例如 Netwrix Inactive User Tracker,无需转换数值并分析 CSV 文件即可检索这些信息。

Netwrix 能为你提供哪些帮助?

在 Active Directory 中定期查看每个用户的 last logon date,可以帮助你的域管理员发现并移除那些“早已闲置(stale)”的账户——这些账户往往正是攻击者梦寐以求想要入侵和滥用的目标。 但这只是全面网络安全策略的一小部分。

Netwrix Active Directory Security Solution 提供详细信息,不仅包括每个 Active Directory 用户账户的最后登录时间,还涵盖 Active Directory 中的所有活动。其全面的预构建报表可简化 登录监控。特别是,“用户账户 – 最后登录时间”报表会列出所有用户账户(启用和禁用的账户均包含),并显示每个账户的最后登录时间。通过使用报表订阅功能,IT 管理员可以按其指定的时间表自动通过电子邮件接收报表,从而便于根据最佳实践进行定期审查,并帮助他们更高效地消除系统漏洞。

Netwrix Directory Manager

通过自动化的组管理简化并保障 AD

常见问题

Lastlogon 和 lastLogonTimeStamp 有什么区别?

与 Last-Logon 属性不同,Last-Logon-Timestamp 属性是一个复制(replicated)属性;因此,针对任何特定用户,其值都会同步到每一台域控制器。

lastLogonTimeStamp 如何计算?

Last-Logon-Timestamp(或 lastLogonTimeStamp)是在用户登录时由 DC 注册;但当某个域控制器成功处理登录请求时,该属性并不总会在所有 DC 上更新。

什么是交互式认证?

交互式认证是指当用户被提示输入其用户 ID 和密码以登录到设备的过程。交互式登录最常见的场景是 Windows 登录屏幕和 Windows 锁屏界面。



分享到

了解更多

关于作者

Asset Not Found

Joe Dibley

安全研究员

Netwrix 的安全研究员,并且是 Netwrix Security Research Team 的成员。Joe 是 Active Directory、Windows 以及各类企业软件平台与技术方面的专家;他/她研究新的安全风险、复杂的攻击技术,以及相应的缓解措施与检测方法。