安全模型
Kurrent 的安全边界不是一条线,而是四组彼此独立的信任:
| 边界 | 保护对象 | 信任锚 |
|---|---|---|
| 管理面 | 谁可以调用管理接口 | users CA 证书 / 管理 token / 服务端会话 |
| 组件面 | 哪些存储节点组件可以加入与续期 | nodes CA + 绑定节点身份的 bootstrap token + CRL |
| 设备面 | 哪台机器可以取得某次引导的凭据 | 设备 NVRAM 私钥 + 注册窗口 + 绑定关系 + TOFU |
| 数据面 | 谁可以连接、内容是否加密 | DH-HMAC-CHAP + TLS 1.3 PSK |
四者不能互相替代。管理面被攻陷不等于设备可以冒领引导凭据;设备密钥泄露也不等于可以访问管理面。
威胁模型
假定的前提
- 控制面宿主、存储节点宿主与网络设备由受信任的运维方管理;宿主 root 被攻陷视为对应边界的失守。
- PXE 网段是独立信任边界,且由部署方完成二层防护。
- 设备物理访问受控;能够物理接触设备并重置 NVRAM 的攻击者不在本模型内。
- 运维人员按最小权限使用管理凭据;备份与密钥存储由部署方保护。
保护目标
- 未授权主体不能通过管理面读取台账、修改绑定、签发凭据或执行写操作。
- 未认领、未绑定或验签失败的设备不能取得其他 Worker 的引导变量。
- 已吊销的组件与用户不能继续通过 mTLS。
- NVMe/TCP 数据面内容在传输中加密;缺少凭据时拒绝引导,不回落明文。
管理面
入口收敛
- 唯一对外入口是 nginx
443;控制面服务不监听 TCP,只监听容器内 unix socket。 - 身份头仅信任 nginx 注入;其他反代位置默认清空。若开放第二个入口或允许外部注入身份头,管理面认证即可被绕过。
- 控制面容器不挂载
docker.sock。
主体类
nginx 按证书 issuer 判定主体类:
- users CA →
human; - nodes CA →
component; - control 域不进入 443。
每个路由声明接受的主体类,未声明的路由在启动期即失败。跨类访问返回 403:组件证书不能进入管理面,人类证书不能调用组件续期。
凭据
| 凭据 | 保护 |
|---|---|
| 人员证书 | 私钥由用户本地生成与保管;控制面只签 CSR;按序列号吊销 |
| 管理 token | 台账只存摘要;scope 收窄权限;TTL 与吊销 |
| 会话 | Cookie 只含 jti/exp/epoch;身份以服务端台账为准;可逐个吊销与全部下线 |
读请求只需已认证,写请求需要 admin 组;会话写请求额外做同源校验。
审计
每个管理请求写一条审计记录;写入失败时请求返回 503(fail-closed),不允许在失去审计能力时继续执行写操作。告警覆盖凭据注入未验签、跨类访问、未知 issuer/CRL、认证失败风暴、bootstrap 身份不符、证书与 CRL 变更、用户文件变更与审计失败。
组件面
- 组件证书由 nodes CA 签发;首次加入需要绑定
agent_id的 bootstrap token,默认一次性。 - 组件在到期前 renew;控制面校验对端证书的序列号与 CRL。
- 组件周期拉取 nodes CRL;CRL 缺失或过期时 fail-closed,不降级放行。
- 吊销组件会同时删除其 bootstrap token,堵住“吊销后立刻换发新证书”的窗口。
- 被吊销节点通过重新签发 token 与
kurrent join恢复;恢复过程无需手工删除旧证书。
设备面
锚点
- 设备私钥在 NVRAM 内生成并持久化(ECDSA P-256),私钥不出机器。
- 注册窗口只决定“是否入池”,不授予引导权限。
- 绑定关系是设备侧的
bound_worker_id;/boot-vars校验请求 MAC 是否属于该 Worker 的绑定设备。 - 挑战-应答使用一次性 nonce 与 ECDSA 签名;验签强制开启后,无密钥、无签名或验签失败一律拒绝。
- 服务器证书 TOFU:首次握手固定叶证书指纹,后续不匹配即拒绝。
明确的边界
- 首跳没有密码学保护。DHCP 与 TFTP 上的
snponly.efi、boot.ipxe由设备固件直接信任。同一二层内的攻击者可以伪造 DHCP/ARP、替换首跳文件。部署要求把 PXE 网段隔离,并启用 DHCP snooping、动态 ARP 检测、RA guard 与端口安全;这是部署边界,不是产品内部的密码学闭环。 - 设备密钥是持有者凭证。挑战-应答证明“请求方持有该私钥”,不证明“运行该私钥的代码可信”。启动后的系统若能读取固件变量,也能使用该密钥。主线固件未签名、未使用 TPM 度量,因此这一路径目前没有产品内的闭包。
- TOFU 首次信任。首次连接时不校验 CA,而是固定叶证书指纹;第一次握手可能被中间人利用。控制面证书轮换后,设备必须重新信任,否则拒绝连接。
- 物理访问。能够接触设备并重置 NVRAM 的攻击者可以清除密钥与指纹,退化为“未注册设备”。这种设备仍受注册窗口与绑定约束,但原身份锚点已丢失。
数据面
- 认证:DH-HMAC-CHAP,target 侧按
allowed_hosts限制 Host NQN。 - 加密:TLS 1.3,单端口
4421,固件段与内核段共用。 - PSK 由认证密钥派生,不单独存储;轮换/吊销认证密钥即原子地轮换/吊销 PSK。
- PSK 在存储节点落入内核
.nvmekeyring;tlshd >= 1.5.0与进程 keyring 优先是避免旧钥遮蔽新钥的前提。 - nvmet 后端缺少密钥或端口未就绪时,控制面不下发完整引导变量;非 nvmet 后端不投影 NVMe-oF 凭据。
menu.ipxe在缺少必要变量时直接失败,不拼接明文 URI。
静态明文边界
DHHC-1、派生 PSK、设备私钥与 CA 私钥以明文形式存在于必要位置:
- 控制面状态文件(0600);
- Agent 缓存(0600);
- 存储节点 configfs 与内核 keyring;
- 设备 NVRAM。
Kurrent 不在应用层再加密这些位置。部署方需要负责磁盘/备份加密、宿主 root 边界与物理安全。
当前不解决的问题
- 首跳替换与同二层攻击:依赖 PXE 网段隔离与二层防护。
- 启动后读取设备私钥:未使用 Secure Boot/TPM 度量,未签名固件。
- 控制面或存储节点宿主 root:视为对应边界失守。
- 物理访问与 NVRAM 重置:需要重新注册。
- 可用性攻击:DHCP 池耗尽、认证端点限速与资源耗尽没有完整的抗 DoS 设计。
- 控制面高可用:单节点、文件状态;宿主故障需要备份恢复。
- 密钥静态加密:由部署方负责。
可选的强化方向
以下方向尚未合入主线,不作为当前部署的默认前提:
- Secure Boot + 固定信任锚:签名 iPXE、内置引导脚本、固定 CA,关闭首跳替换。它不能阻止启动后的系统读取并外带设备私钥。
- TPM 度量启动/远程证明:把设备身份与运行代码绑定,关闭“密钥被启动系统使用”的路径。
- 单一密钥的 UKI 方案:把引导组件与配置收敛为可签名单元,减少受信链中的可变部分。
这些方向涉及信任根与部署流程的重新设计;在完成端到端验收前,不应在文档或部署中宣称已具备。
部署检查清单
- [ ] PXE 网段独立,控制面是唯一 DHCP/TFTP 提供者。
- [ ] 交换机启用 DHCP snooping、动态 ARP 检测、RA guard、端口安全;有条件时启用 802.1X/MAB。
- [ ] 控制面只暴露 22、53/67/69、80/443;存储节点只暴露 4840/4421(按需限制来源)。
- [ ]
host-baseline.sh无 FAIL;CA 私钥、admin.conf、凭据与审计文件为 600。 - [ ] 注册窗口按需开启并设置放行额度,用后关闭。
- [ ] 验签强制在设备认领完成后开启。
- [ ] 人员证书按需签发,离职或泄露立即吊销。
- [ ] 定期检查 CRL 刷新、凭据推送与审计告警。
- [ ] 备份加密保存,并验证恢复流程。
- [ ] 固件产物来自可信来源并校验
SHA256SUMS。