系统运维与安全加固
本章介绍 CheeseWAF 在生产环境下的日常运维操作与安全加固规范。在 Web 控制台中对应 用户管理、系统管理 与 检查更新 模块。
CheeseWAF 默认使用 storage.profile: temporary 运行,用户、Session 和管理状态保存在内置 SQLite 中。若显式指定生产模式 storage.profile: production,系统执行严格的环境校验并遵循 fail-closed 原则,在外部生产持久化数据库不可用时抛出 ErrProductionStorageUnavailable。
storage.postgresql 用于集中归档访问日志;storage.redis 端点可用于辅助缓存验证。CLI 提供 cheesewaf crp verify 与 cheesewaf crp stage 用于安全包离线校验与受保护槽位暂存;生产模式下结合策略快照与鉴权环境支持安全激活与回滚。
当前 CWEDP/NetLease 包已经包含 broker-bound HTTP/file transport、一次性租约校验、直接 IP 拨号、TLS/mTLS/NodeID/leaf pin、Range 续传和来源隔离,但尚未挂载到主 serve、节点注册或完整的插件安装/OTA 生命周期。本地 cheesewaf temporary-online probe 是独立的一次性运维工具,不是生产插件出站 API。
1. 用户管理与 CLI 凭据运维
- 统一用户名规则:初始化向导、Web 控制台、REST API、CLI、存储层、人类用户 JWT claims 和登录 CAPTCHA receipt 使用同一套用户名格式。用户名长度为 3–32 个 ASCII 字符,必须以 ASCII 字母开头、以 ASCII 字母或数字结尾,只能包含 ASCII 字母、数字、
.、_和-。非 ASCII 字符、Unicode 空白字符、控制字符(Cc)和格式/不可见字符(Cf)都会被拒绝。服务端保留原始输入,不会自动去除空格或转小写,因此admin和admin是两个不同的字符串,后者无效。 - 角色输入规则:用户
role必须精确匹配当前apisec.permissions中已配置的角色键(通常为admin或readonly)。空角色、未知角色、*/:权限表达式,以及包含首尾或嵌入 Unicode 空白、控制字符(Cc)或格式/不可见字符(Cf)的角色都会被拒绝。服务端不会自动去空格或改大小写;账号字段不合法时分别返回USERNAME_INVALID或ROLE_INVALID。 - Web 控制台与 REST API:调用
GET/POST /api/users与PUT /api/users/{id}管理账号。Web 用户管理、初始化向导和登录使用同一套校验规则。 - 命令行运维工具(
cheesewaf user):BASH - 当前用户名已经符合规则时,应使用
user rename,旧用户名和新用户名都必须通过同一套校验。命令会更新账号并撤销该账号全部未撤销的 Session,但不会写入历史用户名修复审计记录;它不能按用户名选中历史非法账号。只有repair-username会把用户名更新、撤销 Session 和写入审计记录放在同一个事务中。 - 只有历史用户名不符合当前规则时,才能使用
user repair-username,例如admin。该命令必须提供--reason和准确的不可变用户 ID。用户不存在、当前用户名已经合法,或目标用户名已被其他账号占用时,命令都会拒绝执行,也不会合并账号。用户名更新、撤销该用户全部未撤销的管理端 Session 和追加审计记录在同一个 SQLite 事务中提交。用户 ID、密码哈希、角色、TOTP 启用状态和 TOTP 密钥都会保留。审计记录包含当前操作系统用户 ID、填写的原因、旧用户名、新用户名、撤销的 Session 数量和时间。两个路径都不会自动去除空格或转小写。 - 请使用拥有 CheeseWAF 数据目录权限的操作系统账号运行修复命令。审计中的操作者来自当前操作系统用户 ID;换用其他账号运行会改变这条证据。
- 密码策略:新密码至少需要 10 个字符,并满足大写字母、小写字母、不重复数字、特殊字符 4 类中的至少 3 类。常见密码和简单模式(包括连续数字、键盘序列)会被拒绝。密码不能等于用户名,也不能包含用户名。优先使用
--password-stdin;直接使用--password可能把密码写入 shell 历史或进程列表。 - 最小权限原则:建议为日常审计监控人员创建
readonly只读角色,避免共享超级管理员账号。 - TOTP 双因素认证(2FA):支持标准 TOTP 认证。调用
/api/users/{id}/2fa/setup生成密钥与绑定二维码,并调用enable、disable或recover进行生命周期管理。 - 管理 API Token 的显示备注属于元数据,不是账号用户名,不套用账号用户名规则。不要把 Token 备注当作人类用户身份。管理 API Token 默认有效期为 90 天,最长 365 天;运行中的服务通过合并清理 worker 删除过期或连续 180 天无活动的 Token,并尝试写入审计和管理员通知。
- Web 控制台支持永久 Token 的二次确认与强核验,创建永久 Token 需完成强身份校验,未满足安全条件时返回
API_TOKEN_CONFIRMATION_UNAVAILABLE。
如需查找用户 ID,请使用 SQLite CLI 的只读模式,并且只选择 ID 和带引号的用户名,不读取密码哈希或 TOTP 密钥:
quote(username) 会让用户名前后的空格在结果中可见。不要使用 SELECT *,也不要把这段输出粘贴到工单或日志中。
2. 备份和迁移 SQLite 管理存储
执行用户名修复或升级二进制前,先根据 storage.sqlite.path 确认当前数据库和父目录。常见默认路径是本地运行时的 ./data/cheesewaf.db,以及 Linux 服务的 /var/lib/cheesewaf/cheesewaf.db。不要把这些命令指向版本库中的 configs/cheesewaf.yaml 模板。
运行中的 SQLite 通常使用 WAL 模式。CheeseWAF 运行时不要只复制主 .db 文件;最新提交可能仍在 -wal 文件中,这样得到的副本可能无法恢复。在线备份可以在服务继续运行时读取一致性快照:
完整性检查必须返回 ok,最后的校验和命令必须报告 OK;任一检查失败都应立即停止。请把备份放在受保护的位置,并按保留策略复制到异机。备份包含敏感的管理数据,不能上传到工单或粘贴到聊天中。开始前检查磁盘空间;备份期间关注 WAF 健康状态和磁盘延迟。CheeseWAF 的单一二进制同时提供数据平面和管理平面,停止它可能中断防护和业务流量。
如果无法在线备份,只能通过服务管理器停止确切的 CheeseWAF 写入进程,并确认没有其他 CheeseWAF 进程继续写入,再复制包含相邻 -wal 和 -shm 文件的一致数据库集合。重启服务前,用 PRAGMA integrity_check; 验证副本。不要使用会停止大量无关进程的命令。
当前二进制会按顺序执行 SQLite 迁移,当前 Schema 版本为 5。3 到 4 的迁移会创建只追加的 user_username_repairs 审计表,4 到 5 的迁移会为 users 和 admin_sessions 增加 credential_epoch。账号安全信息变化时会递增用户 epoch,活动 Session 必须匹配当前 epoch。这些迁移不会自动去除空格、转小写、合并或改写现有账号。只支持旧 Schema 的二进制打开新数据库时,会因 newer SQLite schema version 拒绝运行。
如果需要降级,请恢复升级前的备份,并在核对服务路径和数据路径后再启动旧二进制。不要手工修改 PRAGMA user_version。如果用户名修复成功后必须撤销,请在计划维护窗口恢复修复前备份;repair-username 会刻意拒绝把合法用户名改回非法格式。
3. 日志支持包与 CLI 语言管理
- 一键打包服务日志(Support Bundle):在遇到难以定位的异常时,执行以下命令即可一键将全部运行时日志导出为规范命名的 ZIP 支持包,便于快速交接或提交安全工单:BASH
- CLI 界面语言配置:BASH
4. NTP 时钟同步与状态校准
JWT 签名校验、TOTP 动态验证码计算以及集群节点共识均强依赖系统时钟的准确性:
- 查询时钟源:调用
GET /api/system/time-sync查询当前 NTP 时钟源与偏差。 - 强制同步:调用
POST /api/system/time-sync/sync触发即时时钟对齐。 - 重新优选:调用
POST /api/system/time-sync/reselect重新探测并选择延迟最低的 NTP 节点。
5. OTA 能力状态
- 当前运行边界:这些配置键为 OTA 更新器预留,但当前二进制没有更新 Worker。控制台的「检查更新」页面会报告
NOT_IMPLEMENTED;通过系统 API 开启 OTA 会被OTA_UPDATES_UNAVAILABLE拒绝。 - 配置安全:在更新 Worker 交付前,请保持
enabled: false。启用时,配置校验仍会检查服务器地址、通道、间隔和签名设置。 - 未来行为:
auto_update_rules、auto_update_binary和verify_signature描述计划中的签名更新策略,不表示当前会下载或安装规则、二进制。
6. 软件供应链安全与发布完整性校验
只使用实际发布版本提供的元数据。运行时不会自动生成或验证发行签名:
- SBOM:如果发行版本提供 CycloneDX 或 SPDX SBOM,请将它与部署记录一起保存,并核对其中的版本和摘要是否与收到的文件一致。
- 容器签名:如果发行版本提供 Cosign 签名,请在部署前针对确切的镜像引用进行验证。
- Windows 签名:如果 Windows 安装包带有 Authenticode 元数据,请在实际安装机器上核对签名者和证书链。
- 校验和:如果发行版本提供校验和文件,请使用
sha256sum -c checksums.txt或对应平台的工具校验确切文件。