私钥连接远程桌面 🔗
TL;DR: 屏蔽3389,并设置sshd,用端口转发访问。
家里的PC是开启了远程桌面与网络唤醒的,本身配置为弱密码方便使用,暴露给所有内网设备。在完善设置了网关的防火墙后安全性可以接受。
现在想要将远程桌面暴露给外网,同时又担心弱密码的安全性。曾考虑使用证书登录,但是证书登录是给企业用户入域后的电脑使用的功能。所以抛弃证书登录, 考虑到Win10开始Windows内置了OpenSSH,在Windows上使用ssh变得更加方便。所以可以使用ssh开端口转发作为中转。
配置OpenSSH 🔗
首先配置windows下的ssh,参考Get started with OpenSSH for Windows。 在win10的“设置”中,选择应用-可选功能,添加OpenSSH客户端和服务器功能。 在“服务”,找到ssh和ssh-agent,开启并设置自动启动。ssh-agent是使用私钥登录需要的服务。
现在使用ssh-keygen -t rsa
来生成验证用的密钥对。强烈建议设置一个强密码来加密。
这个密码是用来加密私钥的,而私钥要传到其他设备上使用,如工作电脑等。
设置强密码防止其他人滥用。
ssh-keygen -t rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_rsa.
Your public key has been saved in C:\Users\username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME
The key's randomart image is:
+---[RSA 3072]----+
| |
| . |
|. . . |
|. o = . . . . |
|. ..=oo.S . + |
|. .+oo.. o o |
| o =+o. . o . |
|= ..oo*o .o . . .|
|.+ o*B+ooEo+==...|
+----[SHA256]-----+
Windows上的OpenSSH Server没有root的概念,使用Administrators Group代替。一般我们的用户都处于管理员组,像Linux中那样在.ssh
下设置authorized_keys是不起效的。
将C:\Users\username/.ssh/id_rsa.pub
内容添加到%programdata%/ssh/administrators_authorized_keys
中。如果这个文件不是系统建立的,还需要保证其权限正确,运行
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
然后确认Admin组禁用密码登录,只允许pubkey。编辑%programdata%\ssh\sshd_config
,设置Admin组如下:
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
配置网络 🔗
这一步因人而异,我的网络环境下是在wireguard的网关下配置nftables。如果在路由器上配置端口转发,则可以只暴露22端口转发给PC。实际上是通过ssh端口建立的连接,3389不需要可以屏蔽。
chain wg_control {
#blablabla can access anything but RDP
ip saddr { 172.16.0.14 } ip daddr { 192.168.1.100 } tcp dport 3389 reject with tcp reset
}
远程连接 🔗
ssh username@ENDPOINT -p 22 -L 3389:127.0.0.1:3389 -N
将远程3389发送到本机3389。连接127.0.0.1的RDP即可连接远程PC。
在Ubuntu20.04中安装remmina,可以这么设置免去手动ssh端口转发。
出于安全性考虑,在外使用私钥登录时,要及时用ssh-add -D
将解密后的私钥从内存删除。
在我这台ubuntu中,似乎没有超时限制,解密后的私钥一只存留内存。