Windows 凭据管理是操作系统从服务或用户接收凭据并保护该信息以供将来向身份验证目标呈现的过程。对于加入域的计算机,身份验证目标是域控制器。身份验证中使用的凭据是将用户身份与某种形式的真实性证明(例如证书、密码或 PIN)相关联的数字文档。
默认情况下,Windows 凭据通过 WinLogon 服务针对本地计算机上的安全帐户管理器 (SAM) 数据库或加入域的计算机上的 Active Directory 进行验证。凭据通过用户在登录用户界面上的输入收集或通过 API 编码以呈现给身份验证目标。
本地安全信息存储在注册表中的HKEY_LOCAL_MACHINE\SECURITY 下。存储的信息包括策略设置、默认安全值和帐户信息,例如缓存的登录凭据。SAM 的副本也存储在这里。前面我们也学习过了。
下图显示了所需的组件以及凭据通过系统对用户或进程进行身份验证以成功登录所采用的路径。
Winlogon.exe 是负责管理安全用户交互的可执行文件。Winlogon 服务通过 Secur32.dll 将用户在安全桌面 (Logon UI) 上的操作收集的凭据传递给本地安全机构 (LSA),从而启动 Windows 操作系统的登录过程。
不需要交互式登录的应用程序或服务登录。大多数由用户启动的进程使用 Secur32.dll 在用户模式下运行,而在启动时启动的进程(例如服务)使用 Ksecdd.sys 在内核模式下运行。
构成身份验证过程基础的多个身份验证提供程序。
LSA 服务器服务,它既执行安全策略又充当 LSA 的安全包管理器。LSA 包含协商功能,它在确定哪种协议将成功后选择 NTLM 或 Kerberos 协议。
一组可以单独调用一个或多个身份验证协议的提供程序。默认提供程序集可以随每个版本的 Windows 更改,并且可以编写自定义提供程序。
Net Logon 服务执行的一些服务包括:
维护计算机到域控制器的安全通道(并不是 Schannel )。
通过安全通道将用户的凭据传递给域控制器,并返回用户的域 SID 和用户权限。
在域名系统 (DNS) 中发布服务资源记录,并使用 DNS 将名称解析为域控制器的 Internet 协议 (IP) 地址。
实现基于远程过程调用 (RPC) 的复制协议,用于同步主域控制器 (PDC) 和备份域控制器 (BDC)。
安全帐户管理器 (SAM) 存储本地安全帐户、强制执行本地存储的策略并支持 API。
包含 SAM 数据库的副本、本地安全策略设置、默认安全值和只能由系统访问的帐户信息。
Windows 中存在两种用于凭据输入的体系结构。
图形标识和身份验证 (GINA) 体系结构(Windows Server 2008 和 Windows Vista)
凭据提供程序模型
GINA 架构适用于 Windows Server 2003、Windows 2000 Server、Windows XP 和 Windows 2000 Professional 操作系统。在这些系统中,每个交互式登录会话都会创建一个单独的 Winlogon 服务实例。GINA 架构被加载到 Winlogon 使用的进程空间,接收和处理凭据,并通过 LSALogonUser 调用身份验证接口。
用于交互式登录的 Winlogon 实例在session 0 中运行。session 0 承载系统服务和其他关键进程,包括本地安全机构 (LSA) 进程。
使用凭据提供程序架构,Winlogon 总是在收到 SAS 事件后启动登录 UI。登录 UI 向每个凭据提供程序查询该提供程序配置为枚举的不同凭据类型的数量。
凭据提供程序可以选择将这些磁贴之一指定为默认值。在所有提供程序枚举其磁贴后,登录 UI 将它们显示给用户。用户与磁贴交互以提供他们的凭据。登录 UI 提交这些凭据以进行身份验证。
结合支持的硬件,凭据提供程序可以扩展 Windows,使用户能够通过生物识别(指纹、视网膜或语音识别)、密码、PIN 和智能卡证书或第三方开发人员创建的任何自定义身份验证包和架构登录. 可以为所有域用户开发和部署自定义身份验证机制,并明确要求用户使用此自定义登录机制。
凭据提供程序不是强制机制。它们用于收集和序列化凭据。本地权限和身份验证包强制执行安全性。
凭据提供程序可以设计为支持单点登录 (SSO)、向安全网络访问点(利用 RADIUS 和其他技术)验证用户以及机器登录。凭据提供程序还旨在支持特定于应用程序的凭据收集,并可用于对网络资源进行身份验证、将计算机加入域或为用户帐户控制 (UAC) 提供管理员同意。
凭证提供者在计算机上注册并负责以下事项:
描述身份验证所需的凭据信息。
处理与外部身份验证机构的通信和逻辑。
交互式和网络登录的打包凭据。
单点登录提供程序 (SSO) 可以开发为标准凭据提供程序或登录前访问提供程序。
每个版本的 Windows 都包含一个默认凭据提供程序和一个默认登录前访问提供程序 (PLAP)。
登录前访问提供程序 (PLAP) 允许用户在登录到本地计算机之前连接到网络。实现此提供程序时,提供程序将不会在登录 UI 上枚举磁贴。用户只有在点击 PLAP 按钮后才能看到它们。然后通过 Pre-Logon-Access Provider 屏幕处理登录。
PLAP 用于以下场景:
网络身份验证和计算机登录由不同的凭据提供程序处理。这种情况的变化包括:
用户可以选择连接到网络(例如在登录到机器之前连接到虚拟专用网络 (VPN)),但不需要进行此连接。
需要网络身份验证才能在本地计算机上检索交互式身份验证期间使用的信息。
多个网络身份验证之后是其他场景之一。例如,用户向 ISP 进行身份验证,然后向 VPN 进行身份验证,然后使用其用户帐户凭据在本地登录。
缓存凭据被禁用,并且在本地登录之前需要 RAS/VPN 连接来验证用户。
域用户没有在加入域的计算机上设置本地帐户,并且必须在完成交互式登录之前建立 RAS/VPN 连接。
网络身份验证和计算机登录由同一凭据提供程序处理。在这种情况下,用户需要在登录到计算机之前连接到网络。
Windows 身份验证旨在管理不需要用户交互的应用程序或服务的凭据。用户模式下的应用程序在它们可以访问的系统资源方面受到限制,而服务可以不受限制地访问系统内存和外部设备。
系统服务和传输级应用程序通过安全支持提供程序接口 (SSPI) 访问安全支持提供程序 (SSP),该接口提供用于枚举系统上可用的安全包、选择一个包以及使用该包获取经过身份验证的安全包的功能。
当客户端/服务器连接通过身份验证时:
连接客户端的应用程序使用 SSPI 函数将凭据发送到服务器InitializeSecurityContext (General)。
连接服务器端的应用程序使用 SSPI 函数进行响应AcceptSecurityContext (General)。
SSPI 运行InitializeSecurityContext (General)并AcceptSecurityContext (General)重复,直到所有必要的身份验证消息都已交换为成功或失败身份验证。
连接经过身份验证后,服务器上的 LSA 使用来自客户端的信息来构建安全上下文,其中包含访问令牌。
然后,服务器可以调用 SSPI 函数ImpersonateSecurityContext将访问令牌附加到服务的模拟线程。
Windows 中的用户模式由两个能够将 I/O 请求传递给适当的内核模式软件驱动程序的系统组成:环境系统,运行为许多不同类型的操作系统编写的应用程序,以及集成系统,运行特定于系统的代表环境系统运行。
集成系统代表环境系统管理特定于操作系统的功能,并由安全系统进程 (LSA)、工作站服务和服务器服务组成。安全系统进程处理安全令牌;根据资源权限授予或拒绝对用户帐户的访问;处理登录请求并发起登录认证;并确定操作系统需要审核哪些系统资源。
应用程序可以在用户模式下运行,它可以作为任何主体运行,包括在本地系统 (SYSTEM) 的安全上下文中。应用程序还可以在内核模式下运行,它可以在本地系统 (SYSTEM) 的安全上下文中运行。
SSPI 可通过 Secur32.dll 模块获得,Secur32.dll 模块是一个 API,用于获取用于身份验证、消息完整性和消息隐私的集成安全服务。它在应用层协议和安全协议之间提供了一个抽象层。由于不同的应用程序需要不同的方式来识别或验证用户以及在数据通过网络传输时加密数据的不同方式,因此 SSPI 提供了一种访问包含不同身份验证和加密功能的动态链接库 (DLL) 的方法。这些 DLL 称为安全支持提供程序 (SSP)。
Windows Server 2008 R2 和 Windows 7 中引入了托管服务帐户和虚拟帐户,以便为 SQL Server 和 IIS 等关键应用程序提供各自域帐户的隔离,同时消除管理员手动管理服务主体的需要这些帐户的名称 (SPN) 和凭据。
尽管大多数 Windows 应用程序在启动它们的用户的安全上下文中运行,但服务并非如此。许多 Windows 服务,例如网络和打印服务,都是在用户启动计算机时由服务控制器启动的。这些服务可能作为本地服务或本地系统运行,并且可能在最后一个人类用户注销后继续运行。
在启动服务之前,服务控制器使用为服务指定的帐户登录,并提供服务的凭据以供 LSA 进行身份验证。(Windows 服务实现了一个编程接口,服务控制器管理器可以使用它来控制服务。Windows 服务可以在系统启动时自动启动,也可以通过服务控制程序手动启动。)例如,当 Windows 客户端计算机加入时域,计算机上的信使服务连接到域控制器并为其打开安全通道。要获得经过身份验证的连接,该服务必须具有远程计算机的本地安全机构 (LSA) 信任的凭据。当与网络中的其他计算机通信时,LSA 使用本地计算机域帐户的凭据,与在本地系统和网络服务的安全上下文中运行的所有其他服务一样。本地计算机上的服务以 SYSTEM 身份运行,因此不需要向 LSA 提供凭据。
文件 Ksecdd.sys 管理和加密这些凭据,并使用本地过程调用进入 LSA。文件类型为 DRV(驱动程序),称为内核模式安全支持提供程序 (SSP),在 Windows Server 2008 R2、Windows Server 2008、Windows 7 和 Windows Vista 中,符合 FIPS 140-2 级别 1。
内核模式可以完全访问计算机的硬件和系统资源。内核模式阻止用户模式服务和应用程序访问它们不应该访问的操作系统的关键区域。
本地安全机构 (LSA) 是一个受保护的系统进程,它对用户进行身份验证并将其登录到本地计算机。此外,LSA 维护有关计算机本地安全的所有方面的信息(这些方面统称为本地安全策略),并为名称和安全标识符 (SID) 之间的转换提供各种服务。安全系统进程会跟踪在计算机系统上生效的安全策略和帐户。
本地安全机构子系统服务 (LSASS) 代表具有活动 Windows 会话的用户将凭据存储在内存中。这允许用户无缝访问网络资源,例如文件共享、Exchange Server 邮箱和 SharePoint 站点,而无需为每个远程服务重新输入其凭据。
LSASS 可以多种形式存储凭证,包括:
可逆加密明文
Kerberos 票证(TGT、服务票证)
NT 哈希
LM哈希
如果用户使用智能卡登录 Windows,LSASS 不会存储明文密码,但会存储帐户对应的 NT 哈希值和智能卡的明文 PIN。如果为交互式登录所需的智能卡启用了帐户属性,则会为帐户自动生成随机 NT 哈希值,而不是原始密码哈希。设置属性时自动生成的密码哈希不会改变。
如果用户使用与 LM 哈希兼容的密码登录 Windows,则此身份验证器将存在于内存中。
从 Windows Server 2008 R2 和 Windows 7 开始,即使禁用需要它们的凭据提供程序,也无法禁用内存中纯文本凭据的存储。
存储的凭据直接与自上次重新启动以来已启动且尚未关闭的 LSASS 登录会话相关联。例如,当用户执行以下任一操作时,会创建具有存储的 LSA 凭据的 LSA 会话:
登录到计算机上的本地会话或 RDP 会话
使用
RunAs
选项运行任务
在计算机上运行活动的 Windows 服务
运行计划任务或批处理作业
使用远程管理工具在本地计算机上运行任务
本地安全机构 (LSA) 机密是仅可由 SYSTEM 帐户进程访问的机密数据。其中一些机密是重新启动后必须保留的凭据,它们以加密形式存储在硬盘驱动器上。存储为 LSA 机密的凭据可能包括:
计算机 AD DS 帐户的帐户密码
在计算机上配置的 Windows 服务的帐户密码
已配置计划任务的帐户密码
IIS 应用程序池和网站的帐户密码
安全帐户管理器 (SAM) 是一个存储本地用户帐户和组的数据库。它存在于每个 Windows 操作系统中;但是,当计算机加入域时,Active Directory 会管理 Active Directory 域中的域帐户。
例如,即使没有人类用户登录,运行 Windows 的客户端计算机也会通过与域控制器通信来参与网络域。要启动通信,计算机必须在域中有一个活动帐户。在接受来自计算机的通信之前,域控制器上的 LSA 会验证计算机的身份,然后像对人类安全主体一样构建计算机的安全上下文。此安全上下文定义特定计算机上的用户或服务或网络上的用户、服务或计算机的身份和功能。例如,包含在安全上下文中的访问令牌定义了可以访问的资源(例如文件共享或打印机)以及该主体可以执行的操作(例如读取、写入或修改)——用户,
用户或计算机的安全上下文可能因一台计算机而异,例如当用户登录到用户自己的主工作站以外的服务器或工作站时。它也可能因一个会话而异,例如当管理员修改用户的权限时。此外,当用户或计算机在独立基础上、在网络中或作为 Active Directory 域的一部分运行时,安全上下文通常是不同的。
SAM 数据库作为文件存储在本地硬盘驱动器上,它是每台 Windows 计算机上本地帐户的权威凭据存储。此数据库包含该特定计算机本地的所有凭据,包括该计算机的内置本地管理员帐户和任何其他本地帐户。
SAM 数据库存储有关每个帐户的信息,包括用户名和 NT 密码哈希。默认情况下,SAM 数据库不会在当前版本的 Windows 上存储 LM 哈希。SAM 数据库中永远不会存储密码——只有密码哈希值。NT 密码哈希是帐户密码的未加盐的 MD4 哈希。这意味着如果两个帐户使用相同的密码,它们也将具有相同的 NT 密码哈希。
当两个域之间存在信任时,每个域的身份验证机制依赖于来自另一个域的身份验证的有效性。通过验证传入的身份验证请求来自受信任的机构(受信任域),信任有助于提供对资源域(信任域)中共享资源的受控访问。通过这种方式,信任充当桥梁,仅允许经过验证的身份验证请求在域之间传输。
特定信任如何传递身份验证请求取决于它的配置方式。信任关系可以是单向的,提供从受信任域到信任域中的资源的访问,或者双向的,提供从每个域到另一个域中的资源的访问。信任也是不可传递的,在这种情况下,信任只存在于两个信任伙伴域之间,或者是可传递的,在这种情况下,信任会自动扩展到任何一个伙伴信任的其他域。
验证机制依赖于登录时提供的凭据。但是,当计算机与域控制器断开连接并且用户提供域凭据时,Windows 会在验证机制中使用缓存凭据的过程。
每次用户登录到域时,Windows 都会缓存提供的凭据并将它们存储在操作系统的安全配置单元中。缓存的凭据是 NT 散列的函数,因为散列凭据使用用户名进行加盐并再次散列。
使用缓存凭据,用户可以登录到域成员,而无需连接到该域中的域控制器。
当用户或服务想要访问计算资源时,他们必须提供证明其身份的信息。他们的身份通常采用其帐户用户名的形式。这可能是作为安全帐户管理器 (SAM) 帐户名或用户主体名称 (UPN) 的用户名。但是为了证明他们的身份,他们必须提供秘密信息,这被称为身份验证器。身份验证器可以采用各种形式,具体取决于身份验证协议和方法。身份和身份验证器的组合称为身份验证凭据。
创建、提交和验证凭据的过程被简单地描述为身份验证,它通过各种身份验证协议(例如 Kerberos 协议)实现。身份验证建立用户的身份,但不一定是用户访问或更改特定计算资源的权限。该过程称为授权。
凭据通常被创建或转换为计算机上可用的身份验证协议所需的形式。凭据可以存储在本地安全机构子系统服务 (LSASS) 进程内存中,供帐户在会话期间使用。凭据还必须存储在权威数据库(例如 SAM 数据库)和 Active Directory 域服务 (AD DS) 使用的数据库中的硬盘驱动器上。
当用户登录到运行 Windows 的计算机并提供用户名和凭据(例如密码或 PIN)时,信息将以明文形式提供给计算机。此明文密码用于通过将其转换为身份验证协议所需的形式来验证用户身份。某些版本的 Windows 还保留了此密码的加密副本,可以将其未加密为明文以用于身份验证方法,例如摘要式身份验证。
Windows 操作系统从不在内存或硬盘驱动器上存储任何纯文本凭据。只有可逆加密的凭据存储在那里。当以后需要访问凭据的明文形式时,Windows 以加密形式存储密码,只能由操作系统解密以在授权情况下提供访问。
密码的 NT 哈希是使用未加盐的 MD4 哈希算法计算的。MD4 是一种加密单向函数,可生成密码的数学表示。此散列函数旨在始终从相同的密码输入中产生相同的结果,并最大限度地减少两个不同密码可能产生相同结果的冲突。这个散列总是相同的长度,不能直接解密以显示明文密码。由于 NT 散列仅在密码更改时更改,因此在用户密码更改之前,NT 散列对于身份验证是有效的。
LAN Manager (LM) 哈希值源自用户密码。对 LM 哈希和 LAN Manager 身份验证协议的旧支持保留在 NTLM 协议套件中。Windows 中的默认配置和 Microsoft 安全指南不鼓励使用它。
LM 哈希本身更容易受到攻击,因为:
LM 哈希要求密码长度少于 15 个字符,并且它们仅包含 ASCII 字符。
LM 哈希不区分大写和小写字母。
侵权请私聊公众号删文
热文推荐