0x00 缘起
在自建 RustDesk 远程桌面服务时,为了保障私有服务的安全性和防止 ID 被滥用,开启"强制登录(Must Login)"是核心安全需求。然而,在使用某些 Go 版本的 RustDesk API 管理后台时,发现网页端的 MUST_LOGIN 选项存在"配置无法持久化"的问题:每当重启 hbbs 服务或服务器后,该选项会自动回退为关闭状态,导致安全策略形同虚设。
本文旨在通过底层逻辑分析,找到该配置的真正归属,并提供一种"物理级"的永久解决方案。
0x01 环境
-
操作系统:Linux (Ubuntu/CentOS/Debian)
-
服务管理:Systemd
-
核心组件:
-
hbbs(RustDesk ID Server) -
rustdesk-api(基于 Go 开发的第三方 API 适配器)
-
-
数据库:SQLite (用于存储用户及审计日志)
0x02 对策
问题分析
通过对系统进行深度排查(包括检查 SQLite 数据库、MySQL 映射、环境变量注入以及 .env 配置文件),发现该 API 的 MUST_LOGIN 开关具有以下特性:
-
内存运行态 :网页端的开关本质上是通过 TCP 端口(如 21115)向正在运行的
hbbs进程发送实时指令。 -
非持久化 :由于指令是直接发给进程内存的,一旦
hbbs进程重启,内存状态清空,配置即刻失效。 -
环境隔离:Web API 尝试修改环境配置时可能受限于权限,无法将状态写入磁盘。
解决途径
与其依赖不稳定的 Web 指令下发,不如利用 hbbs 原生支持的启动参数。经查阅 hbbs --help,该程序内置了 --must-login 参数。
最终方案: 将强制登录逻辑硬编码进 Systemd 服务启动项。
-
修改服务文件:
编辑
hbbs.service配置文件:vi /etc/systemd/system/hbbs.service -
注入原生参数:
在
ExecStart指令末尾添加--must-login Y:# 示例修改 ExecStart=/opt/rustdesk-server/hbbs -r <your-domain> --must-login Y -
应用配置:
systemctl daemon-reload systemctl restart hbbs.service
如何验证
-
进程验证 :执行
ps aux | grep hbbs,确认启动命令中包含--must-login Y参数。 -
功能验证 :使用 RustDesk 客户端在未登录状态下尝试连接,若服务器直接拦截并提示"未授权"或"需要登录",则说明策略已永久生效。
0x03 结论
在复杂的自建服务架构中,Web 管理面板往往只是"控制层",而真正的"逻辑层"位于底层进程的启动参数中。当遇到配置反复重置的现象时,跳过 UI 界面直接在 Systemd 服务层级进行参数硬编码,是实现配置持久化最稳妥、最可靠的手段。
0x04 参考
-
RustDesk 官方文档: https://rustdesk.com/docs/en/self-host/
-
RustDesk-API (Go) 项目仓库: https://github.com/lejianwen/rustdesk-api
-
Systemd 入门指南: https://www.freedesktop.org/wiki/Software/systemd/
0x06 后记
"Truth can be stated in a thousand different ways, yet each one can be true." ------ Swami Vivekananda