Windows 可执行文件认证
Windows Executable File Authentication
搜索 windows 身份验证方法和协议后,我决定先了解一个简单的可执行文件中使用的协商、Kerberos 和 NTLM 之间的确切区别,然后再将其与 IIS 和 Web 身份验证相结合。
我取得了不错的结果,但我仍然需要有关协商和 Kerberos 的更多详细信息。
我有以下场景:
我创建了非常简单的 C# windows 表单应用程序,它显示了一个消息框并显示了以下值:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
请注意,我是在本地计算机上具有管理员权限的域用户,我得到以下结果:
当我 运行 exe 文件(双击)时,当我主动连接到 DC 时,我得到 "Negotiate".
当我 运行 exe 文件(运行 作为 differnet 用户/使用本地用户)时,当我主动连接到 DC 时,我得到 "NTLM".
当我 运行 使用 "Run as Administrator" 或 "Run as Different User" 的 exe 文件时,我得到 "Kerberos".
当我使用本地帐户在本地登录时 运行 exe 文件,我得到 "NTLM".
我了解 LSA 将对本地帐户使用 NTLM。我还了解到 Active Directory 使用 Kerberos 来验证域用户和计算机。
我的问题是,当我 运行 通过(双击)或 "run as different user" 使用我的同一帐户 ?
更新:我注意到以下几点:
- 如果 local user 是 运行ning exe 那么它是 NTLM
- 如果 domain user 运行 exe 那么它是 Negotiate (如果该用户是本地管理员)但是 Kerberos(如果该用户不是本地管理员)
- 如果 domain admin 运行 exe 那么它是 Kerberos
我只是澄清一下这种行为。
首先,(您在问题中似乎理解了这一点,但只是为了清楚起见)EXE 没有任何身份验证 - 它只是一个可执行文件。 OS creates a process object 在主体标识的登录会话中执行它。正是这个主体已经通过 NTLM 或 Kerberos(或其他一些协议)的身份验证。
接下来,协商意味着在创建登录会话时 Negotiate authentication package 用于决定将使用哪个身份验证包 - Kerberos 或 NTLM。
当您查询 WindowsIdentity.AuthenticationType
值时,您最终会调用本地安全机构 (LSA) 中名为 LsaGetLogonSessionData
的函数。这会报告用于 运行 您正在执行的进程的登录会话的详细信息。创建此登录会话的方式可能对用于验证凭据的身份验证包影响最大。
When logging into Windows the first time, Winlogon.exe establishes an interactive logon by calling LsaLogonUser. It queries the authentication packages in HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages
in order until it finds one that can authenticate the given credentials. Once an interactive logon has been established, you can create new processes using noninteractive logons under different credentials, and in this case, the LogonUser
函数可能被调用。此函数的参数之一是 dwLogonProvider
,它具有以下默认值(可能是使用的那个):
LOGON32_PROVIDER_DEFAULT
Use the standard logon provider for the system.
The default security provider is negotiate, unless you pass NULL
for the domain name and the user name is not in UPN format.
In this case, the default provider is NTLM.
因此,根据登录会话的创建方式,运行正在下为登录会话报告的程序包。 (从你的问题中不清楚你是如何创建你正在测试的登录会话的......在所有情况下都做"Run As"?在某些情况下注销/登录Windows?)它还取决于哪个程序包 Winlogon 能够成功地首先通过交互式登录会话进行身份验证。不过,最终,请注意身份验证机制都会调用一些身份验证包,如果使用协商,则首选 Kerberos,尽管报告的是协商。
这是一个旧的但仍然相关的图表,它显示了所有身份验证如何在 Windows 中组合在一起:
搜索 windows 身份验证方法和协议后,我决定先了解一个简单的可执行文件中使用的协商、Kerberos 和 NTLM 之间的确切区别,然后再将其与 IIS 和 Web 身份验证相结合。
我取得了不错的结果,但我仍然需要有关协商和 Kerberos 的更多详细信息。
我有以下场景:
我创建了非常简单的 C# windows 表单应用程序,它显示了一个消息框并显示了以下值:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
请注意,我是在本地计算机上具有管理员权限的域用户,我得到以下结果:
当我 运行 exe 文件(双击)时,当我主动连接到 DC 时,我得到 "Negotiate".
当我 运行 exe 文件(运行 作为 differnet 用户/使用本地用户)时,当我主动连接到 DC 时,我得到 "NTLM".
当我 运行 使用 "Run as Administrator" 或 "Run as Different User" 的 exe 文件时,我得到 "Kerberos".
当我使用本地帐户在本地登录时 运行 exe 文件,我得到 "NTLM".
我了解 LSA 将对本地帐户使用 NTLM。我还了解到 Active Directory 使用 Kerberos 来验证域用户和计算机。
我的问题是,当我 运行 通过(双击)或 "run as different user" 使用我的同一帐户 ?
更新:我注意到以下几点:
- 如果 local user 是 运行ning exe 那么它是 NTLM
- 如果 domain user 运行 exe 那么它是 Negotiate (如果该用户是本地管理员)但是 Kerberos(如果该用户不是本地管理员)
- 如果 domain admin 运行 exe 那么它是 Kerberos
我只是澄清一下这种行为。
首先,(您在问题中似乎理解了这一点,但只是为了清楚起见)EXE 没有任何身份验证 - 它只是一个可执行文件。 OS creates a process object 在主体标识的登录会话中执行它。正是这个主体已经通过 NTLM 或 Kerberos(或其他一些协议)的身份验证。
接下来,协商意味着在创建登录会话时 Negotiate authentication package 用于决定将使用哪个身份验证包 - Kerberos 或 NTLM。
当您查询 WindowsIdentity.AuthenticationType
值时,您最终会调用本地安全机构 (LSA) 中名为 LsaGetLogonSessionData
的函数。这会报告用于 运行 您正在执行的进程的登录会话的详细信息。创建此登录会话的方式可能对用于验证凭据的身份验证包影响最大。
When logging into Windows the first time, Winlogon.exe establishes an interactive logon by calling LsaLogonUser. It queries the authentication packages in HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages
in order until it finds one that can authenticate the given credentials. Once an interactive logon has been established, you can create new processes using noninteractive logons under different credentials, and in this case, the LogonUser
函数可能被调用。此函数的参数之一是 dwLogonProvider
,它具有以下默认值(可能是使用的那个):
LOGON32_PROVIDER_DEFAULT
Use the standard logon provider for the system.
The default security provider is negotiate, unless you pass NULL
for the domain name and the user name is not in UPN format.
In this case, the default provider is NTLM.
因此,根据登录会话的创建方式,运行正在下为登录会话报告的程序包。 (从你的问题中不清楚你是如何创建你正在测试的登录会话的......在所有情况下都做"Run As"?在某些情况下注销/登录Windows?)它还取决于哪个程序包 Winlogon 能够成功地首先通过交互式登录会话进行身份验证。不过,最终,请注意身份验证机制都会调用一些身份验证包,如果使用协商,则首选 Kerberos,尽管报告的是协商。
这是一个旧的但仍然相关的图表,它显示了所有身份验证如何在 Windows 中组合在一起: