Bor v0.8.0,8 月 2 号发的。我拖到这两天才把 changelog 从头看完。
第一遍我只看到三个新策略类型:Thunderbird、Edge for Business、firewalld 区域。
挺好。但这三条是写给谁看的,大家心里清楚——是给销售页和对比表看的。我的习惯是往下翻,翻到升级说明那几行。坑都在那儿。
这次那句是:agent 必须更新到 v0.8.0,旧版 agent 会忽略它不认识的策略类型。
看懂什么意思没有?
意思是你在 Web UI 上把 Thunderbird 策略配好,点发布,绿的。节点那边,什么都不会发生。没有报错,没有告警,没有 failed 状态。策略在数据库里躺着,agent 看了一眼,不认识,跳过。
这是我见过最贵的一类故障:静默的不生效。
Sev1 你会立刻知道。静默不生效,你要等到某次抽查、某次审计、或者哪天有人随口问一句"这策略怎么没起作用"才知道。中间那段时间,你所有的心安都是假的。
所以升级 agent 这事不能靠人记。要么 UI 上把"节点 agent 版本不支持该策略类型"当一个状态明明白白显示出来,要么发布流程里就得有一道"变更涉及的策略类型 vs 节点 agent 版本"的核对。靠记性,就是等着某天半夜随机抽一个幸运值班的。
扯远了,回来说这个版本。
Thunderbird 那条我多看了两眼。它没另起一套机制,直接沿用 Firefox ESR 那套:agent 生成托管的 policies.json,内容由所有绑定策略合并,最后一条绑定被移除就把文件恢复原状。Flatpak 和 RPM/DEB 两种装法都认。
新功能走老机制,这是我判断一个东西能不能长期维护的少数几个信号之一。另起炉灶搞个新框架,两年后原作者跑路,接手的人对着两套并行的逻辑发呆,这种事我看过太多了。
真正让我坐直了的,是后半段那些没人在发布会上提的东西。
firewalld 那块,它的写法是:区域 XML 先落到 /etc/firewalld/zones/,然后
firewall-cmd --check-config && firewall-cmd --reload
先校验,再重载。
我知道这看着像一句废话。但你去翻翻真实世界里有多少脚本是直接 reload 的。reload 完 firewalld 起不来,然后呢?然后 ssh 也进不去,因为规则没加载。第二天早上有人在机房里插显示器。
写这行 --check-config 的人,被坑过。就这么简单。
防篡改监视也是。Thunderbird 的托管 policies.json、firewalld 的区域文件,外部一改,检测到就还原。这条的价值不好往 PPT 上写,因为它防的是"人",不是"攻击"——包括你自己。
我承认我一开始判断错了。有次我手动去改一个托管文件,保存,五秒后打开,内容回去了。我以为编辑器抽风,换了个编辑器,再来一遍。也一样。折腾了小十分钟才想起来还有监控这回事。
有些功能存在的意义,就是让你半夜三点手不至于抖。它不产生任何新能力,只负责让你别把已经跑着的东西弄坏。
"服务端会阻止删除、禁用或降级最后一名 Super Admin"——这一条我给它单独一行。
因为这一条的来源不需要猜。总有人在某次清理的时候把最后一个管理员账号降级了,然后整个系统没人进得去。我见过的。不是这个系统,是别的,但剧本一模一样。
还有两条小的:
自动生成的初始管理员密码不再写进服务器日志,改成只 root 可读的文件。为什么?因为 journald 会被采集,会被送进集中日志平台,会被某个有读权限的人 grep 到。初始密码躺在日志里,跟直接发到群里区别不大。
审计日志 CSV 导出加了公式注入防护。这条不解释,写过导出的都知道。
再加上 agent 身份绑 mTLS 客户端证书、TOTP 密钥从旧的 SHA-256 透明迁移到 HKDF、PPA/COPR 导入助手只跟随白名单重定向。
这一堆东西有一个共同点:每一条背后都站着一次事故。
不是设计出来的,是踩出来的。你可以说这是被动防御,但生产环境要的就是这个。你没法预判下一脚踩哪儿,只能保证每次踩完把那个坑填上。这份 changelog 的后半段,本质是一本填坑记录。
——顺便,这几类事,恰恰是"让 agent 自动接管运维"那套说辞里最不提到的。模型不会替你想"这个操作有没有可能让我失去登录能力",它连拒绝任务都不会。这些防呆条款,人手写都费劲。
然后是 Web UI。
PatternFly 6、分组侧边栏、真实 URL、深链接、全局错误边界,策略编辑器从嵌套弹窗改成 /policies/:id/edit 独立路由页。统计卡片点 Offline,直接进已经筛好的 Nodes 页。
这些改动在我看来只有一个验收标准:天天用它的人手感有没有变好。按这个标准,这次是变好了。编辑器从弹窗里搬出来是我最想要的一条——那种套三层的弹窗,手一滑点到遮罩层,十分钟的编辑没了。现在至少能前进后退。
无障碍那部分我本来想嘲两句。为 WCAG 2.2 AA 做了一堆,还往 CI 里塞了 a11y lint 关卡。
但说实话,我上次真的有一段只能靠键盘操作……行,这条不酸了。
最后一个工程上的点,做这行的会懂:Firefox、Thunderbird、Chrome、Edge 的策略目录改成由 protobuf 注解生成,服务端、agent、前端共用同一份数据来源。
这个改动没有任何用户看得见。它的价值在于:以后不用三个地方手抄同一份策略清单,抄漏一处,那个策略就在某个环节静静地不生效——又绕回开头那个话题。
但注意,proto/policy/ 变了,基于它做外部工具的,schema 得重新生成。这个坑别踩。
本期就一条:拿到版本更新,先看 changelog 的最后五行,再看第一行。最后五行写的是它怎么防止把自己弄死,第一行写的是它想让你记住什么。
