![没有 NTLM 的远程桌面身份验证 - 如何从非 Windows 客户端进行配置?](https://linux22.com/image/751212/%E6%B2%A1%E6%9C%89%20NTLM%20%E7%9A%84%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%20-%20%E5%A6%82%E4%BD%95%E4%BB%8E%E9%9D%9E%20Windows%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE%EF%BC%9F.png)
背景
这个问题困扰了我好久了(在网上搜索了好多也没找到合适的解决办法),所以我希望有人能给我一些明智的建议。当我尝试使用微软最新的远程桌面客户端(目前是 v10.3.9)从 Mac 启动到加入 Windows 域的 PC 的远程桌面会话时,我经常会收到以下屏幕截图中的错误。
我们无法连接到远程 PC。这可能是由于密码过期。如果这种情况持续发生,请联系您的网络管理员寻求帮助。
错误代码:0x207
如果我尝试使用本机 Windows 远程桌面客户端从 Windows PC 远程访问同一台 PC,则不会出现此错误,并且可以正常连接。这特定于非 Windows 客户端。
总结
有没有办法可以让非 Windows 客户端通过远程桌面连接到已加入域的 Windows PC,而无需为每台目标 PC 进行 NTLM 身份验证例外?Kerberos 似乎不适用于 Mac RDP 客户端,是否有其他受支持的身份验证机制?
RDP 服务器上的 GPO 设置和事件日志
加入域的目标 PC(RDP 服务器)已应用许多 GPO。我认为所有相关设置如下gpresult
:
- 计算机设置 > 策略 > 管理模板
- 网络/网络连接/Windows Defender 防火墙/域配置文件:
- Windows Defender 防火墙:允许本地端口例外:已启用
- Windows Defender 防火墙:定义的入站端口例外:3389:TCP:[IP 地址]:已启用:远程桌面连接
- 系统/凭证委托
- 远程主机允许委派不可导出的凭据:已启用
- Windows 组件/远程桌面服务/远程桌面会话主机/连接
- 允许用户使用远程桌面服务进行远程连接:已启用
- Windows 组件/远程桌面服务/远程桌面会话主机/安全
- 连接时始终提示输入密码:已启用
- 需要安全的 RPC 通信:已启用
- 要求使用网络级别身份验证对远程连接进行用户身份验证:已启用
- 设置客户端连接加密级别:已启用。加密级别:高级别
- 网络/网络连接/Windows Defender 防火墙/域配置文件:
lusrmgr.msc
使用MMC 管理单元将需要远程访问的用户添加到相应远程桌面 PC 的用户组“远程桌面用户” 。
如果我尝试从非 Windows 客户端登录,从而收到上述错误,则 RDP 服务器上的安全日志将显示失败的登录事件,ID 4625:-
Log Name: Security
Source: Microsoft-Windows-Security-Auditing
Date: <Date> <Time>
Event ID: 4625
Task Category: Logon
Level: Information
Keywords: Audit Failure
User: N/A
Computer: <RDP Host>
Description:
An account failed to log on.
Subject:
Security ID: NULL SID
Account Name: -
Account Domain: -
Logon ID: 0x0
Logon Type: 3
Account For Which Logon Failed:
Security ID: NULL SID
Account Name: <User Name>
Account Domain: <Domain Name>
Failure Information:
Failure Reason: An Error occured during Logon.
Status: 0x80090302
Sub Status: 0xC0000418
Process Information:
Caller Process ID: 0x0
Caller Process Name: -
Network Information:
Workstation Name: <RDP PC FQDN>
Source Network Address: <RDP PC IP Address>
Source Port: 0
Detailed Authentication Information:
Logon Process: NtLmSsp
Authentication Package: NTLM
Transited Services: -
Package Name (NTLM only): -
Key Length: 0
域控制器上的 GPO 设置和事件日志
因此,看起来使用 NTLM 身份验证的网络登录失败。根据各种安全最佳实践和建议,我尝试通过将以下组策略应用于域控制器来禁用域中的 NTLM 身份验证,使用Default Domain Controllers Policy
:-
- 计算机配置 > 策略 > Windows 设置 > 安全设置 > 本地策略 > 安全选项
- 网络安全:LAN Manager 身份验证级别:仅发送 NTLMv2 响应。拒绝 LM 和 NTLM
- 网络安全:限制 NTLM:此域中的 NTLM 身份验证:拒绝域帐户到域服务器。
- 网络安全:限制 NTLM:审核传入 NTLM 流量:为所有帐户启用审核
在域控制器上,我在“应用程序和服务日志”>“Microsoft”>“Windows”>“NTLM”>“操作”下有一个与失败的 NTLM 身份验证请求相对应的日志事件:-
Log Name: Microsoft-Windows-NTLM/Operational
Source: Microsoft-Windows-Security-Netlogon
Date: <Date> <Time>
Event ID: 4004
Task Category: Blocking NTLM
Level: Warning
Keywords:
User: SYSTEM
Computer: <DC FQDN>
Description:
Domain Controller Blocked: NTLM authentication to this domain controller is blocked.
Secure Channel name: <RDP PC FQDN>
User name: <User Name>
Domain name: <Domain>
Workstation name: <RDP PC FQDN>
Secure Channel type: 2
NTLM authentication within the domain <Domain> is blocked.
If you want to allow NTLM authentication requests in the domain <Domain>, set the security policy Network Security: Restrict NTLM: NTLM authentication in this domain to Disabled.
If you want to allow NTLM authentication requests only to specific servers in the domain ms-rtc, set the security policy Network Security: Restrict NTLM: NTLM authentication in this domain to Deny for domain servers or Deny domain accounts to domain servers, and then set the security policy Network Security: Restrict NTLM: Add server exceptions in this domain to define a list of servers in this domain as an exception to use NTLM authentication.
解决方法
因此,我知道允许从非 Windows 客户端远程桌面访问 PC 的唯一方法是将该 PC 的 FQDN 添加到默认域控制器策略中,具体位置如下:-
- 计算机配置 > 策略 > Windows 设置 > 安全设置 > 本地策略 > 安全选项
- 网络安全:限制 NTLM:在此域中添加服务器例外:
PS 只是想了一下,还没有提到证书。我已经部署了内部 PKI,并且还通过 GPO 自动部署了 RDP 证书。在客户端,系统会提示我是否信任该证书,在我选择“接受信任证书”,然后输入我的域\用户名和密码后,会出现 0x207。如上所述,如果列出了 NTLM 例外,我可以连接,如果服务器未列为例外,则登录将失败。
编辑1
作为 Mac 上 Microsoft RDP 客户端的替代品,我尝试了另一个名为freerdp
,安装有brew install freerdp
。这也无法登录任何未明确启用 NTLM 的 PC,但会给出比 Microsoft 客户端更详细的错误消息,尤其是在将日志级别设置为 的情况下TRACE
。我不确定它是否支持 Kerberos、CredSSP 或类似功能,但也许这些附加信息可能会有用:-
$ xfreerdp /log-level:TRACE /d:<DOMAIN> /u:<User Name> /v:<RDP Host FQDN>
[17:24:38:242] [4547:0ff48000] [DEBUG][com.freerdp.channels.cliprdr.client] - VirtualChannelEntryEx
[17:24:38:243] [4547:0ff48000] [INFO][com.freerdp.client.common.cmdline] - loading channelEx cliprdr
[17:24:38:261] [4547:0ff48000] [INFO][com.freerdp.client.x11] - Property 296 does not exist
[17:24:38:262] [4547:0ff48000] [DEBUG][com.freerdp.client.x11] - Searching for XInput pointer device
[17:24:38:263] [4547:0ff48000] [DEBUG][com.freerdp.client.x11] - Pointer device: 6
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Enabling security layer negotiation: TRUE
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Enabling restricted admin mode: FALSE
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Enabling RDP security: TRUE
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Enabling TLS security: TRUE
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Enabling NLA security: TRUE
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Enabling NLA extended security: FALSE
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - state: NEGO_STATE_NLA
[17:24:38:270] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Attempting NLA security
[17:24:38:272] [4547:0ff48000] [DEBUG][com.freerdp.core] - connecting to peer <RDP Host IP>
[17:24:38:277] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - RequestedProtocols: 3
[17:24:38:394] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - RDP_NEG_RSP
[17:24:38:394] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - selected_protocol: 2
[17:24:38:394] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - state: NEGO_STATE_FINAL
[17:24:38:394] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - Negotiated NLA security
[17:24:38:394] [4547:0ff48000] [DEBUG][com.freerdp.core.nego] - nego_security_connect with PROTOCOL_NLA
[17:24:38:622] [4547:0ff48000] [DEBUG][com.winpr.utils] - Could not open SAM file!
Password: ***
[17:24:42:365] [4547:0ff48000] [DEBUG][com.winpr.sspi] - InitSecurityInterfaceExA
[17:24:42:365] [4547:0ff48000] [DEBUG][com.freerdp.core.nla] - nla_client_init 348 : packageName=Negotiate ; cbMaxToken=12256
[17:24:42:366] [4547:0ff48000] [TRACE][com.freerdp.core.nla] - InitializeSecurityContext status SEC_I_CONTINUE_NEEDED [0x00090312]
[17:24:42:366] [4547:0ff48000] [DEBUG][com.freerdp.core.nla] - Sending Authentication Token
[17:24:42:366] [4547:0ff48000] [DEBUG][com.freerdp.core.nla] - 0000 <some hex numbers> NTLMSSP.........
[17:24:42:366] [4547:0ff48000] [DEBUG][com.freerdp.core.nla] - 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[17:24:42:366] [4547:0ff48000] [DEBUG][com.freerdp.core.nla] - 0020 06 01 b1 1d 00 00 00 0f ........
[17:24:42:371] [4547:0ff48000] [DEBUG][com.freerdp.core.nla] - CredSSP protocol support 6, peer supports 6
[17:24:42:371] [4547:0ff48000] [ERROR][com.freerdp.core.nla] - SPNEGO failed with NTSTATUS: 0x80090302
[17:24:42:371] [4547:0ff48000] [ERROR][com.freerdp.core] - freerdp_set_last_error ERRCONNECT_AUTHENTICATION_FAILED [0x00020009]
[17:24:42:371] [4547:0ff48000] [ERROR][com.freerdp.core.rdp] - rdp_recv_callback: CONNECTION_STATE_NLA - nla_recv_pdu() fail
[17:24:42:371] [4547:0ff48000] [ERROR][com.freerdp.core.transport] - transport_check_fds: transport->ReceiveCallback() - -1
[17:24:42:371] [4547:0ff48000] [DEBUG][com.freerdp.core.rdp] - transport_check_fds() - -1
答案1
策略“网络安全:限制 NTLM:此域中的 NTLM 身份验证:拒绝域帐户与域服务器的通信”正在限制与域服务器的 NTLM 连接。如果您想通过不支持 Kerberos 的客户端连接到域,则必须禁用此策略,或者尝试使用选项“拒绝域帐户”。另一个潜在问题是您已打开 NLA(网络级身份验证)。尝试将其关闭并重试。
答案2
使用文本编辑器编辑远程桌面连接文件(Windows 上为 .rdp)并添加以下行:
enablecredsspsupport:i:0
我必须这样做才能从 Linux Mint 17 登录到 Windows 10 PC。事实上,我也必须这样做才能登录从附加到不同 AD 域的 Windows 10。
答案3
这里发生了几件事:
- 为了在非 Windows 机器上使用 Kerberos 身份验证,您需要专门进行设置。这里有一个很好的指南(不同的目标 - vscode 身份验证 - 但解决方案相同):https://github.com/microsoft/vscode-mssql/wiki/How-to-enable-Integrated-Authentication-on-macOS-and-Linux-using-Kerberos
- 使用 CredSSP 实际上应该允许您使用 Kerberos(或者更好地将 Kerberos 票证从客户端委托给目标)
- 我没有 Mac 来测试这个 - 但这个方法在 Linux 上确实有效
但即使这确实有效,它也会将负担从调整 GPO 以包含所有免于 Kerberos 身份验证的客户端名称转移到调整所有客户端。
但它确实使其更安全,因为您现在允许来自这些特定客户端的任何内容进行 NTML 身份验证。