RaspKaliPi魔改之路(二)safari跟我有仇——一些安全措施

写在最前:
这个系列将会记录我个人改造树莓派的一些踩坑记录。为了方便阅读,以专题为单位拆分文章,不过文章之间仍有较强的联系,感兴趣的可以从头读到尾。
这个系列只适合那些有较强动手能力喜欢瞎折腾并且 能对自己的每一次操作负全部责任 的树莓派用户。

参考的文章

nginx官方文档
noVNC官方文档
关于x11vnc,novnc和ssl/tls的一些讨论
自签名证书

自创概念

x11vnc-novnc-port:novnc的访问端口,加载了x11vnc
x11vnc-novnc-nginx-port:nginx的访问端口,加载了novnc


上回书说到,在树莓派上配置了x11vnc之后我们终于能优雅地看见桌面了。

NICE

但是,与RDP“好歹有加密”不同,VNC协议默认都是明文传输。
如果只是在家里用WiFi连接那还好说,如果是像我一样穿透到公网,哪怕对于 脚本小子 来说,你也像一个不穿衣服在大街上狂奔的傻X。

那你们呢

“诶SakuraFrp不是有加密选项吗”
这里我们要先搞清楚frp的工作原理。

很明显,图不是我做的
如图,访客先连接frps,frps再把请求转发给frpc。

被加密的部分只有frpc和frps之间的链路,从frps到访客的链路仍然是明文。

不如假装加密了吧

所以自己给自己上加密就很有必要了。
对于我们这些没有域名的VNC用户来说,自建CA完全没必要(别人又不访问),所以实际上我们只要生成服务器证书就完了:

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl req x509 -days 365 -in server.csr -out server.crt -key server.key

tips:第一行命令里的 “2048” 指定了密钥长度,为了安全你可以自行增加长度,不过最好是2的倍数(4096,8192,etc.),否则会出现诡异的问题(见文末)

来讲讲为什么我要用noVNC。

一,这个世界上已经没有什么支持ssl/tls的免费vnc客户端了。我找到的唯一一份遗产是x11vnc的子项目, SSVNC 。不幸的是,这个2011年停止更新的软件并不支持TLS,而 SSL的所有版本由于不可修补的安全漏洞都已被废弃 。至于剩下的那些客户端,全部都要收费。本着不花冤枉钱的原则,我转向noVNC。它能够把vnc协议转为http协议,而后者已经有广泛的tls支持。

“诶x11vnc不是内置html服务端吗”

能说出这句话的人,你很牛。但是。就像我在上一篇文章中暗示的,x11vnc的集成度高到离谱(从它把操作手册写进命令行就能看出),为了一个隐形bug我要查上百份(很可能和我想要的信息没有半点关系的)过时文档。为什么不用独立,简洁易懂,可魔改程度高的html服务端呢?

为了方便更新我选择从官方源下载noVNC:

sudo apt-get install novnc

敲黑板:noVNC没有为你配置环境变量,只能手动引用

/usr/share/novnc/utils/launch.sh --cert=CERT --key=KEY --listen x11vnc-novnc-port --vnc x11vnc-port

如何调整noVNC参数这里不再赘述,官方文档写得很清楚。
自启动服务的话我直接把x11vnc的服务复制到 /etc/systemd/system 下面,只调整shell代码,一样能正常运行。
作为一个对安全性要求很高的人,我在noVNC上又套了一个nginx本地反代。确实,有点掩耳盗铃的意思,不过至少要让骇客第一眼看不出vnc运行在哪里,顺带逃过一大堆 自动化扫描脚本 的追杀。

sudo vim /etc/nginx/nginx.conf

http{
...
upstream novnc{
server 127.0.0.1:x11vnc-port;
}
...
server {
listen x11vnc-novnc-nginx-port ssl;
listen [::]:x11vnc-novnc-nginx-port ssl; #ipv6端口
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
...
location /websockify {
proxy_pass https://novnc/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
proxy_buffering off;
}
...
location /vncws {
index vnc.html;
alias /usr/share/novnc;
try_files 💲uri 💲uri/ /vnc.html; #美元符号会被识别成md语法,换成了表情包,望周知
}
...
}

终于,一个还算安全的远程桌面方案完成了。在下一篇文章里我会让树莓派的定制程度更强,操作比较离谱,追求稳定性的用户不建议继续学。
当当当当~

顺带吐槽:safari死活不肯接受我的自签名证书,因为我造了一个很离谱的密钥长度。傻X Safari。

posted @ 2022-04-01 18:10  ZZBBYY  阅读(160)  评论(0编辑  收藏  举报