安全与权限
RTKHUB 通常部署在测绘、CORS、实验室或单位内网环境。默认目标是便于运维,但生产环境仍需要明确账号、网络、日志和备份策略。
v1.3.0 安全修复(2026-07-03)
v1.3.0 版本修复了多个安全漏洞,包含 2 个 P0 级别(严重)、1 个 P1 级别(高危)和 1 个 P2 级别(中危)的安全问题。
P0-1: 路径遍历漏洞修复
问题描述:Web API 端点存在路径遍历攻击漏洞,攻击者可通过精心构造的 URI(如 %2F、%5c 编码的路径分隔符)访问站点根目录外的文件。
影响范围:所有 v1.2.0 及更早版本
修复措施:
- 实施全局 URI 安全检查,在路径匹配前验证原始 URI
- 阻止编码路径分隔符(
%2F、%5c) - 增强静态资源路径校验,拒绝
..、反斜杠、盘符和异常 URI
建议:请尽快升级至 v1.3.0 或更高版本
P0-2: 全局配置竞态条件修复
问题描述:全局配置访问存在竞态条件,多线程并发访问可能导致配置状态不一致。
影响范围:所有 v1.2.0 及更早版本
修复措施:
- 为共享配置状态添加适当的互斥锁保护
- 序列化所有配置读写操作
建议:请尽快升级至 v1.3.0 或更高版本
P1: Web 缓冲区溢出和会话固定攻击修复
问题描述:
- Web 终端和状态处理器存在缓冲区溢出漏洞
- 登录时未重新生成会话 ID,存在会话固定攻击风险
影响范围:所有 v1.2.0 及更早版本
修复措施:
- 将所有不安全的
vsprintf/sprintf替换为有界变体vsnprintf/snprintf - 登录成功后强制重新生成会话 ID
- 添加会话劫持保护机制
建议:升级至 v1.3.0 以修复此漏洞
P2: 速率限制、日志脱敏和输入验证
问题描述:
- 缺少登录速率限制,易受暴力破解攻击
- NTRIP 日志可能泄漏凭据信息
- Web API 参数输入验证不足
- SCRHUB 脚本路径可能被用于目录遍历
影响范围:所有 v1.2.0 及更早版本
修复措施:
- 实施登录速率限制(每 IP 每 60 秒最多 5 次失败尝试)
- 对 NTRIP 凭据进行日志脱敏处理
- 增强 Web API 参数验证
- 添加 SCRHUB 脚本路径校验,防止目录遍历
建议:升级至 v1.3.0 以获得完整的安全加固
升级建议
所有生产环境用户应尽快升级至 v1.3.0 或更高版本。升级兼容现有配置和数据库,无需额外迁移操作。
详细修复信息请参阅 v1.3.0 Release Notes。
首次上线清单
上线前必须逐项完成以下操作,遗漏任何一项都可能导致安全事故或数据丢失:
- 修改首次启动生成的管理员密码。
- 为日常使用创建独立账号,不长期共享
admin。 - 确认 Web 端口只对可信网段开放。
- 不把 NTRIP 账号、数据库文件、日志压缩包提交到公开仓库。
- 定期备份配置、数据库、结果文件和日志。
- 保留审计日志,便于追踪启停基线、用户变更和终端操作。
角色建议
| 角色 | 适用对象 | 建议权限 |
|---|---|---|
| admin | 系统管理员 | 用户管理、系统设置、基线控制、任务管理、日志查看 |
| operator | 运维人员 | 启停基线、查看状态、执行授权脚本、查看运行日志 |
| viewer | 只读用户 | 查看测网、地图、图表和状态,不允许控制操作 |
生产环境建议最少保留两个管理员账号,避免单个账号丢失后无法维护。
网络暴露
默认 Web 地址为:
http://127.0.0.1:5426
如果需要局域网访问,务必遵循以下安全建议:
- 只在内网监听或通过防火墙限制来源 IP。
- 不直接把
5426暴露到公网。 - 如需远程访问,优先使用 VPN、堡垒机或带认证的反向代理。
- 反向代理启用 HTTPS,并保留访问日志。
密码与凭据
配置文件可能包含 NTRIP 用户名、密码或专线地址。处理这些文件时遵循:
- 示例文档使用假账号。
- 问题反馈前先脱敏
username:password@host。 - 备份文件存放在受控目录,避免同步到公开网盘。
- 离职、外包交接或项目结束后更换共享数据源密码。
STRHUB 和 EPHUB 的 Web 页面、状态 API、控制台输出和 trace 生命周期日志会对 stream path 中的 NTRIP 用户名/密码做脱敏展示,例如把 ntrip://user:password@host:2101/MOUNT 显示为 ntrip://***:***@host:2101/MOUNT。配置文件本身仍可能包含明文凭证,因此配置、备份和问题反馈材料仍需要按敏感文件处理。
Web 终端风险
Web 终端适合远程排查,但它也是高权限入口。建议:
- 只允许
admin或授权operator使用。 - 在生产环境记录每次执行命令。
- 避免在 Web 终端执行删除、覆盖、批量移动等高风险操作。
- 对常用巡检动作优先固化为 SCRHUB 任务,减少临时命令。
备份策略
建议至少备份这些内容:
| 路径 | 内容 | 频率 |
|---|---|---|
conf/ | 测网和基线配置 | 每次变更后 |
| SQLite 数据库 | 用户、权限、设置、任务 | 每日 |
result/ | POS 结果文件 | 按项目或每日 |
logs/ | 运行日志、审计日志 | 每日或每周 |
备份压缩包应标注日期和版本,例如 rtkhub_backup_YYYYMMDD_vX.Y.Z.zip。
安全机制详解
前端架构
- 零框架依赖:纯原生 JavaScript(无 jQuery)
- 原生 Fetch API:所有 HTTP 请求通过
utils.js中的fetchJson()工具函数 - 原生 DOM API:使用
document.querySelector()和标准 DOM 方法 - 模块化设计:每个页面(monitor、admin、terminal 等)独立 JS 模块
- 统一通知系统:
toast.js提供showToast()和showConfirm()对话框
XSS 防护
所有用户可控数据(net_name、site_name、ch.id、sol_stat、conf、cmd、msg 等)在通过 innerHTML 插入 DOM 前均经过转义:
escapeHtml()— 转义& < > "用于文本内容和 HTML 属性escapeAttr()— 额外转义'用于单引号属性escapeJsStr()— 转义\ ' " < >用于onclick处理器中的 JavaScript 字符串escapeTooltipHtml()— 转义 ECharts 工具提示内容
后端线程安全
Web 终端输出按登录会话隔离。后端使用现有 rtkhub_session cookie 定位当前终端会话,每个会话维护独立的命令上下文、虚拟终端和输出缓冲区。不同浏览器或重新登录后的会话不会互相抢占 /api/term_read 输出。
Web 终端会话表和缓冲区访问由平台原生互斥锁保护:
| 平台 | 互斥锁 |
|---|---|
| Windows | CRITICAL_SECTION |
| Linux | pthread_mutex_t |
所有访问点(vt_printf()、web_terminal_append()、web_terminal_read()、web_terminal_cleanup())均已序列化。
缓冲区溢出防护
所有外部数据的 vsprintf / sprintf / strcpy 调用已替换为有界变体:
| 函数 / 路径 | 原始调用 | 安全替换 |
|---|---|---|
vt_printf() 终端路径 | vsprintf | vsnprintf |
build_global_log_path() | strcpy / sprintf | snprintf |
prstatus() RTCM 格式化 | sprintf | safe_append() 辅助函数(带截断钳位) |
main() 和 cmd_quickstart() 参数解析 | strcpy | snprintf(带截断检测,溢出时报错) |
JSON 注入防护
reply_json_error() 等 JSON 构建已迁移至 yyjson 库,由库内置的字符串转义保证 JSON 安全编码。
SCRHUB 任务接口对 JSON 字段采用键名级匹配,避免请求体字符串值中的同名文本被误识别为字段名。
SCRHUB 脚本路径保护
SCRHUB 只允许执行 script/ 目录下的相对脚本路径。新建、更新和执行任务时都会校验路径,拒绝 ..、绝对路径、盘符、冒号、控制字符和常见 shell 元字符,防止通过任务配置越权执行目录外文件。
URI 与静态资源路径保护
嵌入式 Web 服务会校验静态资源路径,拒绝 ..、反斜杠、盘符和异常 URI。EPHUB 自测也覆盖了 /../secret、编码斜杠等路径绕过场景,避免通过 Web 路径读取站点根目录外文件。
登录速率限制
/api/login 端点强制执行基于 IP 的速率限制:
- 限制:60 秒窗口内最多 5 次失败尝试
- 超限响应:HTTP
429 - 实现:固定大小的 64 个 IP 跟踪表,带自动窗口过期;表满时会替换最旧记录,避免新 IP 绕过记录
Web 写操作限额
RTKHUB 对 Web 终端中的写文件类命令增加了按用户、按天的限额保护。当前覆盖 save、log、add 等会写入配置或文件的命令:
| 角色 | 每日写操作上限 |
|---|---|
| admin | 5 次 |
| operator | 1 次 |
| viewer | 不允许 |
这个限制是 RTKHUB 后端自身的安全保护,和 Cloudflare Pages/Workers 的请求配额不是同一件事。达到上限后接口会提示当天写入额度已用完,需要次日或通过本机运维方式处理。
客户端 IP 检测
get_client_ip() 默认从 Web 适配层提取真实对等 IP。
编译时使用 -DTRUST_PROXY_HEADERS 标志时,还会读取 X-Forwarded-For 头(用于反向代理部署)。
-DTRUST_PROXY_HEADERS 标志默认关闭以防止 IP 欺骗。仅在确认反向代理可信时启用。
CORS 策略
API 响应默认不返回 Access-Control-Allow-Origin: *,避免跨站点脚本直接调用登录、控制、终端和用户管理接口。Web 前端与 API 使用同源访问。
密码校验
密码使用 PBKDF2-HMAC-SHA256 哈希存储。登录验证时对哈希结果使用恒定时间比较,避免普通 strcmp() 提前返回带来的时序侧信道。
构建选项
| 标志 | 效果 |
|---|---|
-DTRUST_PROXY_HEADERS | 信任 X-Forwarded-For 头获取客户端 IP(仅用于反向代理部署) |
-DWEB_AUDIT_DISABLE_RETENTION | 关闭审计日志默认保留最近 10000 条的自动清理策略 |
安全最佳实践
部署前检查
在将 RTKHUB 部署到生产环境前,完成以下安全配置检查:
1. 路径遍历防护
升级到 v1.3.0 后,使用以下命令验证路径遍历防护是否生效:
# 测试编码路径分隔符(应返回 400 Bad Request)
curl "http://127.0.0.1:5426/api/..%2F..%2Fsecret.txt"
curl "http://127.0.0.1:5426/api/..%5c..%5csecret.txt"
# 测试正常路径(应正常返回)
curl "http://127.0.0.1:5426/api/status"
预期行为:编码路径分隔符请求应被拒绝,正常请求应成功。
2. 会话管理
- 确认登录后会话 ID 重新生成(防止会话固定攻击)
- 设置合理的会话超时时间
- 定期清理过期会话
- 使用浏览器开发者工具检查
rtkhub_sessioncookie 在登录前后是否变化
3. 速率限制配置
测试登录速率限制是否正常工作:
# 连续 6 次失败登录尝试
for ($i=1; $i -le 6; $i++) {
curl -X POST http://127.0.0.1:5426/api/login `
-H "Content-Type: application/json" `
-d '{"username":"test","password":"wrong"}' -v
Start-Sleep -Seconds 1
}
预期行为:前 5 次返回认证失败(401),第 6 次返回速率限制错误(429)。
4. 网络隔离
- 不要将 5426 端口直接暴露到公网
- 使用反向代理(Nginx/Cloudflare Tunnel)并启用 HTTPS
- 配置防火墙规则限制访问来源 IP
- 仅在必要时开放局域网访问
5. 凭据管理
- 修改默认管理员密码
- 使用强密码策略(至少 12 位,包含大小写字母、数字、特殊字符)
- 为不同用户创建独立账号,避免共享
admin账号 - 定期更换 NTRIP 数据源密码
- 配置文件中的凭据使用适当的文件权限保护
运行时监控
部署后持续监控以下安全指标:
1. 登录失败率监控
# 检查审计日志中的登录失败记录
Get-Content D:\rtkhub\log\audit.log | Select-String -Pattern "login.*fail" | Measure-Object
# 统计最近 24 小时的失败登录次数
$yesterday = (Get-Date).AddDays(-1)
Get-Content D:\rtkhub\log\audit.log | Where-Object {
$_ -match "login.*fail" -and
[DateTime]::Parse(($_ -split '\s+')[0,1] -join ' ') -gt $yesterday
} | Measure-Object
如果单个 IP 在短时间内(如 1 小时)出现超过 20 次登录失败,可能正在遭受暴力破解攻击,应考虑封禁该 IP。
2. 异常 API 访问监控
# 监控可疑的路径遍历尝试
Get-Content D:\rtkhub\log\rtkhub.log | Select-String -Pattern "%2F|%5c|\.\./"
# 监控高频 API 调用
Get-Content D:\rtkhub\log\rtkhub.log | Select-String -Pattern "/api/" |
Group-Object {$_ -split '\s+' | Select-Object -Index 2} |
Sort-Object Count -Descending | Select-Object -First 10
3. 系统日志审计
定期检查以下日志中的异常模式:
- 审计日志 (
audit.log):用户登录、权限变更、配置修改 - 应用日志 (
rtkhub.log):服务启停、错误、警告 - Web 日志:异常请求、速率限制触发、会话异常
使用日志分析工具(如 ELK Stack、Splunk 或简单的 PowerShell 脚本)定期扫描日志,识别以下模式:
- 同一 IP 的高频请求
- 非工作时间的管理操作
- 未授权的 API 访问尝试
- 异常的文件路径请求
定期审计
建立定期安全审计流程:
1. 日志回顾(每周)
- 检查审计日志中的异常登录时间和地点
- 审查高权限操作(用户管理、配置变更、Web 终端命令)
- 验证日志文件未被篡改(检查文件修改时间连续性)
2. 用户权限检查(每月)
# 导出当前用户列表和权限(需要实现相应的 API)
curl http://127.0.0.1:5426/api/users -H "Cookie: rtkhub_session=<your-session>"
# 检查清单:
# - 是否有离职人员账号未删除
# - 是否有权限过高的账号
# - 是否有长期未使用的账号
# - 是否有共享账号
3. 配置文件检查(每季度)
- 审查 NTRIP 凭据是否仍然有效且必要
- 检查配置文件权限是否正确(仅授权用户可读)
- 验证备份是否包含敏感信息(考虑加密备份)
- 检查 SCRHUB 脚本路径是否仅限于
script/目录
4. 安全更新检查(每月)
关注 RTKHUB GitHub 仓库的 Releases 页面,启用 "Watch" > "Custom" > "Releases" 以接收安全更新通知。
定期检查并应用安全补丁:
# 检查当前版本
Get-Content D:\rtkhub\log\rtkhub.log | Select-String -Pattern "version" | Select-Object -First 1
# 访问 GitHub Releases 页面查看最新版本
Start-Process "https://github.com/apkpai/rtkhub/releases"
升级流程
安全升级应遵循以下流程,最小化停机时间和风险:
1. 测试环境验证
在生产环境升级前,先在测试环境中验证:
# 在测试环境部署新版本
Expand-Archive rtkhub-v1.3.0.zip D:\rtkhub_test\
cd D:\rtkhub_test
# 使用生产配置的副本启动
Copy-Item D:\rtkhub\conf\*.* D:\rtkhub_test\conf\
.\rtkhub.exe -s -k conf\rtkhub.list -p 15426 # 使用不同端口
# 运行功能测试和安全验证
2. 备份数据
任何版本升级前都应完整备份配置、数据库和日志,即使升级说明中声称"完全兼容"。
# 自动化备份脚本(建议在升级前运行)
$date = Get-Date -Format "yyyyMMdd_HHmmss"
$version = "v1.2.0" # 当前版本
$backupPath = "E:\backups\rtkhub_${version}_pre_upgrade_$date"
nssm stop RTKHUB
Copy-Item D:\rtkhub\conf $backupPath\conf -Recurse
Copy-Item D:\rtkhub\database $backupPath\database -Recurse
Copy-Item D:\rtkhub\log $backupPath\log -Recurse
Copy-Item D:\rtkhub\rtkhub.exe $backupPath\rtkhub.exe.backup
Compress-Archive $backupPath "$backupPath.zip"
Remove-Item $backupPath -Recurse
nssm start RTKHUB
Write-Host "备份完成: $backupPath.zip"
3. 灰度升级(大型部署)
对于多实例部署,采用灰度升级策略:
- 先升级 1-2 个实例,观察 24-48 小时
- 监控升级实例的日志、性能、错误率
- 确认无问题后逐步升级剩余实例
- 保留至少一个旧版本实例用于对比
4. 升级后验证
升级完成后执行完整的功能和安全验证:
# 功能验证
curl http://127.0.0.1:5426/api/status
curl http://127.0.0.1:5426/api/monitor
# 安全验证(路径遍历、速率限制等)
# 参见"部署前检查"章节的验证命令
# 日志检查
Get-Content D:\rtkhub\log\rtkhub.log -Tail 50 | Select-String -Pattern "error|fail|crash"
5. 回滚预案
准备快速回滚方案,并在升级前测试回滚流程:
# 回滚脚本模板
$backupZip = "E:\backups\rtkhub_v1.2.0_pre_upgrade_YYYYMMDD_HHmmss.zip"
nssm stop RTKHUB
Copy-Item D:\rtkhub\rtkhub.exe D:\rtkhub\rtkhub.exe.failed # 保留失败版本用于分析
Expand-Archive $backupZip "D:\rtkhub_restore" -Force
Copy-Item D:\rtkhub_restore\rtkhub.exe.backup D:\rtkhub\rtkhub.exe -Force
nssm start RTKHUB
# 验证回滚成功
Start-Sleep -Seconds 5
nssm status RTKHUB
在以下情况下应立即回滚:
- 服务无法启动或频繁崩溃
- 核心功能(如基线解算、数据流转发)异常
- 出现数据丢失或损坏
- 安全功能失效(如认证绕过、权限控制失效)
在以下情况下可以考虑修复而非回滚:
- 仅影响非核心功能的小问题
- 可以通过配置调整解决的兼容性问题
- 已有明确的修复方案且可快速验证
应急响应
安全事件响应流程:
- 检测:通过监控发现异常活动
- 隔离:立即停止受影响的服务或封禁攻击来源
- 分析:检查日志确定攻击范围和影响
- 恢复:从备份恢复或应用安全补丁
- 总结:记录事件经过,更新安全策略
常见安全事件处理:
# 1. 发现暴力破解攻击
# 临时封禁 IP(Windows 防火墙)
New-NetFirewallRule -DisplayName "Block Attacker" `
-Direction Inbound -RemoteAddress 192.168.1.100 -Action Block
# 2. 发现未授权访问
# 强制所有用户重新登录(清除会话表)
# 需要重启服务或通过 API 清除会话
# 3. 配置文件泄露
# 立即更换所有 NTRIP 凭据
# 检查审计日志确定泄露范围
Get-Content D:\rtkhub\log\audit.log | Select-String -Pattern "download|export|view_config"
相关资源
- 部署指南 - 包含 v1.2.0 到 v1.3.0 的详细升级步骤
- 配置指南 - 安全相关配置选项
- v1.3.0 Release Notes - 完整的安全修复清单