保护我通过 Internet 的 Microsoft 远程桌面连接的安全?

Joe*_*Joe 2 networking remote-desktop ssh

在我的家用 Windows 10 计算机上,我通过路由器将 Microsoft 的 RDP 端口 (3389) 端口转发到端口 (20202)。因此,我只需输入<my public IP address>:<port>(例如134.111.23.443:20202)即可通过 Mac 上的 Microsoft 远程桌面应用程序远程访问 Windows 10 计算机。

我想知道是否有一种方法可以使其更安全,例如通过 SSH 建立隧道,而不需要任何其他计算机(我只有家里的 Windows 10 机器通过固定电话连接到互联网,还有我的 MacBook,与我一起)。

Ale*_*lex 5

这确实是一个很好的决定,因为 Microsoft 仍然不知道如何防止对 RDP 会话的暴力攻击。有帐户锁定策略(有一些缺点,请进一步阅读),在不错的@harrymc答案中描述得很好,因此那些至少拥有Windows Pro版本的人可以使用这样的工作流程。

如果您是家庭版的所有者,那么您可以通过直接编辑以下注册表项来激活帐户锁定策略:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters\AccountLockout
Run Code Online (Sandbox Code Playgroud)
  • 双击该MaxDenials值并输入您希望锁定帐户之前的失败尝试次数。
  • 双击ResetTime(分钟)值并将默认值(0xB40十六进制表示 2,880 分钟(两天))更改为合理的值,例如 15-20 分钟。

Windows 帐户锁定策略的问题是,如果其他人尝试暴力破解密码,您的计算机将被锁定。策略不依赖于发起者的 IP,仅计算登录尝试并触发帐户锁定事件,因此有效地禁用对所有者和攻击者的访问。

恕我直言,另一个更强大的保护是使用SSH公钥身份验证,它比基于密码的身份验证更强大。

您几乎通过提到 SSH 来回答您的问题。在 Windows PC 上设置cygwin,运行 SSH 服务并启用sshd_config隧道并设置公钥身份验证,同时禁用纯密码身份验证(在家庭 LAN 上测试 ssh 连接是否成功)。
在您的路由器上转发一些非默认 SSH 端口 (22),例如 20202,就像您将 RDP 转发到此 Windows 计算机到 Windows PC 上的端口 22 一样(不要忘记禁用转发到 RDP)。当您要连接到 RDP 时,请使用以下脚本启动与远程 Windows PC 的第一个 SSH 会话:(适用
于基于 Unix 的操作系统的脚本,例如 Linux、BSD、MacOS,以及使用 cygwin 的用户。使用 Windows 作为客户端的用户请参阅下面的“连接”部分)

#!/bin/sh

# Script that can be use on remote client that running Unix based OS

RemotePC_IP=1.2.3.4  # Public IP address of your home
WindowsUserName=Gates  # Windows user name on remote computer
RDPlocalListenPort=12345  # Local port that that will be forwarded to RDP
Path2prvKey='/path/to/private/key' # Path to private key
RemoteSSHport=20202 # The port that opened on your home router
                    # and forwarded to SSH service port on Windows PC

ssh -N -L ${RDPlocalListenPort}:localhost:3389 \
    -i ${Path2prvKey} -p ${RemoteSSHport} ${WindowsUserName}@${RemotePC_IP}                   

# If you also want to use bunch of useful Unix utilites (that doesn't
# exist natively on Windows) besides of port forwarding, you can remove
# `-N` option from this script and use cygwin's terminal to run Windows's
# and Unix's console base programs remotely without starting RDP session. 
Run Code Online (Sandbox Code Playgroud)

它将通过安全加密的 SSH 会话将本地端口 12345 转发到远程 Windows 计算机上的 RDP(3389) 端口,然后最终使用连接字符串连接到 RDPlocalhost:12345

这种保护 RDP 会话的方法的优点是使用非对称加密技术加密的通道比任何复杂的密码都要强大得多。除了强大的加密之外,还可以使用丰富的 Unix 实用程序通过安全通道管理远程 Windows PC。

