在我家的 Windows 10 机器上,我已通过路由器将 Microsoft 的 RDP 端口 (3389) 转发到端口 (20202)。因此,我只需输入<my public IP address>:<port>
(例如134.111.23.443:20202
) 即可通过 Mac 上的 Microsoft 远程桌面应用程序远程访问 Windows 10 机器。
我想知道是否有办法使其更安全,例如通过 SSH 建立隧道,而无需任何其他计算机(我只有通过家里的固定电话连接到互联网的 Windows 10 机器和随身携带的 MacBook)。
答案1
这确实是一个不错的决定,因为微软仍然无法弄清楚如何防止对 RDP 会话的暴力攻击。有一个帐户锁定策略(有一些缺点,请进一步阅读),在 nice 中描述得很好@harrymc 回答,因此至少拥有 Windows Pro 版本的用户可以使用这样的工作流程。
如果您是家庭版的拥有者,那么您可以通过直接编辑以下注册表项来激活帐户锁定策略:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters\AccountLockout
- 双击该
MaxDenials
值并输入锁定帐户之前的失败尝试次数。 - 双击
ResetTime
(分钟)值并将默认值0xB40
(十六进制 2,880 分钟(两天))更改为合理的值,例如 15-20 分钟。
问题使用 Windows 帐户锁定策略的一大弊端是,如果其他人试图暴力破解密码,您的计算机将被锁定。策略不依赖于发起者的 IP,只计算登录尝试次数并触发帐户锁定事件,因此可以有效地禁用所有者和攻击者的访问权限。
我认为另一个更强大的保护是使用SSH公钥认证比基于密码的认证强大得多。
你几乎通过提到 SSH 回答了你的问题。设置赛格威在 Windows PC 上,运行 SSH 服务并启用sshd_config
隧道并设置公钥身份验证,同时禁用普通密码身份验证(如果成功,请在家庭 LAN 上测试 ssh 连接)。
在路由器上,转发一些非默认 SSH 端口(22),例如 20202,就像您对这台 Windows 机器的 RDP 所做的那样,转发到 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.
它将通过安全加密的 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 服务所需完成的最重要的步骤。
- 从以下位置下载可执行安装文件赛格威主要站点。有两个版本的安装文件:
setup-x86.exe
和setup-x86_64.exe
。为您的机器选择合适的文件。如果您想使用除 SSH 之外的其他 Unix 基础实用程序,那么我的建议是使用x86
版本,即使您的机器是 64 位的,因为并非所有实用程序都移植到 64 位版本。 - 安装过程非常简单直观:
在“选择安装类型”屏幕上,选择“从 Internet 安装”,然后单击“下一步”。 - 在“选择安装目录”屏幕上,输入 C:\cygwin 作为根目录,然后单击下一步。将单选
Install for
按钮设置为All users - 在“选择本地包目录”屏幕上,选择本地计算机上要存储下载的安装文件的目录,然后单击“下一步”。 (您可以保留默认设置
c:\packages
) - 在“选择连接类型”屏幕上,选择适当的设置以连接到互联网,然后单击下一步。如果您的 PC 无需任何代理即可直接访问互联网,则选择
Direct connections
- 在“选择下载站点”屏幕上,从可用列表中选择任意站点,然后单击“下一步”。选择离您最近的站点。在“选择软件包”屏幕上,确保至少选择以下软件包,然后单击“下一步”:
openssh
,,,,,,openssl
unzip
xz
zip
mc
- 选择软件包并单击“下一步”后,将显示“解决依赖关系”屏幕。单击“下一步”继续。
- 如果您认为您会使用基于 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
验证是否赛格威(
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
Remove进行编辑所有不通过 SSH 连接的用户, 尤其:
SYSTEM, LOCAL SERVICE, NETWORK SERVICE, NT SERVICE+TrustedInstaller, Guest
SSHD 服务的微调
- 通过运行以下命令编辑
sshd_config
文件(SSH 服务):
mcedit /etc/sshd_config
- 在文件末尾添加以下内容:
########################### Customization ##########################
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256
MACs [email protected],[email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,[email protected]
#
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
现在需要生成密钥公钥认证
在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
- 以 Unix 方式生成密钥:(将“用户名”替换为将通过 SSH 连接的 Windows 帐户)
最后运行以下命令启动 SSH 服务:
cygrunsrv -S sshd
通过 SSH 连接从远程客户端连接到 RDP
- 要在基于 Unix 的操作系统(如 Linux、FreeBSD、MacOS)上进行连接,可以使用答案顶部发布的 shell 脚本。编辑脚本顶部的变量,使用前面步骤中生成的私钥。
- 要从运行 Windows 的计算机连接,可以使用油灰客户端程序。在通过 RDP(远程桌面连接)连接到远程计算机之前,请先运行 PuTTY 并设置端口转发和私钥:
- 在左侧树面板上,转到
Connection->SSH->Auth
并单击Browse按钮添加在前面步骤中生成的私钥路径。 - 在左侧树面板上,转到
Connection->SSH->Tunnels
并输入字段Source port
12345
,然后输入localhost:3389
字段,destination
然后将单选按钮设置为Local
并Auto
按下Add按钮。 - 在左侧树面板上,转到
Session
并在Host Name
字段中输入运行 SSH 的远程 Windows PC 的 IP 地址,并在字段中设置家庭路由器的远程监听端口Port
。 - 在字段中添加会话的描述性名称
Saved Sessions
并保存配置。
- 在左侧树面板上,转到
- 当通过 SSH 建立连接时,运行
Remote Desktop Connection
程序并localhost:12345
通过 SSH 隧道通过 RDP 连接到远程计算机。
答案2
微软的远程桌面使用加密技术,因此通信得到了合理的保护。弱点是您的用户名和密码可能会遭到暴力攻击。
为了保护 RDP,您可以执行以下操作:
更改远程桌面侦听的默认端口
这个你已经做了。实力雄厚
使用非默认用户名和长而复杂的密码受限用户帐户
通过运行 > 本地策略 > 用户权限分配来严格限制可以使用 RDP 的用户secpol.msc
,双击“允许通过远程桌面服务登录”并删除所有显示的组,然后添加一个用户。高安全级别
运行gpedit.msc
> 本地计算机策略 > 管理模板 > Windows 组件 > 远程桌面服务 > 远程桌面会话主机 > 安全。- “设置客户端连接加密级别” -> 启用和高级别,以便您的会话使用 128 位加密进行保护
- “要求对远程(RDP)连接使用特定的安全层”-> SSL
- “使用网络级身份验证要求对远程连接进行用户身份验证”->已启用
设置帐户锁定策略
要在多次猜测错误后将帐户锁定一段时间,请转到管理工具 > 本地安全策略 > 帐户策略 > 帐户锁定策略,然后设置所有三个选项的值(3 次无效尝试,锁定时间为 3 分钟是合理的)。跟踪登录到您的电脑
定期转到事件查看器 > 应用程序和服务日志 > Microsoft > Windows > TerminalServices-LocalSessionManger > 操作,查看登录信息。