# 部署前安全核验清单

## 页面导读

本清单用于准备把 FastBee 开源版、商业版或集群版部署到公网或生产环境的团队。官方维护代码已包含相应修复，但实例是否安全仍取决于实际代码、配置和权限；首个正式发布版本待核验的项目见[安全公告与漏洞修复](https://www.fastbee.cn/doc/blog/system-vulnerability-fixes.html)。

默认账号密码用于首次部署，用户可以在部署后自行修改，现有部署流程不变。公网或生产环境应在对外开放前完成口令与权限检查。

## 1. 开站前六项红线

* \[ ] **修改默认口令**：平台 admin、MySQL、Redis、EMQX 控制台不得继续使用默认或弱口令。任一默认口令仍可登录即未通过。
* \[ ] **关闭或加固 go-view SQL 直连接口**：不需要 `GoviewProjectDataController#executeSql` 时禁用；需要时补登录和权限校验。匿名调用可执行 SQL 即未通过。
* \[ ] **清理演示账号权限**：演示角色不得拥有 `monitor:cache:list`；商业版 V2.7.0 及以后，fastbee 游客角色使用「仅本人数据权限」。
* \[ ] **限制 SIP 暴露**：不使用视频 SIP 接入时关闭并限制 5060/5061，删除演示设备和默认凭据。
* \[ ] **关闭不需要的自助注册**：缩小低权限账号来源面；确需开放时同步完成权限和审计验收。
* \[ ] **下载接口鉴权并记录日志**：不需要的接口在网关和应用层同时禁用，保留的接口必须有认证、权限校验和访问日志。

## 2. 逐项核验

### 2.1. 默认口令与初始账号

* **检查位置**：初始化配置、各组件控制台和部署文档中的初始账号。
* **通过判定**：初始账号仅用于首次部署，公网或生产实例已全部改为高强度独立口令。
* **修复动作**：由部署用户自行修改，不改变官方提供的默认部署流程。
* **回归验证**：新口令可正常登录，旧默认口令失效，业务组件连接正常。

### 2.2. 演示账号逻辑缺陷

* **检查位置**：角色管理和演示账号所属角色的权限树。
* **通过判定**：演示角色没有 `monitor:cache:list`，不能读取其他用户登录信息；游客角色数据范围符合当前版本要求。
* **修复动作**：移除缓存监控权限，将游客角色数据权限设为「仅本人数据权限」。
* **回归验证**：使用演示账号无法访问缓存列表和其他用户数据，允许的演示功能仍可用。

### 2.3. go-view 任意 SQL 执行

* **检查位置**：`com.fastbee.controller.goview.GoviewProjectDataController` 的 `executeSql`。
* **通过判定**：未携带凭证调用不能执行 SQL，授权用户也只能执行其权限范围内的操作。
* **修复动作**：不需要该功能时删除或禁用接口；需要时增加登录和权限校验。
* **回归验证**：匿名请求被拒绝，正常大屏数据查询不受影响。

### 2.4. 存储型 XSS

* **检查位置**：新闻、通知公告、设备日志的写入和富文本渲染链路。
* **通过判定**：DOMPurify 与后端 jsoup 白名单按当前实现生效，危险标签、事件属性、脚本协议和 iframe 被移除，安全链接属性得到保留。
* **修复动作**：按当前维护代码同步前端净化、后端 `RichTextSanitizer` 和对应单元测试，不能只贴黑名单。
* **回归验证**：在隔离环境提交测试标记后不会执行，合法富文本和设备日志仍正常显示。

### 2.5. SIP XML 外部实体（CVE-2025-15251）

* **检查位置**：`ReqAbstractHandler#getRootElement` 和 SIP 服务网络配置。
* **通过判定**：解析器禁止 DTD、外部通用实体和外部参数实体；SIP 未暴露到不可信网络。
* **修复动作**：设置 `disallow-doctype-decl=true`、`external-general-entities=false`、`external-parameter-entities=false`，并限制 5060/5061。
* **回归验证**：外部 DTD 和实体请求被拒绝，正常 SIP 业务不受影响；仅升级 JDK 不算完成验证。

### 2.6. 下载接口任意文件读取（CVE-2026-7676）

* **检查位置**：`ToolController.download` 的 `fileName` 参数处理。
* **通过判定**：规范化后的目标仍位于允许下载目录内，绝对路径、目录穿越和符号链接逃逸均被拒绝，接口具有鉴权和日志。
* **修复动作**：使用规范化绝对路径并校验目录边界，不能只做字符串替换；不需要时同时禁用网关和应用入口。
* **回归验证**：隔离测试目录之外的路径不可读，正常文件仍可下载。

### 2.7. 设备组越权访问（CVE-2026-111654）

* **检查位置**：`GroupController` 及下游 service、Mapper 查询链路。
* **通过判定**：读取、更新、重新分配、设备关联变更和删除五类操作都校验设备组所有者或租户边界。
* **修复动作**：在控制器、服务和数据访问层执行一致授权，不能只隐藏前端按钮或只检查组 ID 是否存在。
* **回归验证**：用两个不同所有者的测试账号验证跨用户操作被拒绝、本人操作正常，并检查越权日志。

### 2.8. 规则脚本 Groovy 注入（CVE-2026-120274）

* **检查位置**：`/iot/script` 新增和编辑链路、Groovy 执行器装配、脚本入库与热加载路径。
* **通过判定**：`SecureGroovyScriptExecutor.compileSource` 与 `BusinessScriptInterceptor` 同时生效，编译期拒绝类/包/注解/自定义构造器，运行期默认拒绝进程、文件和反射调用。
* **修复动作**：使用包含[修复提交 `890a33846005a937a58cccd738b7fb9821b82ea9`](https://gitee.com/beecue/fastbee/commit/890a33846005a937a58cccd738b7fb9821b82ea9) 的实现，并确保脚本入库和热加载前通过同一编译器校验。
* **回归验证**：危险结构被拒绝，合法脚本可运行；普通权限账号不能取得脚本编辑能力。只删除 `import` 或隐藏编辑入口不算修复。

### 2.9. 垂直越权与数据范围

* **检查位置**：系统用户、角色、岗位、部门接口的权限注解和数据范围校验。
* **通过判定**：低权限账号访问管理员接口返回 403，非超管不能读取超管数据，列表按当前用户的数据范围收窄。
* **修复动作**：同步权限注解、`checkDeptDataScope` / `checkUserDataScope` 和异常处理；不要只隐藏菜单。
* **回归验证**：按不同所有者、部门、角色和权限档位执行矩阵测试，越权被拒绝且正常授权操作不受影响。

## 3. 上线前统一回归

* \[ ] 修复前备份程序、配置与数据，先在隔离测试环境验证兼容性。
* \[ ] 每项执行正向和反向验证：危险操作被拒绝，正常业务继续工作。
* \[ ] 使用两个不同所有者、不同权限档位的测试账号，不只使用 admin。
* \[ ] 检查访问日志、越权拒绝日志、SIP 日志和异常出站连接是否可观测。
* \[ ] 商业版授权过期或存在二次开发时，先合并目标修复并处理冲突，不要直接覆盖生产代码。
* \[ ] 按版本顺序执行升级 SQL，必要时按发布说明清理指定缓存或处理时序表结构。

## 4. 常见问题

### 维护代码已经修复，还需要做这份清单吗？

需要。维护代码修复不等于当前实例已完成升级，也不等于默认口令、开放端口和角色权限已经安全。清单用于验证实际部署。

### 默认账号密码必须删除吗？

不需要。默认账号密码用于首次部署，用户可以部署后自行修改；公网或生产环境建议上线前修改口令并限制演示权限。

### 可以在生产环境直接用攻击 POC 验证吗？

不建议。应在隔离测试环境使用无真实敏感信息的测试数据做拒绝性验证，避免影响业务和数据。