使用 SSH 可以做一件更巧妙的事情 - 如果您家里没有静态 IP 地址,或者您不想完全信任 LogMeIn 或 TeamViewer 等公司,或者您的 PC 位于严格的防火墙后面,而您无法信任这些公司设置端口转发或者您无法控制主网关/防火墙,那么可以在反向模式下设置 SSH,其中 Windows PC 自动连接到具有您控制的静态 IP 的中间服务器。这样,您不需要直接连接到 Windows PC,而是连接到可以为许多计算机提供服务的中间服务器。当需要支持 IP 未知的移动客户时,以及当 IT 支持人员因公司机密性较高而需要支持公司的移动 PC 而无需使用第三方服务时,这种设置非常方便,可以降低数据泄露的风险。

虽然下面的安装过程看起来有点长,但实际上,当您了解其工作原理时,这种安装需要 10-15 分钟。

细节:

安装 Cygwin

更新:从 Windows 10 v.1803 开始​​,Microsoft 附带了预安装的 OpenSSH 服务器和客户端,因此以下步骤适用于那些没有 Windows 10 或尚未升级到 Windows 10 v.1803 及更高版本的用户。

要在 Windows 上安装 SSH,请按照 Oracle 的文档进行操作,该文档详细介绍了如何设置 SSH 服务并配有屏幕截图。您只需按照此处的
5.3、5.4、5.5 节进行操作

