如何排查使用 RDP 连接到 EC2 Windows 实例时出现的身份验证错误?

上次更新时间:2021 年 6 月 29 日

我无法使用远程桌面协议 (RDP) 登录到我的 Amazon Elastic Compute Cloud (Amazon EC2) Windows 实例。我收到以下其中一条身份验证错误消息:

  • “出现身份验证错误。无法联系本地安全性机构。”
  • “您尝试连接的远程计算机需要网络级别身份验证 (NLA),但无法联系您的 Windows 域控制器执行 NLA。如果您是远程计算机上的管理员,则您可以通过使用‘系统属性’对话框的‘远程’选项卡上的选项禁用 NLA。”

简短描述

以下两种情况下可能会发生上述错误:

  • 服务器上启用了网络层身份验证 (NLA)。
  • 在 RDP 登录期间,您的域和加入该域的 EC2 实例之间的信任关系失败。

解决方法

在服务器上启用 NLA

当实例因域凭证未经过身份验证而失去与域控制器的连接时,往往会发生 NLA 错误。要修复此问题,您可以使用 AWS Systems Manager AWSSupport-TroubleshootRDP 自动化文档。或者,您可以在实例上禁用 NLA。

AWSSupport-TroubleshootRDP 自动化文档

AWSSupport-TroubleshootRDP 自动化文档允许您修改 Amazon EC2 Windows 实例上可影响 RDP 连接的常见设置(如 RDP 端口、网络层身份验证 (NLA) 和 Windows 防火墙配置文件)。有关使用 AWSSupport-TroubleshootRDP 文档进行故障排查的说明,请参阅 AWSSupport-TroubleshootRDP

在实例上禁用 NLA

您可以使用以下方法之一在无法访问的实例上禁用 NLA:

  • 使用 Systems Manager AWS-RunPowerShellScript 文档禁用 NLA。
  • 手动离线进行注册表更改。

注意:禁用 NLA 需要更改注册表。开始之前,请从实例创建一个 Amazon 系统映像 (AMI)。这会在您更改注册表之前创建备份。

使用 Systems Manager AWS-RunPowerShellScript 文档禁用 NLA

要使用 AWS Systems Manager AWS-RunPowerShellScript Run Command 添加注册表项,请执行以下步骤:

重要提示:实例必须已安装 AWS Systems Manager SSM 代理。实例还必须拥有具备 Systems Manager 权限的 AWS Identity and Access Management (IAM) 角色 (AmazonEC2RoleforSSM),并且必须在 Systems Manager 控制面板上报告“离线”。有关更多信息,请参阅 Systems Manager 先决条件

1.    打开 AWS Systems Manager 控制台

2.    从导航窗格的实例和节点部分,选择运行命令

3.    对于命令文档,请选择 AWS-RunPowerShellScript

4.    对于命令参数,请输入以下命令:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0 /f
reg add
"HKLM\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp" /v fAllowSecProtocolNegotiation /t REG_DWORD
/d 0 /f

5.    对于目标,请选择手动选择实例

6.    选择您的实例。

7.    选择运行

8.    等待片刻直到总体状态更改为成功。2 分钟后刷新页面。

9.    重新启动实例。

10.    使用 RDP 登录实例。

手动离线进行注册表更改

  1. 停止无法访问的实例分离根卷
  2. 在您刚刚停止的原始实例所在的可用区中启动新实例。此实例将成为您的救援实例。最佳做法是启动与无法访问的实例不同的 Windows 版本。这可以避免磁盘签名问题。
  3. 将分离的卷附加到救援实例中,作为 /dev/xvdf
  4. 使用 RDP 连接到救援实例,然后在磁盘管理器中使刚附加的卷联机。
  5. 运行 regedit.exe 以打开注册表编辑器。
  6. 选择 HKEY_LOCAL_MACHINE,然后选择 File(文件)、Load Hive(加载 Hive)。
  7. 导航到附加卷上的 Windows 文件夹,然后选择 SYSTEM 文件。默认路径为 D:\Windows\System32\config
  8. SYSTEM 文件命名。例如 badsys
  9. badsys 现在出现在 HKEY_LOCAL_MACHINE 下。在 badsys 下,导航至 ControlSet001ControlTerminal ServerWinStationsRDP-Tcp
  10. 双击 SecurityLayer 并将其值数据设置为 0。然后选择 UserAuthentication,并将其值数据设置为 0
  11. 向上滚动并选择 badsysFile(文件)、Unload Hive(卸载 Hive)。
  12. 卸载 Hive 后,打开磁盘管理器并使磁盘脱机。
  13. 从救援实例中分离卷并将其作为根卷 (/dev/sda1) 连接到无法访问的实例。
  14. 启动实例并测试 RDP。

在 RDP 登录期间,您的域和加入该域的 EC2 实例之间的信任关系失败

您可以尝试使用缓存的用户凭证登录到无法访问的实例。

先决条件

  • 可以成功向 EC2 实例进行身份验证的本地账户。
  • (选项)当实例能够与域控制器成功通信时,应至少有一个域账户已登录。 为了使域账户正常运行,域账户凭证必须缓存在服务器中。因此,始终建议使用本地账户。
  • 要使用交互式登录,请确保将先前要缓存的登录数(如果域控制器不可用)的策略设置至少设置为 1。或者,可以将策略设置为默认值 10。预设情况下,未在 GPO 级别定义此策略,且使用的是服务器本地策略。

要使用缓存的用户凭证登录,请执行以下步骤:

  1. 打开 Amazon EC2 控制台并选择 Security groups(安全组)。
  2. 选择 Create Security Group(创建安全组),然后添加名称和描述。
  3. Security group rules(安全组规则)下,选择 Inbound – Add Rule(入站 – 添加规则)。
  4. 输入 RDP
  5. Source(来源)字段中,输入您希望 RDP 来源所在的 IP 地址。
  6. 对于 Outbound rule(出站规则),删除所有出站访问权限,然后选择 Create(创建)。
  7. 选择无法访问的实例,然后选择 Actions(操作)、Networking(联网)、Change Security Groups(更改安全组)。删除所有现有安全组并仅分配刚创建的安全组。
  8. 使用普通域账户通过 RDP 连接到 EC2 实例。由于所有出站访问都从 EC2 中删除,因此 RDP 使用存储在服务器内的缓存凭证。

注意:最初,尝试针对域控制器进行身份验证。但是,由于 EC2 没有出站访问权限,因此身份验证最终会检查服务器内缓存的凭证。使用缓存的凭证,重新进行身份验证且登录成功。登录后,您可以将安全组设置恢复到原始状态,然后继续修复域的任何问题。

其他问题排查方法


这篇文章对您有帮助吗?


您是否需要账单或技术支持?