夜雨聆风学习资料网

ARTICLE · 1054223

DSH 插件 kid-security 技术解读:把电脑安全讲成一座小城堡

DSH 插件 kid-security 技术解读:把电脑安全讲成一座小城堡

核心结论:我们把电脑安全讲成"守护一座小城堡":防火墙是门卫、磁盘加密是保险箱、锁屏密码是锁门、远程端口是暗门、登录记录是登记簿,做成五个小工具加一张常驻安检卡,每 15 秒巡一次城,小朋友一眼能看出哪道防线在偷懒,结论统一交给大人处理。

1. 背景:给小朋友讲"安全"为什么难

kidlab 电脑启蒙系列已经覆盖了存储(大仓库)、内存(工作台)、网络(数据信旅行),这一篇补上最难讲的一块:安全。防火墙、磁盘加密、远程端口这些词,对八岁的小朋友来说太抽象。

我们选择的方案还是隐喻:电脑 = 一座小城堡,安全措施 = 城堡守卫。每一项系统安全设置都对应城堡里的一位角色,检查电脑安全就变成"点名守卫有没有在岗"。

这篇文档记录 @kidlab/dsh-kid-security 插件的完整实现:五个采集工具、一张常驻安检卡,以及系列里反复翻车的一个前端老坑的最终解法。

2. 五道守卫:把安全设置讲成城堡防线

插件提供 5 个工具,全部是真执行命令型(B 型):免 sudo、命令硬编码、单命令超时容错。

守卫
城堡隐喻
检查什么
采集方式
sec_wall
护城河 / 城门守卫
防火墙(Firewall)开还是关
读系统防火墙全局状态
sec_locker
保险箱锁日记
磁盘加密 FileVault 开还是关
fdesetup status
sec_lock
离开房间锁门
自动锁屏时长 + 唤醒是否要密码
读锁屏与唤醒密码配置
sec_door
后门 / 暗门检查
SSH(远程登录)、VNC(屏幕共享)端口是否在监听
netstat
 探测 22 / 5900 端口
sec_login
城堡门口登记簿
最近登录与开关机记录
last -5

这张表的精髓在于"每道守卫只回答一个是非题"。防火墙状态 0 是关门、1/2 是开门;暗门检查只看端口有没有人监听;登记簿只看最近五条记录。模型拿到结构化结果后,翻译成小朋友听得懂的守卫报到,而不是输出一段安全术语。

3. 工程实现的四个关键坑

真机调试时我们踩了四个坑,都和"macOS 命令的真实脾气"有关:

现象
解法
权限
systemsetup -getremotelogin
 需要管理员权限
改用 netstat 探测端口,免 sudo 达成同样目标
语法
last -n 5
 报 illegal option -- n
macOS 的 last 是 BSD 语法,写 last -5
返回码
grep
 无匹配时返回码为 1,被当成命令失败
命令末尾补 || true,空结果不算失败
键缺失
askForPassword
 未单独设置时读不到
兜底文案:macOS 默认需要密码

四个坑指向同一条设计原则:B 型工具的每条命令都要假设它会失败、会超时、会输出空。单条命令失败只报一行,不中断整体采集——安检卡宁可少报一道守卫,也不能整卡崩溃。

4. 常驻安检卡:从"问一句答一句"到"一直看着"

系列插件分两种范式:静态插件是模型问一句答一句;动态插件(cordis 包)能在聊天输入条上方常驻一张卡片。安检卡走的是后者。

文件
职责
cordis/host.js
宿主侧:并发跑 7 条只读命令,聚合成 5 道守卫 + 安全分
cordis/client.js
前端:紫色城堡主题折叠卡,15 秒轮询刷新
cordis/precheck.mjs
激活前用 Node vm 校验语法
cordis/activate.md
一键激活的提示词

展开后的卡片自上而下是:安全分仪表 → 五道守卫逐一报到(状态圆点 + 一句话解读 + 「找大人」提示)→ 登记簿最近 5 条记录。状态用四档颜色:绿(在岗)、橙(有小缺口)、红(要补一补)、灰(看不清)。

版本管理上,cordis_define 追加的是不可变包:每次修改都追加新包再激活,旧包保留可随时回滚。安检卡迭代了三版(pkg-1 首跑 → pkg-2 内滚初版 → pkg-3 预算公式修正),全部验证通过。

5. 家族老坑的最终解:展开高度预算

这个问题系列里翻过两次车(kid-coder 时代两次):卡片展开后顶部看不见、卡片内划不动。根因是输入条上方的卡片区属于粘性页脚(sticky footer),展开是向上生长的;如果展开高度只按视口比例算、不扣除页脚的固定件,小窗口下预留不足,标题行就被顶出屏幕。

最终解沿用 kid-coder 沉淀的公式,真机验证通过:

.ks-detail{
  max-height
: min(calc(100vh - 450px), 480px); /* 视口 − 页脚全部固定件,另设绝对上限 */
  overflow-y
: auto;                            /* 守卫列表在卡片内部滚动 */
  overscroll-behavior
: contain;                /* 滚到底不带动会话窗口 */
}

450px 的推导:输入框、卡片区、其余四张折叠卡加上本卡标题行约 430px,再留 20px 余量。

关键洞察:这个预算是"家族规模"的函数——家族每多一张常驻卡,所有卡的预留都要跟着加一档。余量加大只影响卡片内滚长度,没有副作用,宁多勿少;预留不足则老毛病必然复发。

最终效果

6. 结论与行动建议

kid-security 补齐了"认识这台电脑"的启蒙拼图:kid-storage 管大仓库、kid-memory 管工作台、kid-security 管城堡守卫。安检的口径是启发式的——端口在监听不等于一定有入侵,登记簿出现陌生名字不等于一定是坏人,所以卡片文案统一用「找大人」收尾,结论交还家长,不吓唬小朋友。

发布前还有四件事要办:

  1. 1. package.json 的 files 补上 lib/config.js / lib/tools.js,否则 npm pack 出来的包是坏的。
  2. 2. 静态工具 sec_wall 同步区分防火墙最严格档(globalstate = 2),与安检卡口径对齐。
  3. 3. 补 README、LICENSE、.gitignore 与最小测试集。
  4. 4. 本机沙箱里 tsc 对 kidlab 插件 segfault(环境问题非代码缺陷),构建必须在沙箱外复核。

相关学习资料