我将发布安装 SSH 服务所需的最重要步骤。

  • 从cygwin主站点下载可执行安装文件。安装文件有两个版本:setup-x86.exesetup-x86_64.exe. 为您的机器选择适当的文件。如果您想使用除 SSH 之外的其他 Unix 基础实用程序,那么我的建议是x86即使您的计算机是 64 位也使用版本,因为并非所有实用程序都移植到 64 位版本。
  • 安装过程非常简单直观:
    在“选择安装类型”屏幕上,选择“从 Internet 安装”,然后单击“下一步”。
  • 在“选择安装目录”屏幕上,输入 C:\cygwin 作为根目录,然后单击“下一步”。Install for将单选按钮设置为All users
  • 在“选择本地包目录”屏幕上,选择本地计算机上要用于存储下载的安装文件的目录,然后单击“下一步”。(可以保持默认c:\packages
  • 在“选择连接类型”屏幕上,选择适当的设置以连接到 Internet,然后单击“下一步”。如果您的电脑可以直接访问互联网而无需任何代理,则选择Direct connections
  • 在“选择下载站点”屏幕上,从可用列表中选择任意站点,然后单击“下一步”。选择离您最近的站点。在选择包屏幕上,确保至少选择以下包,然后单击下一步:
    • openssh,,,,,,,opensslunzipxzzipmc
  • 选择包并单击“下一步”后,将显示“解决依赖关系”屏幕。单击“下一步”继续。
  • 如果您认为您会使用基于 Unix 的实用程序,则在“安装状态”和“创建图标”屏幕上,请勿进行任何更改。单击“完成”完成安装过程,否则取消设置复选框。

配置SSH

  • 安装 Cygwin 后,导航到该C:\cygwin目录,使用任何编辑器以编辑模式打开Cygwin.bat文件,并在调用 bash shell 之前添加以下行。
    set CYGWIN=binmode ntsec如下例所示:

    @echo off C: chdir C:\cygwin\bin set CYGWIN=binmode ntsec bash --login -i

  • 要验证Cygwin ( cygrunsrv) 是否正确安装,请运行
    C:\cygwin\Cygwin.bat,并执行以下命令:
    cygrunsrv -h
    如果 Cygwin 安装正确,则屏幕上会显示所有 Cygwin 帮助选项。但是,如果此命令返回错误消息,则您可能必须重新安装 Cygwin。

  • 配置SSHD服务,运行C:\cygwin\Cygwin.bat,执行以下命令:
    ssh-host-config
    运行该命令后,系统会提示以下问题:
    *** Query: Should privilege separation be used? <yes/no>: yes *** Query: New local account 'sshd'? <yes/no>: yes *** Query: Do you want to install sshd as a service? *** Query: <Say "no" if it is already installed as a service> <yes/no>: yes *** Query: Enter the value of CYGWIN for the deamon: [] binmode ntsec *** Query: Do you want to use a different name? (yes/no) yes/no
    此时,如果您想使用相同的名称,即cyg_server,请输入 no。然后系统会提示您以下问题:
    *** Query: Create new privileged user account 'cyg_server'? (yes/no) yes *** Query: Please enter the password: *** Query: Renter:
    但是,如果您想使用不同的名称,请输入 yes。然后会提示您以下问题:
    *** Query: Enter the new user name: cyg_server1 *** Query: Reenter: cyg_server1 *** Query: Create new privileged user account 'cyg_server1'? (yes/no) yes *** Query: Please enter the password: *** Query: Reenter:
    如果配置成功,您将看到以下消息:
    Host configuration finished. Have fun!
  • 备份c:\cygwin\etc\passwd文件(如果存在)并运行以下命令:
    /bin/mkpasswd -l >/etc/passwd
    然后passwd通过运行 mcedit /etc/passwd
    删除所有不会通过 SSH 连接的用户进行编辑,尤其是:
    SYSTEM, LOCAL SERVICE, NETWORK SERVICE, NT SERVICE+TrustedInstaller, Guest

SSHD 服务的微调

  • 通过运行以下命令编辑sshd_config文件(SSH 服务):
    mcedit /etc/sshd_config
  • 在文件末尾添加以下内容:

########################### Customization ##########################
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
#
UseDNS no
UsePAM yes
LoginGraceTime 20
#
PermitRootLogin prohibit-password
PubkeyAuthentication yes
ChallengeResponseAuthentication no
PasswordAuthentication no
HostbasedAuthentication no
#
PermitTunnel yes
TCPKeepAlive no
ClientAliveInterval 30
ClientAliveCountMax 10
GatewayPorts no
AllowTcpForwarding yes
Run Code Online (Sandbox Code Playgroud)
  • 现在需要生成用于公钥身份验证
    的密钥 在cygwin终端中运行以下命令:
    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    cd ~/.ssh
    echo > ~/.ssh/authorized_keys

    • 生成密钥 Unix 方式:(将“用户名”替换为将通过 SSH 连接的 Windows 帐户)
      cygwin终端中运行以下命令:
      cd ~/.ssh
      ssh-keygen -t ed25519 -o -a 127 -C "UserName" -f "UserName.ed25519.key"
      cp -f UserName.ed25519.key.pub ~/.ssh/authorized_keys
    • Windows方式:
      下载PuTTY并运行puttygen.exe. 选择要生成为的密钥ED25519并按Generate。将私钥保存到文件中,以后可以用作授权密钥。从标记为(用于传递到 OpenSSH 的公钥)的字段中选择顶部的公钥,右键单击选择并选择,copy然后paste将内容复制到
      ~/.ssh/authorized_keys
  • 最后通过运行以下命令启动 SSH 服务:
    cygrunsrv -S sshd

通过 SSH 连接从远程客户端连接到 RDP

  • 要在基于 Unix 的操作系统(例如 Linux、FreeBSD、MacOS)上进行连接,可以使用答案顶部发布的 shell 脚本。编辑脚本顶部的变量,使用前面步骤中生成的私钥。
  • 要从运行 Windows 的计算机进行连接,可以使用PuTTY客户端程序。在通过 RDP(远程桌面连接)连接到远程计算机之前,首先运行 PuTTY 并设置端口转发和私钥:
    • 在左侧树面板上,转到
      Connection->SSH->Auth并单击Browse按钮添加前面步骤中生成的私钥的路径。
    • 在左侧树面板上,转到
      Connection->SSH->Tunnels 并输入字段Source port 12345并放入localhost:3389字段destination,然后将单选按钮设置为LocalAuto并按Add按钮。
    • 在左侧树面板上,转到 Session并在字段中输入Host Name运行 SSH 的远程 Windows PC 的 IP 地址,并在字段中设置家庭路由器的远程侦听端口Port
    • 在字段中添加会话的描述性名称Saved Sessions并保存配置。
  • 通过 SSH 建立连接后,运行Remote Desktop Connection程序并用于localhost:12345通过 SSH 隧道通过 RDP 连接到远程计算机。