收起左侧

飞牛系统硬盘数据加密方案-已测试1.1.3107版

5
回复
1012
查看
[ 复制链接 ]

0

主题

2

回帖

0

牛值

江湖小虾

2026-6-16 14:47:07 显示全部楼层 阅读模式

[教程] FNOS ZFS 原生加密存储 — 5 种存储模式 · 密钥管理 · 系统恢复向导

适用平台: 飞牛 FNos v1.1.3107 (Debian 12 Bookworm) + ZFS 2.4.1+
配套工具: fnos-encrypted-storage.sh (4395 行) + 15 章 HTML 运维手册
配套阅读: 另有 VeraCrypt 加密容器运维方案 适合跨平台便携加密场景


📌 背景

FNOS WebUI 只支持创建明文 ZFS/LVM 存储。如果你想在 FNOS 上使用加密存储,WebUI 没有任何入口。

fnos-encrypted-storage.sh 填补了这个空白 —— 在 FNOS WebUI 之外通过命令行创建和管理 ZFS 原生加密存储(AES-256-GCM),数据正常在 FNOS WebUI 内挂载显示和管理。ZFS 加密在 dataset 层实现,对 FNOS 完全透明。

如果你需要:

  • FNOS NAS 上创建加密存储,数据在 WebUI 正常显示
  • 物理磁盘丢失也不怕数据泄露(AES-256-GCM 硬件加速)
  • 重装系统后一键恢复所有加密存储池
  • 比 LUKS 更深的集成 —— ZFS 原生加密 + 快照 + 发送/接收
  • 5 种存储拓扑灵活选择(单盘 / Mirror / RAIDZ1 / dRAID1 / Stripe)

那么这个脚本就是你的最佳选择。它把 ZFS 加密的命令行复杂度封装成交互式菜单 + 智能推荐 + 防呆校验


🎯 解决的核心痛点

痛点 这个方案怎么解决
FNOS WebUI 无法创建加密存储,LVM/ZFS 都只能明文 在 WebUI 之外操作 ZFS 原生加密,通过 mount 表注册让 WebUI 正常识别和显示
重装 FNOS 后加密存储全部"消失",不知道如何恢复 启动时自动扫描未导入的 ZFS 池 + 系统恢复向导 (6 步全流程:密钥→导入→解锁→注册→目录→服务)
不知道选什么存储拓扑,单盘怕丢 / Mirror 嫌浪费 / RAIDZ 怕慢 智能推荐引擎:检测磁盘数量/类型/大小,自动推荐最佳模式 (NVMe→dRAID1, HDD→Mirror, 3盘+→RAIDZ1)
忘记加载密钥 = FNOS WebUI 显示"未挂载" 一键安装 systemd 自动解锁服务,启动顺序保证 zfs-unlock → trim_init → trim_main → WebUI
密钥文件丢了 = 数据永久丢失,但不知道怎么备份 GPG 加密备份 + 目录批量恢复 + 手动单文件恢复 三种模式,自动检测**密钥
磁盘上有加密数据但自己不知道,重装后误覆盖 zpool import 扫描未导入池,环境检测报告 + 主菜单显眼警告,防止误操作
mount 表 ↔ ZFS 池 ↔ 挂载点 不一致,WebUI 显示混乱 一致性检查 + 一键修复 (清理**/补全缺失/ID 压缩重编号)
ZFS acltype=posix 导致挂载点根目录 000 权限,WebUI 认为"未挂载" 自动 chmod 755 修复 + POSIX ACL 初始化匹配 FNOS 原生行为

🚀 快速体验

# 1. 交互式菜单(默认)
chmod +x fnos-encrypted-storage.sh
sudo bash fnos-encrypted-storage.sh

# 2. 仅检测环境(不进入菜单)
sudo bash fnos-encrypted-storage.sh --detect

# 3. 查看帮助说明
sudo bash fnos-encrypted-storage.sh --help

# 4. 查看版本
sudo bash fnos-encrypted-storage.sh --version

菜单预览:

╔══════════════════════════════════════════════════════════════════╗
║                                                                  ║
║     FNOS 加密存储 — ZFS 原生加密 自动化运维脚本                  ║
║     v2.0.0  |  FNos v1.1.3107  |  ZFS 2.4.1+                   ║
║                                                                  ║
╚══════════════════════════════════════════════════════════════════╝

  ✓ 环境就绪  |

  ⭐ 建议: 创建加密存储 (菜单选项 1)

  1) 创建加密存储    ── 新建 ZFS 加密存储池并注册到 FNOS
  2) 管理已有存储    ── 查看/解锁/锁定/删除存储池
  3) 密钥管理        ── 备份/恢复/生成密钥
  4) 系统维护        ── 自动解锁, 启动顺序, 一致性检查, 修复
  ──────────────────────────────────────────────────────────────
  5) 环境检测报告    ── 显示完整系统扫描结果
  H) 帮助说明        ── 工作原理与常见问题
  0) 退出

  请选择 [1-5/H/0]:

🔬 核心功能深度解析

1. 环境检测 —— 磁盘扫描 + 未导入池发现

这是脚本最重要的安全机制:启动时自动扫描磁盘上的 ZFS 残留,防止误覆盖加密数据

扫描维度:
  **─ 系统盘识别       → 自动排除 / 所在磁盘 (nvme0n1)
  **─ 系统盘空闲分区   → 检测可用的系统盘剩余分区 (如 nvme0n1p3, 保护 GPT)
  **─ 可用数据磁盘     → lsblk 全盘扫描, 排除 < 1G / 回环 / 已挂载
  **─ ZFS 池发现       → zpool list 列出已导入池 + 加密/密钥/挂载状态
  **─ 磁盘占用检测     → zpool status 解析每个池的物理盘映射
  **─ 未导入池扫描 ★   → zpool import (扫描模式) 发现重装后未导入的加密池
  **─ 密钥匹配检测     → 检查 KEY_DIR/BACKUP_DIR 是否有未导入池的 .key 文件
  **─ mount 表同步     → PostgreSQL trim.public.mount 读取现有注册记录

检测到未导入加密池时的警告:

╔══ ⚠ 发现未导入的 ZFS 存储池 — 磁盘包含加密数据! ══╗
  🔒 trim_80930f0f-dc25-48c0-a8c3-056aab575fb2
     状态: ONLINE  **  磁盘: Samsung 980 PRO 1TB (nvme1n1p1)
     🔑 密钥备份已找到: /home/admin/fnos-key-backups/trim_80930f0f-...key
║ ⚠ 上述磁盘包含加密数据! 请勿执行"创建存储"操作!   ║
║ 💡 请使用: 系统维护 → 系统恢复向导                    ║

安全保证: 即使你忘了磁盘上有加密数据,脚本也会在环境检测报告和主菜单中显眼警告,防止误操作覆盖。这是重装系统后最关键的防护。

2. 五种存储模式对比 + 智能推荐

脚本支持 5 种 ZFS 存储拓扑,每种都有清晰的适用场景和风险提示:

模式 最少磁盘 可用容量 数据安全 重建速度 适合场景
Stripe 单盘 1 100% 容量 ❌ 差 ❌ 无 临时/缓存文件
Stripe 多盘 (RAID0) 2 N×100% 容量 ❌ 差 ❌ 无 影音/可重建资源
Mirror (RAID1) 2 50% 总容量 ✅ 强 中等 照片/文档/工作
RAIDZ1 3+ (N-1) 容量 ✅ 强 ⚠ 很慢 3盘+大文件归档
dRAID1 2 (N-1) 容量 ✅ 强 最快 SSD 核心数据 ★

智能推荐规则:

磁盘情况 推荐模式 理由
1 个空闲磁盘 Stripe 单盘 唯一选择
2 块 NVMe SSD + 大小相近 dRAID1 SSD 优化,故障重建最快
2 块 HDD + 大小相近 Mirror 经典镜像,稳定可靠
3 块及以上 + 大小相近 RAIDZ1 N-1 容量效率最高
大小差异 ≥ 20% 单盘 (选最大) 避免浪费大容量盘
存在未导入加密池 系统恢复 优先恢复,禁止新建
# 创建菜单中随时按 ? 查看完整对比表
# 智能推荐会在菜单中直接提示:
⭐ 智能推荐: dRAID1

⚠️ 2 块盘不要选 RAIDZ1 — 可用容量同样是 50%,但写入慢、重建慢,没有任何优势。

3. 系统恢复向导 —— 重装后 6 步全流程恢复

这是重装 FNOS 系统后最核心的功能。脚本会自动检测磁盘上的加密 ZFS 数据,然后引导你完成:

Step 1/6: 恢复密钥文件
  → 自动扫描 BACKUP_DIR 中的 .key 文件
  → 批量恢复 + 匹配未导入池验证
  → 支持自定义目录路径

Step 2/6: 扫描并导入 ZFS 存储池
  → zpool import 扫描所有可导入池
  → 显示每个池的状态 + 磁盘 + 密钥匹配情况
  → 支持一键全部导入或逐个确认

Step 3/6: 加载密钥并挂载存储池
  → 遍历所有加密池,自动用 keyfile 解锁
  → keyfile 失败时自动降级为交互式密码输入
  → 自动修复 acltype=posix 挂载点权限

Step 4/6: 注册到 FNOS mount 表
  → 检测未注册的池 → 自动分配 /vol{N} 编号
  → INSERT INTO public.mount ... ON CONFLICT 安全更新

Step 5/6: 初始化用户目录结构
  → 创建 /vol{N}/1000/ (绕过 FNOS 内核纯数字目录限制)
  → 设置 POSIX ACL 匹配 FNOS 原生行为
  → 创建 thumb/1000/ 缩略图目录

Step 6/6: 安装启动自动解锁服务
  → 创建 /etc/systemd/system/zfs-unlock.service
  → 写入 /usr/local/sbin/zfs-unlock-all.sh
  → systemctl enable → daemon-reload

恢复完成后输出完整状态总结:

╔══ ✅ 系统恢复流程完成! ══╗

恢复后状态:
  ZFS 池:    2 个
  mount 表:  2 条记录

当前挂载状态:
  trim_xxx → /vol1 (已挂载)
  trim_yyy → /vol2 (已挂载)

  自动解锁: 已安装

ℹ 建议: 重启系统验证 FNOS WebUI 中存储是否正常显示

4. 密钥管理体系 —— 备份 · 恢复 · 清理

密钥约定:
  /etc/zfs/keys/<pool_name>.key     ← 标准密钥路径 (chmod 400)
  ~/fnos-key-backups/               ← 备份目录 (自动检测实际用户)

三种备份方式:
  1) GPG 加密打包 → fnos-zfs-keys-backup-20260621-143052.tar.gz.gpg
  2) 无 GPG 时 → 未加密 tar.gz (chmod 600, 仅 root 可读)
  3) USB 自动检测 → 直接备份到已挂载的 USB 设备

三种恢复方式:
  1) 从目录批量恢复 → 扫描 BACKUP_DIR 中所有 .key 文件 → 匹配未导入/已导入池
  2) 从 GPG/tar.gz 归档恢复 → 自动扫描常见备份位置 → 解密解包
  3) 手动复制单个密钥 → 选择目标存储池 → cp + chmod 400

**密钥清理:
  → 扫描 /etc/zfs/keys/ 中无对应 ZFS 池的 .key 文件
  → 逐个确认删除 (推荐) 或一键全部删除
  → 列出有效密钥 + **密钥 清晰对比

5. 启动自动解锁服务 —— systemd 集成

ZFS 加密池在重启后处于锁定状态,必须加载密钥才能挂载。如果 FNOS 服务先于密钥加载启动,WebUI 会显示"存储未挂载"。

脚本自动生成并安装 systemd 服务,保证正确的启动顺序:

期望启动顺序:
  boot
    → zfs-unlock.service   ← 加载密钥, mount ZFS
    → trim_init.service    ← 扫描块设备, 装配 md/LVM
    → trim_main.service    ← 加载 storage.hdl, 读取 mount 表
    → trim_http_cgi.service ← WebUI API 可用
# 服务文件: /etc/systemd/system/zfs-unlock.service
# 解锁脚本: /usr/local/sbin/zfs-unlock-all.sh
# 解锁日志: /var/log/fnos-zfs-unlock.log

# 脚本自动设置:
#   Before=trim_init.service        ← 关键! 保证先于 FNOS 启动
#   WantedBy=zfs-import.target

解锁脚本逻辑(自动生成):

  • 遍历 /etc/zfs/keys/*.key → 解析 pool 名
  • 检查 pool 是否存在 → 检查是否已解锁
  • 未解锁 → zfs load-key -L file://...zfs mount
  • 自动修复 acltype=posix 挂载点 000 权限
  • 全部完成后 zfs mount -a 兜底
  • 全部操作写入 /var/log/fnos-zfs-unlock.log

✅ 安装后重启验证:sudo bash fnos-encrypted-storage.sh → 系统维护 → 验证启动顺序

6. 一致性检查与修复

随着时间推移,可能出现 mount 表与 ZFS 实际状态不一致的情况(手动操作、升级、迁移等导致)。脚本提供完整的诊断和修复工具:

一致性检查(3 维度交叉验证):

【1. mount 表 ↔ ZFS 池】
  ✓ mount.uuid=trim_xxx → ZFS 池存在
  ✗ mount.uuid=trim_orphan → ZFS 池不存在 (**记录)
  ✗ ZFS 池 trim_new → mount 表无记录 (未注册)

【2. mount 表 ↔ /vol 挂载点】
  ✓ /vol1 → 已挂载
  ⚠ /vol2 → 未挂载

【3. 加密状态】
  ✓ trim_xxx: 加密=aes-256-gcm, 密钥状态=available

一键修复功能:

修复项 操作
未注册的 ZFS 池 自动 INSERT 到 mount 表,分配 /vol{N}
** mount 记录 确认后 DELETE FROM mount
ID 编号不连续 压缩重编号 (卸载→改 ZFS mountpoint→改 mount 表→重新挂载)

🔄 与 VeraCrypt 加密方案的对比

维度 ZFS 原生加密 ★ VeraCrypt 容器
加密层级 内核级 (ZFS dataset) 用户态 (FUSE)
性能 ⚡⚡⚡⚡⚡接近**盘 ⚡⚡⚡ 有 FUSE 开销
跨平台 ❌ Linux/BSD only Win/Mac/Linux
加密算法 AES-256-GCM AES / Twofish / Serpent / Camellia + 级联组合
快照/克隆 ZFS 原生 snapshot ❌ 需外部工具
密钥轮换 秒级 (Wrapping Key) ❌ 需重建容器
卷头备份恢复 ❌ 无独立头备份 内置头备份/恢复/演练
双因子认证 keyfile 或 passphrase 密码 + keyfile 同时使用
便携性 ❌ 需 ZFS 支持 单文件容器,复制即备份
FNOS WebUI 集成 mount 表注册,原生显示 ⚠ 挂载后文件管理器可访问
学习成本 中高 低 → 中
适合场景 NAS 主力存储 跨平台交换 / 冷备份 / 便携加密

💡 建议: 飞牛 NAS 主力存储用 ZFS 原生加密(性能优先 + WebUI 原生集成),敏感文件跨平台交换 + 冷备份用 VeraCrypt 容器(便携优先)。两者互补,不是替代。详见 VeraCrypt 加密容器运维方案ZFS 加密存储 HTML 手册


📖 HTML 运维手册(15 章离线可读)

单文件 HTML,暗色主题,浏览器直接打开:

章节 内容
方案总览 — ZFS 原生加密 vs VeraCrypt 选型指南
ZFS 加密原理 — AES-256-GCM / dataset 层级 / 密钥体系
环境检测体系 — 磁盘扫描 / ZFS 池发现 / 未导入池检测
五种存储模式详解 — Stripe / Mirror / RAIDZ1 / dRAID1 对比
创建加密存储完整流程 — 分区 → 池创建 → 挂载 → 注册
FNOS mount 表注册机制 — PostgreSQL public.mount 详解
密钥管理体系 — 生成 / 备份 / 恢复 / **清理
存储池管理 — 解锁 / 锁定 / 删除 / 详情查看
系统恢复向导 — 重装后 6 步全流程恢复
启动自动解锁服务 — systemd 集成 + 启动顺序
十一 修复与诊断 — 一致性检查 / mount 表修复 / ID 压缩
十二 交互式菜单导航 — 4 大子菜单 + 快捷操作
十三 日常运维命令参考 — CLI / 环境检测 / 日志
十四 紧急恢复速查卡 — 重装后 4 条命令恢复全部
十五 脚本完整说明 — 版本 / 架构 / 函数总表

📦 文件清单

fnos-encrypted-storage.sh   (4395 行) — shell 脚本,4 个子菜单,50+ 个函数
fnos-encrypted-storage.html (800+ 行) — 15 章离线 HTML 手册,暗色主题

依赖: ZFS ≥ 2.4.1、PostgreSQL 15 (FNOS 内置)、bash ≥ 4.0、sudo
可选依赖: gpg(密钥加密备份)、setfacl(POSIX ACL 设置)
适用版本: 飞牛 FNos v1.1.3107 (Debian 12 Bookworm, Linux 6.18.18-trim)

所有文件不含任何真实密钥、密码或个人信息,可直接开源使用。


⚠️ 重要提醒

  1. 创建后立即做三件事: ① 安装自动解锁服务 ② 备份密钥文件到安全位置 ③ 确认 FNOS WebUI 中存储正常显示
  2. 密钥备份 = 救命稻草/etc/zfs/keys/ 中的 .key 文件必须备份到独立介质。密钥丢失 = 数据永久不可恢复
  3. 重装系统后不要手动 zpool create — 先用 --detect 检查是否有未导入的加密池,再用系统恢复向导
  4. RAID 不是备份 — Mirror / RAIDZ1 只防磁盘故障,不防误删/勒索/火灾。重要数据仍要 3-2-1 备份
  5. 系统盘空闲分区(如 nvme0n1p3)谨慎使用 — 它不参与多盘 Mirror/RAIDZ 模式,仅用于单盘
  6. 启动顺序至关重要 — zfs-unlock.service 必须在 trim_init.service 之前启动。用「验证启动顺序」功能检查

🙋 反馈与改进

这套方案在飞牛 FNos v1.1.3107 (Debian 12, ZFS 2.4.1+) 上完成 5 轮逆向验证,覆盖:

  • ZFS 加密参数与 FNOS storage.hdl 二进制逆向匹配
  • mount 表字段与 pool_type=2 (ZFS) 完整注册流程
  • acltype=posix 权限修复 (getfacl /vol1/1000 实际提取)
  • FNOS 内核模块 trim-mounts-hash 纯数字目录名限制绕过
  • 系统盘空闲分区识别与保护 (不重建 GPT)
  • zpool import 扫描未导入池防误覆盖
  • 6 步恢复向导端到端测试

如果你:

  • 在其他 FNOS 版本上测试遇到问题
  • 有新的存储拓扑需求(如 RAIDZ2 / dRAID2 / special vdev)
  • 想集成更多自动化功能(如定时 scrub / SMART 监控)

欢迎在帖子里交流讨论 🎉


飞牛 FNos v1.1.3107 · Debian 12 Bookworm · ZFS 2.4.1+ · AES-256-GCM 原生加密 | 2026.06.22

收藏
送赞 1
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

2

回帖

0

牛值

江湖小虾

2026-6-16 14:53:01 楼主 显示全部楼层

物理设备SSD1+2块盘zfs-5种模式均已通过测试,重装系统后导入密钥一键恢复,重启无异常。

大家好,其实写这个脚本的初衷非常朴素:我只是有点代码洁癖和强迫症,受不了明文密钥和系统盘睡在同一个房间里。本来只想写个十几行的脚本,把密钥塞进 TPM 就完事了。结果写着写着:发现飞牛不支持 Secure Boot,发现内核一更新 PCR 就漂移,开不了机,再一想,万一用户手滑删了密钥没备份,跑来骂我怎么办?加个 GPG 备份和防呆回环校验……等我回过神来,这玩意儿已经膨胀成 5000 多行的“企业级安全工程”了。没办法,代码既然都写了,不如开源攒点人品。大家随便用,有 Bug 算我输 hug (开玩笑的,私信留言我肯定改,只要我不忙)最后,如果这个脚本救了你一命(比如主板烧了但你有 Base64 恢复密钥),不用谢我,请默默给个 赞handshake 就行。

脚本和手册均产自DeepSeek,如有不妥请自行修改测试。upload 附件:fnos-encrypted-storage.zip

Snipaste_2026-06-21_01-42-05.png

Snipaste_2026-06-21_01-13-03.png

Snipaste_2026-06-21_01-14-52.png

Snipaste_2026-06-21_01-15-54.png

Snipaste_2026-06-21_01-16-18.png

----------------华丽且高级的分割线----------------

[高级安全教程] FNOS TPM 密封密钥管理 — 6 级 PCR 策略 · 双因素认证 · 智能恢复向导

适用平台: 飞牛 FNos v1.1.3107+ (Debian 12 Bookworm) + TPM 2.0 + tpm2-tools ≥ 5.4
配套工具: fnos-tpm-storage.sh (5367 行) + 15 章 HTML 运维手册
前置阅读: 先通过 FNOS ZFS 原生加密存储方案 创建 ZFS 加密存储池,再通过本文用 TPM 2.0 保护密钥


📌 背景

fnos-encrypted-storage.sh 让 FNOS 有了 ZFS 原生加密存储。但密钥以明文文件(chmod 400)存储在同台机器的 /etc/zfs/keys/ 下。这带来一个根本性缺陷:

整机被盗 → 攻击者拆下系统盘 → 读取 .key 明文 → 挂载数据盘 → 加密形同虚设。

fnos-tpm-storage.sh 填补了这个安全缺口。它把 ZFS 加密密钥从「系统盘上的明文文件」密封进主板 TPM 2.0 安全芯片,解封需要同时满足:

  1. 同一台物理设备 — TPM 芯片绑定
  2. 启动链未被篡改 — PCR 值(固件/GRUB/内核哈希)与密封时一致
  3. (可选)人工 PIN — 双因素认证,整机被盗正常开机也无法解封

如果你在物理安全不可控的环境中使用 FNOS NAS(住宅、办公室、异地部署),或者在意「磁盘被物理窃取」的威胁模型,那么这个脚本就是你需要的方案。


🎯 解决的核心痛点

痛点 这个方案怎么解决
密钥明文在系统盘上,整机被盗时攻击者拆盘读 .key → 加密失效 将密钥密封到主板 TPM 2.0 芯片,拆盘到另一台机器 TPM 拒绝解封
攻击者通过 GRUB 改 init=/bin/bash,绕过登录直接拿到 root shell PCR 8/9 验证内核命令行和内核镜像,改动即失配,TPM 拒放行
小偷正常开机(零篡改),PCR 全匹配 TPM 自动放行 → 数据在登录前已解密 模式 B (PCR+PIN) 在密钥释放前要求人工输入 PIN,屏障前移到锁上
固件/BIOS/GRUB 更新后 TPM 解封失败,不知道如何恢复 --reseal 用当前 PCR 值重新密封,3 级密钥回退(TPM→.key→离线恢复密钥)
TPM 芯片故障或主板更换,密封密钥全部作废 离线恢复密钥(base64 抄录纸本 + GPG 加密文件)作为最终恢复手段
不知道选什么 PCR 策略,既怕太简单不安全,又怕太复杂频繁维护 6 级策略菜单 + 智能推荐 + 运行时验证(检测未测量的 PCR 并阻止),飞牛 Secure Boot 自动排除 PCR 7
密封后 .key 文件不敢删,但留在磁盘上 TPM 保护形同虚设 智能密钥清理:4 项安全检查 → 5 级判定(✅安全→⚠️注意→🔴高风险→❌拒绝),安全时才允许删除
忘记 TPM PIN,反暴力破解保护下 PIN 无法重置 恢复向导场景 6:用 .key 备份恢复 → 删除旧 PIN 密封 → 换新 PIN 重新密封
不知道重启后 TPM 能否正常解封,不敢重启 --pre-reboot-check 模拟启动时的 TPM 解封流程,逐个池验证 PCR 是否匹配

🚀 快速体验

# 1. 交互式菜单(默认)
chmod +x fnos-tpm-storage.sh
sudo bash fnos-tpm-storage.sh

# 2. 仅检测 TPM 环境(不进入菜单)
sudo bash fnos-tpm-storage.sh --detect

# 3. TPM 密封状态总览
sudo bash fnos-tpm-storage.sh --status

# 4. 查看帮助说明
sudo bash fnos-tpm-storage.sh --help

# 5. 查看版本
sudo bash fnos-tpm-storage.sh --version

菜单预览:

╔══════════════════════════════════════════════════════════════╗
║     FNOS TPM 密封密钥管理 v2.0.0                            ║
║     ZFS 加密存储 — TPM 2.0 安全增强组件                     ║
║     PCR 默认: sha256:0,4 (基础: 仅固件+GRUB)  **  TPM 2.0 就绪     ║
╚══════════════════════════════════════════════════════════════╝

【TPM 密钥管理】
  1) 🔐 密封密钥到 TPM       (.key → .tpm + TPM 保护)
  2) 🔓 手动解封密钥         (从 TPM 解封并加载到 ZFS)
  3) ⚙ 重新密封               (固件/BIOS/GRUB 更新后)
  4) ❌ 移除 TPM 密封          (降级到文件密钥模式)

【系统集成】
  5) ⚙ 安装启动自动解锁服务   (生成 TPM 感知的 zfs-tpm-unlock)
  6) ❌ 卸载启动自动解锁服务   (恢复手动解锁)
  7) ✅ 验证启动顺序           (检查服务依赖链)

【密钥安全】
  8) 🔑 备份 TPM 密封密钥     (GPG 加密存档 .tpm + .key)
  9) ⚠ TPM 恢复向导          (诊断和修复 TPM 相关问题)
  K) ✅ 智能密钥清理         (安全检查后删除 .key 明文)

【诊断】
  D) 💠 TPM 全面诊断          (硬件/工具/SB/PCR/密封池/漂移/服务)

  0) 退出

  请选择 [1-9/D/K/0]:

🔬 核心功能深度解析

1. 威胁模型 — 理解 TPM 保护什么,不保护什么

这是使用 TPM 之前必须理清的认知。开机链是这样的:

UEFI → GRUB → kernel → initramfs → TPM 解封 → zfs load-key → mount → 登录界面
                                        ↑ 密钥在此释放,数据已成明文

关键认识:登录界面在数据解密之后。 系统密码守的是「已解密数据上的用户态门禁」,不是加密锁本身。物理在手的人不走登录界面——他走启动链上游。

三条典型绕过路径(纯 PCR 自动解锁场景下):

攻击路径 方法 纯 PCR 能否防住 PCR+PIN 能否防住
A —init=/bin/bash GRUB 改内核命令行,直接进 root shell ✅ 防住(需 PCR 8/9) ✅ 防住
B — Live USB / 拆盘读 外接系统读数据盘,或拆系统盘抄 .key ✅ 防住 ✅ 防住
C — 正常开机(零篡改) 小偷正常上电,PCR 完全匹配,TPM 自动放行 不防 ✅ 防住(卡在 PIN)

核心结论:防盗靠 PIN,不靠 PCR 数量。 PIN 把屏障从「用户态登录」前移到「密钥释放」这一步。不输 PIN → TPM 不放钥匙 → 数据自始至终是密文。init=/bin/bash 进来是密文,拆盘读是密文,Live USB 启动也是密文。屏障在锁上,不在锁开了之后的那道门上。

2. PCR 策略体系 — 6 级可达安全强度

PCR (Platform Configuration Register) 是 TPM 内部的哈希寄存器。系统启动过程中,固件、GRUB、内核逐级度量并「延伸」到 PCR 中。密封时指定 PCR → 解封时 PCR 值必须一致。

PCR 语义速查:

PCR 度量内容 稳定性 变更触发
0 UEFI 固件 ★★★★ BIOS/UEFI 升级
1 CPU 微码 + 启动变量 内核更新/微码更新/initramfs 重建
4 GRUB 引导程序 ★★★★ GRUB 包更新/grub.cfg 变更
5 GPT 分区表 ★★★★★ 磁盘重新分区
7 Secure Boot ⚠️ 飞牛不支持 SB,恒为常量,无价值
8 内核命令行 ★★ 内核参数变更
9 内核镜像 + initrd ★★ 内核更新/initramfs 重建

⚠️ 飞牛平台不支持 Secure Boot。PCR 7 恒为常量,所有推荐策略已自动排除。

6 级 PCR 策略:

# 策略 描述 稳定性 防 init=/bin/bash 年度 reseal
1 sha256:0,4 基础 — 仅固件+GRUB ★★★★★ ≈ 0
2 sha256:0,4,5 基础+分区 — +磁盘分区 ★★★★ ≈ 0
3 sha256:4,8,9 内核验证链 — GRUB+内核 ★★ 2~4
4 sha256:0,4,8,9 全栈验证 — 固件+内核 ★★ 2~4
5 sha256:0,1,4,8,9 全栈+微码 — +CPU微码 频繁
6 sha256:0,4,5,8,9 全栈+分区 — 最高覆盖 频繁

安全组合推荐:

组合 防盗 防篡改 维护成本 推荐度
PIN + 策略 1 (0,4) 几乎零 ★★★ 最推荐
纯 PCR + 策略 4 (0,4,8,9) 每 3~6 月 ★★
PIN + 策略 4 (0,4,8,9)
纯 PCR + 策略 1 (0,4) 不推荐

💡 「PIN + 策略 1 (0,4)」是最佳平衡:PIN 防整机被盗,PCR 几乎不需维护(策略 1 仅固件+GRUB,极其稳定)。飞牛每 3~6 个月一次内核大版本升级,如果你不想每隔几个月就 reseal 一次,选策略 1。

3. 双认证模式 — A(纯 PCR)vs B(PCR+PIN)

模式 A:纯 PCR(自动解锁)

启动 → UEFI → GRUB → kernel → initramfs → TPM 自动解封(PCR 匹配即放行) → mount → 登录界面
  • 全自动,无人值守,适合 NAS 机柜/远程重启
  • 防固件篡改、单盘被拔、换机启动
  • 不防整机被盗后正常开机(路径 C)——这是纯 PCR 的安全天花板

模式 B:PCR + PIN(双因素)

启动 → UEFI → GRUB → kernel → initramfs → ⛔ PIN 提示 → TPM 验证 PIN+PCR → 解封 → mount → 登录界面
  • 每次开机需人工输入 PIN(4-32 位)
  • 启动时 systemd-ask-password 通过 Plymouth/Console 弹出密码提示
  • 120 秒超时,3 次重试
  • 全覆盖 3 条攻击路径——即使整机被盗+正常开机,无 PIN 无法解封
  • TPM 反暴力破解 (DA Lockout) 保护
  • 多池 PIN 缓存: 首次输入后后续池自动尝试相同 PIN,不用重复输入
  • ⚠️ 不支持无人值守重启(停电后需人工输入)

4. 密封流程 — 8 步自动化,自带多重验证

Step 1: 创建 TPM 主密钥 (ECC→RSA 自动回退,显式模板保证跨版本可复现)
Step 2: PCR 策略选择 (6 级菜单 + 运行时验证,检测未测量 PCR 并阻止)
Step 3: 认证模式选择 (A=纯PCR / B=设置PIN)
Step 4: 计算策略 Digest (trial 会话 → policypcr [+ policyauthvalue])
Step 5: 密封密钥 (tpm2_create -i keyfile → 生成 sealed object)
Step 6: 内存验证 (在 TPM 内解封 → 与原始密钥逐字节比对 cmp -s)
Step 7: 写入 V2 blob + 闭环验证 (base64 编码→解码→重新解封→比对)
Step 8: 导出离线恢复密钥 + 智能删除 .key (base64 回环校验通过后才允许删除)

密封完成后立即提示:

══════ 离线恢复密钥 (必须保存!) ══════

方式 1 — 纸质抄录 (推荐):
  将以下 Base64 字符串抄录到纸上,存放在安全地点。
  恢复时通过 --import-key <base64> 导入。

  **─离线恢复密钥 — 系统恢复 — /vol1 — 1.8T  (trim_80930f0f-...)─**
  **  AbCdEfGhIjKlMnOpQrStUvWxYz1234567890ABCD=  **
  **──────────────────────────────────────────────────**

方式 2 — GPG 加密文件:
  将密钥用 GPG AES-256 加密保存,可复制到 U 盘离线保管。

─── 清理明文密钥 ───
  ✓ 密钥已密封到 TPM,可通过 TPM 解封随时恢复 .key
  ⚠ 保留 .key 在磁盘上 = 整机被盗时加密形同虚设

删除 trim_xxxx.key 明文密钥文件 (TPM 将成为唯一解锁方式)? [y/N]

5. 智能密钥清理 — 4 项安全检查,防止后悔

密封后 .key 还留在磁盘上 → TPM 保护形同虚设。但随随便便删了也危险——万一 TPM 解封失败怎么办?

智能清理做 4 项检查再判定:

[检查 1/4] TPM 密封 blob 格式有效性 → 解析 V2 blob,验证密钥数据非空
[检查 2/4] TPM 解封验证 + 密钥匹配  → 从 TPM 解封,与 .key 逐字节比对
[检查 3/4] 离线恢复密钥备份         → 扫描 GPG 恢复文件是否存在
[检查 4/4] .key 文件完整性          → 验证 32 字节大小

5 级判定:

判定 条件 操作
✅ 安全 全部通过 建议立即删除
⚠️ 基本安全 TPM 临时不可用但有备份 建议删除(有备份兜底)
⚠️ 风险 TPM 正常但缺备份 可删但提醒先导出备份
🔴 高风险 TPM 解封失败 + 无备份 阻止删除
❌ 拒绝 blob 损坏 阻止删除,.key 是唯一方式

不满足安全条件时 → 操作被阻止,并给出补救路径(--backup 导出、--diagnose 排查)。

6. TPM 恢复向导 — 6 种故障场景全覆盖

TPM 相关的问题场景多样,每种恢复路径不同。恢复向导通过交互式问答引导:

# 场景 恢复路径
1 固件/BIOS 更新 (PCR 0 变化) 用 .key/离线密钥解锁 → --reseal
2 GRUB 更新 (PCR 4 变化) 同上
3 主板或 TPM 芯片更换 .key 备份 → 删除旧 blob → 密封到新 TPM
4 TPM 被清除或重置 同场景 3
5 blob 文件损坏 GPG 完整备份解密恢复 → 或用 .key 重密封
6 忘记 TPM PIN .key 备份 → 删除旧 PIN 密封 → 换新 PIN 或切为纯 PCR

恢复向导自动扫描 4 级密钥备份(KEY_DIR → BACKUP_DIR **文件 → GPG 恢复文件 → GPG 完整备份),按优先级列出每个池的可用恢复源。

7. 启动自动解锁服务 — TPM 感知的 systemd 集成

fnos-encrypted-storage.shzfs-unlock.service(文件密钥)不同,本脚本生成的是 TPM 感知的两阶段解锁脚本

阶段 1: TPM 密封池 (*.tpm)
  **─ 纯 PCR 模式: policypcr → load → unseal → zfs load-key → mount
  **─ PCR+PIN 模式: systemd-ask-password 弹出 PIN 提示
  **    ** 多池 PIN 缓存 (首次输入后后续池自动尝试)
  **    ** 3 次重试 / 120s 超时
  **    ** DA 锁定预检 (每次尝试前)
  ** 失败 → 日志记录 PCR 漂移诊断 → 跳过

阶段 2: 文件密钥池 (*.key)
  仅处理无对应 .tpm 的池 (向后兼容)

期望启动顺序:

boot
  → zfs-import-cache.service     (导入 ZFS 池)
  → zfs-tpm-unlock.service       (TPM 解封 + 加载密钥)  ← Before=trim_init.service
  → trim_init.service            (扫描块设备)
  → trim_main.service            (加载 storage.hdl)
  → trim_http_cgi.service        (WebUI 可用)

验证启动后:

journalctl -u zfs-tpm-unlock    # 查看解锁日志
cat /var/log/fnos-tpm-unlock.log  # 详细解锁日志 (不含密钥材料)

8. TPM 全面诊断 — 7 步一站式排查

sudo bash fnos-tpm-storage.sh --diagnose

输出覆盖:

[1/7] TPM 硬件      — 设备节点 / 版本 / 制造商 / 固件 / DA 锁定状态
[2/7] tpm2-tools    — 9 个组件检查 + PCR 算法列表
[3/7] Secure Boot   — 启用状态 + 飞牛平台提示
[4/7] 主密钥测试    — ECC→RSA 回退,验证芯片功能正常
[5/7] PCR 当前值    — sha256:0,1,4,5,7,8,9 全部 PCR 实时哈希
[6/7] 密封池状态    — 认证模式 / PCR 策略 / blob 格式 / 密钥残留 / PCR 漂移检测
[7/7] 启动服务      — zfs-tpm-unlock.service 状态

PCR 漂移检测是第 6 步的核心:将 blob 中存储的密封时 PCR 值与当前实时值逐一对比,标记漂移的 PCR 并给出原因(如「PCR 9 (内核+initrd): 可能原因 → 内核版本更新或 initrd 重建」)。


🔄 安全方案层次对比

维度 TPM 密封 ★ 纯文件密钥
磁盘被拆走读取 ✅ 防住(换机 TPM 解不开) ❌ 失效(.key 明文可读)
改启动链提取密钥 ✅ 防住(PCR 改变拒放行) ❌ 失效
整机被盗正常开机 ✅ 防住(需 PIN 模式) ❌ 不防
性能开销 ⚡ 仅启动时一次解封 ⚡ 无
无人值守重启 A: ✅ / B: ❌
维护成本 取决于 PCR 策略
硬件要求 TPM 2.0 芯片
适合场景 物理安全不可控 家庭/机房

💡 三个方案的关系: ① 用 fnos-encrypted-storage.sh 创建 ZFS 加密存储 → ② 用 fnos-tpm-storage.sh 将密钥升级为 TPM 保护 → ③ 安装 TPM 启动解锁服务。TPM 密封是 ZFS 原生加密的上层安全增强,两者互补而非替代。


📖 HTML 运维手册(15 章离线可读)

单文件 HTML,暗色主题,浏览器直接打开:

章节 内容
方案总览 — TPM 密封 vs 纯文件密钥 vs 无加密 三层对比
TPM 密封原理与威胁模型 — 3 条攻击路径 + 覆盖矩阵
PCR 策略体系 — 6 级策略 + PCR 语义分类 + 推荐组合
双认证模式详解 — 纯 PCR vs PCR+PIN + DA 锁定
TPM 环境检测体系 — 6 步检测 + PCR 运行时验证
密钥密封完整流程 — 8 步密封 + 离线恢复密钥导出
密钥生命周期管理 — 解封 / 重密封 / 移除 / 智能清理
TPM 恢复向导 — 6 种故障场景 + 4 级备份扫描
启动自动解锁服务 — systemd 集成 + 两阶段策略 + 启动顺序
TPM 全面诊断 — 7 步诊断 + PCR 漂移检测 + 重启前模拟
十一 交互式菜单导航 — 主菜单 + 10 子菜单 + 快捷操作
十二 CLI 命令参考 — 20+ 命令行参数 + 新手指南
十三 日常运维命令参考 — TPM 原生命令 / 日志文件
十四 紧急恢复速查卡 — 3 种场景的手动恢复步骤
十五 脚本完整说明 — 版本 / 架构 / 函数总表 / 安全设计原则

📦 文件清单

fnos-tpm-storage.sh          (5367 行) — TPM 密封密钥管理脚本,1 个主菜单 + 10 子菜单
fnos-tpm-storage.html        (1200+ 行) — 15 章离线 HTML 手册,暗色主题
fnos-encrypted-storage.sh    (4395 行) — ZFS 原生加密存储脚本 (前置依赖)
fnos-encrypted-storage.html  (1100+ 行) — ZFS 加密存储 HTML 手册 (前置阅读)

依赖: TPM 2.0 硬件 + tpm2-tools ≥ 5.4 + ZFS 2.4.1+ + bash ≥ 4.0 + sudo
可选依赖: gpg(密钥加密备份)、systemd-ask-password(PIN 模式启动提示,systemd 自带)
适用版本: 飞牛 FNos v1.1.3107+ (Debian 12 Bookworm, Linux 6.18+)

所有文件不含任何真实密钥、密码或个人信息,可直接开源使用。


🔧 新手 3 步集成

# 前提: 已用 fnos-encrypted-storage.sh 创建了 ZFS 加密存储池

# Step 1: 检测 TPM 是否就绪
sudo bash fnos-tpm-storage.sh --detect

# Step 2: 密封密钥 (使用默认 PCR 策略 sha256:0,4)
sudo bash fnos-tpm-storage.sh --seal trim_xxxx
# 按提示: 选择 PCR 策略 → 选择认证模式 → 密封完成 → 抄录 base64 恢复密钥 → 删除 .key

# Step 3: 安装启动自动解锁服务
sudo bash fnos-tpm-storage.sh --install-boot
sudo reboot
journalctl -u zfs-tpm-unlock    # 验证 TPM 解封成功

⚠️ 重要提醒

  1. 密封后立即做三件事: ① 抄录 Base64 离线恢复密钥(纸质)② 创建 GPG 加密恢复文件(存 U 盘)③ 确认 --pre-reboot-check 通过后再重启
  2. 离线恢复密钥 = TPM 故障时的唯一救命稻草 — TPM 芯片损坏或主板更换后,没有离线恢复密钥就没有任何办法恢复数据
  3. 密钥文件 .key 删干净 — 只要 .key 还在磁盘上,整机被盗时攻击者就能绕过 TPM 直接读密钥。用 --cleanup-keys 安全检查后再删
  4. 固件/BIOS/GRUB 更新前先 --reseal — 否则重启后 TPM PCR 不匹配,无法自动解锁
  5. TPM 不是备份 — TPM 只防密钥泄露,不防数据丢失。加密数据仍要 3-2-1 备份
  6. PIN 模式的无人值守代价 — 停电/重启后需人工到场输入 PIN。如果 NAS 在远程机房,PIN 模式不适用
  7. 飞牛不支持 Secure Boot — PCR 7 恒为常量,含 PCR 7 的策略无效
  8. PCR 策略越复杂,维护越频繁 — 飞牛每 3~6 个月一次内核大版本。选 sha256:0,4 几乎零维护

🙋 反馈与改进

这套方案在飞牛 FNos v1.1.3107 (Debian 12, ZFS 2.4.1+, tpm2-tools 5.4+) 上完成验证,覆盖:

  • TPM 2.0 密封/解封完整管线(ECC+RSA 双重算法支持)
  • 6 级 PCR 策略 + 运行时验证(未测量 PCR 检测、飞牛 SB 绕过)
  • 双认证模式(纯 PCR 无人值守 + PCR+PIN 双因素)
  • V2 base64 blob 格式(人类可读 + SHA256 完整性校验)
  • 8 步密封流程(3 重验证:内存→闭环→回环)
  • 4 项智能密钥清理安全检查(5 级判定+阻断机制)
  • 6 场景 TPM 恢复向导 + 4 级密钥备份自动扫描
  • systemd 启动集成(两阶段解锁 + 多池 PIN 缓存 + DA 预检)
  • 7 步 TPM 全面诊断 + PCR 漂移检测
  • 重启前 TPM 解封模拟验证
  • 20+ CLI 命令行参数(支持脚本化/自动化)

如果你:

  • 在其他 FNOS 版本 / 其他 NAS 系统上测试遇到问题
  • 对 PCR 策略有更多实战经验反馈
  • 有新的 TPM 使用场景需求(如 vTPM / fTPM / 远程证明)

欢迎在帖子里交流讨论 🎉


飞牛 FNos v1.1.3107+ · Debian 12 Bookworm · TPM 2.0 · tpm2-tools ≥ 5.4 | 2026.06.23

Snipaste_2026-06-23_01-39-53.png

Snipaste_2026-06-23_01-40-37.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

2

回帖

0

牛值

江湖小虾

2026-6-16 14:59:39 楼主 显示全部楼层

[教程] VeraCrypt 加密容器管理器 vc-encrypt — 密码+密钥双因子 · 多层安装校验 · 卷头备份管理

适用平台: Debian / Ubuntu / FNOS (NAS) + VeraCrypt ≥ 1.26
配套工具: vc-encrypt.sh (1270行) + 15章 HTML 运维手册
配套阅读: 另有 [ZFS 原生加密运维方案] 适合 NAS 主力存储场景


📌 背景

ZFS 原生加密性能极佳,但它绑定 Linux/BSD,无法跨平台。如果你需要:

  • Win/Mac/Linux 三端共享加密文件
  • 便携加密 U 盘随身携带
  • 敏感文件冷备份到任何存储介质
  • 比 LUKS 更灵活的容器级加密(单文件即容器,复制即备份)

那么 VeraCrypt 容器方案就是最佳选择。vc-encrypt.sh 把 VeraCrypt 的命令行复杂度封装成交互式菜单 + 智能默认值 + 防呆校验,让加密容器的创建和管理像操作文件管理器一样简单。


🎯 解决的核心痛点

痛点 这个方案怎么解决
VeraCrypt 安装校验不透明,不知道下载的包是否被篡改 4 级校验链:GPG 签名 (公钥指纹钉扎) → SHA-512 钉扎 → 校验文件比对 → 同通道哈希。未校验包默认拒绝安装
创建命令参数复杂,加密算法/文件系统/PIM/keyfile 记不住 交互式向导,每步有推荐默认值 + 说明文字
忘记 PIM 值导致容器打不开 脚本自动记录每个容器的 PIM 到状态文件,挂载时自动回填
卷头损坏 = 数据永久丢失,但不知道怎么做备份 5 项卷头管理:导出 / 校验 / 恢复 / 端到端演练 / 清理。创建后主动提醒备份
keyfile 和容器放一起,双因子退化为零因子 自动检测 keyfile-colocation,同盘时发出明确安全警告
不知道存储目录选哪里好 智能评分算法:空间大小 + SSD 检测 + FNOS/NAS 适配 + 位置偏好
重装后 VeraCrypt 没了,手动下载安装很麻烦 --auto-install 一键自动下载校验安装 VeraCrypt(Debian/Ubuntu 全系 + amd64/arm64)

🚀 快速体验

# 1. 交互式菜单(默认)
chmod +x vc-encrypt.sh
./vc-encrypt.sh

# 2. 创建加密容器(交互式向导)
./vc-encrypt.sh create

# 3. 查看状态面板
./vc-encrypt.sh status

# 4. 非交互批量创建
./vc-encrypt.sh create --path /srv/vault --name secrets --size 50G \
  --encryption 3 --filesystem exfat --pim 2000 \
  --keyfile ~/keyfile.bin --mount /mnt/secrets --yes

菜单预览:

╔══════════════════════════════════════════════╗
║   🔐 VeraCrypt 加密容器管理器 v2.0.0        ║
╚══════════════════════════════════════════════╝

  VeraCrypt: VeraCrypt 1.26.14

  已挂载: 2 个加密卷

  1) 🆕 创建加密容器    (交互式向导)
  2) 🔓 挂载加密容器    (密码+密钥文件)
  3) 🔒 卸载加密容器
  4) 📊 状态面板        (仪表盘)
  5) 🛡️ 卷头备份管理    (导出/校验/恢复/演练)

  q) 🚪 退出

  请选择 [1-5/q]:

🔬 核心功能深度解析

1. VeraCrypt 安装校验 — 4 级防御链

这是本脚本最独特的设计:用 GPG 签名验证 + SHA-512 钉扎确保你安装的 VeraCrypt 没有被篡改。

L1 (最强): VC_PIN_SHA512           → 用户预先钉扎已知良哈希(带外校验)
L2 (强):   GPG 签名验证            → 下载 .sig → 导入官方 PGP 公钥 → gpg --verify
                                     公钥指纹钉扎: 5069A233D55A0EEB174A5FC3821ACD02680D16DE
L3 (中):   校验文件比对            → GPG 不可用时的降级路径
L4 (弱):   同通道哈希              → .deb 和校验文件同走 GitHub TLS
L0 (跳过): VC_SKIP_CHECKSUM_VERIFY → 显式跳过(记录审计日志)
# 最强安全:首次安装后记录 SHA-512,后续钉扎校验
export VC_PIN_SHA512="abc123..."   # 从已知良安装获取

# 推荐:安装 gpg 启用 L2 签名验证
sudo apt install gpg

# 一键自动安装
./vc-encrypt.sh --auto-install status

安全保证: 即使 GitHub 被攻破、TLS 证书被劫持,GPG 签名验证(L2)和 SHA-512 钉扎(L1)依然能检测到篡改。未通过校验的包默认拒绝安装

2. 5 种加密算法预设

预设 算法 特点
1 AES 最快,日常使用推荐
2 AES-Twofish 双重级联,均衡型
3 AES-Twofish-Serpent 三重级联,高安全(默认推荐)
4 Serpent-Twofish-AES 三重级联(反向),偏执级
5 Camellia-Serpent 最高安全,速度较慢

每种预设自动匹配最佳哈希算法(SHA-512 或 Whirlpool),无需手动指定。

3. 卷头备份管理体系

VeraCrypt 容器的卷头 (Header) 存储主密钥和加密参数。卷头一旦损坏,即使有正确的密码和 keyfile,数据也永久不可恢复

vc-encrypt.sh 提供了完整的卷头生命周期管理:

1) 📤 导出卷头备份  → 生成 .bak 文件 (131072 字节)
2) 🔍 校验备份文件  → 只读校验:大小 / 非空 / 高熵 (≥200/256 种字节值)
3) 🔧 恢复卷头      → 破坏性写:用 .bak 覆盖容器主头
4) 🧪 端到端演练    → 隔离副本上验证 restore→mount 全流程,原件不受影响
5) 🧹 清理演练副本  → 删除临时演练目录

导出 .bak 后脚本会自动执行:

  • ✅ 静态结构校验(大小 131072 字节 / 非空 / 熵 ≥ 200)
  • ✅ 自动重命名易混淆文件名(keyfile.bin.bak容器名.bak
  • ✅ 自动设置权限 (chmod 600) 和所有权 (chown)

4. 密钥文件 (Keyfile) 双因子认证

挂载容器需要同时提供:
  🔑 你知道的 (密码)     → 用户记忆或密码管理器
  📁 你拥有的 (keyfile)   → 256 字节随机文件,存储在独立介质
  🔢 PIM 值              → 控制 PBKDF2 迭代次数

三项缺一不可 → 任意一项泄露都不足以解密数据

keyfile-colocation 检测: 脚本通过 df --output=source 自动检测 keyfile 和容器是否在同一物理磁盘。同盘时发出明确警告并建议分离存放——因为磁盘损坏会导致两者同时丢失,双因子退化为零因子。

5. 存储目录智能评分

创建容器时,脚本自动分析所有挂载点的可用空间,按多维度评分推荐最佳目录:

评分维度 权重
可用空间 (GB) 基础分
/srv 目录 +100 (FHS 标准数据目录)
/mnt / /media +50 (典型挂载点)
/volX / /data (NAS) +100 (FNOS 兼容)
/ (根分区) -50 (避免占用系统盘)
SSD 检测 +15 (通过 /sys/block/*/queue/rotational)
剩余空间 < 10% -20
剩余空间 < 5% -40

每个挂载点只保留最高分候选,同时记住上次使用的目录(持久化到状态文件),下次自动排到首位。


📖 HTML 运维手册(15章离线可读)

单文件 HTML,暗色主题,浏览器直接打开:

章节 内容
方案总览 — VeraCrypt vs ZFS 选型指南
VeraCrypt 加密原理 — 算法/文件系统/PIM/保护范围
安装与校验体系 — 4 级校验链详解
创建加密容器完整流程 — 交互式/非交互式
密钥文件双因子认证 — keyfile-colocation 检测
卷头备份管理体系 — 5 项管理操作详解
挂载与卸载 — 容器扫描/排序/挂载点建议
存储目录智能选择 — 评分算法详解
FNOS NAS 兼容模式 — /volX 自动适配
日常运维命令参考 — 容器/原生/配置/状态
十一 重装/换机恢复流程 — 4 步恢复数据
十二 故障排查 — 常见错误速查
十三 安全加固建议 — 安装/容器/操作三层加固
十四 紧急恢复速查卡 — 一张纸恢复全部
十五 自动化脚本完整说明 — 全部命令 + 函数架构

🔄 与 ZFS 原生加密方案的对比

维度 ZFS 原生加密 VeraCrypt 容器
加密层级 内核级 (ZFS dataset) 用户态 (FUSE)
性能 ⚡⚡⚡⚡⚡ 接近**盘 ⚡⚡⚡ 有开销
跨平台 ❌ Linux/BSD only Win/Mac/Linux
加密算法 AES-256-GCM AES / Twofish / Serpent / Camellia + 级联
双因子认证 keyfile 或 passphrase 密码 + keyfile 同时使用
卷头备份恢复 ❌ 无独立头备份 内置头备份/恢复/演练
便携性 ❌ 需 ZFS 支持 单文件容器,复制即备份
快照/克隆 zfs snapshot ❌ 需外部工具
密钥轮换 ✅ 秒级 ⚠ 需重建容器
学习成本 中高 低 → 中
适合场景 NAS 主力存储 跨平台交换 / 冷备份 / 便携加密

💡 建议: 飞牛 NAS 主力存储用 ZFS 原生加密(性能优先),敏感文件跨平台交换 + 冷备份用 VeraCrypt 容器(便携优先)。两者互补,不是替代。


📦 文件清单

vc-encrypt.sh       (1270行) — shell 脚本,6 个命令,30+ 个函数
vc-encrypt.html     (800+行) — 15 章离线 HTML 手册,暗色主题

依赖: VeraCrypt ≥ 1.26(脚本自动安装)、bash ≥ 4.0、sudo、curl
可选依赖: gpg(启用 GPG 签名验证)、jq(JSON 解析优化)

所有文件不含任何真实密钥、密码或个人信息,可直接开源使用。


⚠️ 重要提醒

  1. 创建后立即做三件事: ① 导出卷头备份 (.bak) ② 备份 keyfile ③ 记录 PIM 值
  2. 卷头备份 = 救命稻草 — 和 keyfile 一起离线保管,通过「端到端演练」定期验证可用性
  3. 密码 + keyfile + PIM 缺一不可 — 任意一项丢失且无备份 = 数据永久不可恢复
  4. keyfile 不要和容器放同一物理磁盘 — 脚本会自动检测并警告
  5. VeraCrypt 加密 ≠ 备份 — 加密只防泄露,不防误删。容器文件也要 3-2-1 备份
  6. 安装校验不要跳过 — 安装 gpg 启用 L2 签名验证,或使用 VC_PIN_SHA512 钉扎

🙋 反馈与改进

这套方案在飞牛 NAS (Debian 12) 和标准 Ubuntu 24.04 上验证通过,经过多轮校验流程测试。如果你:

  • 在其他平台(ARM SBC / 树莓派 / WSL)上测试遇到问题
  • 有新的加密算法或文件系统需求
  • 想增加更多自动化功能(如定时挂载/卸载)

欢迎在帖子里交流讨论 🎉 附件:VeraCrypt.zip


飞牛 NAS · Debian 12 · VeraCrypt 1.26+ · 跨平台加密容器 | 2026.06.18

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

3

回帖

0

牛值

江湖小虾

2026-6-22 11:42:34 显示全部楼层

膜拜大神

9

主题

68

回帖

0

牛值

初出茅庐

2026-6-29 13:54:03 显示全部楼层
这方案官方应该直接集成进去 厉害👍🏻

2

主题

6

回帖

0

牛值

fnOS系统内测组

2026-7-1 14:37:37 显示全部楼层

点赞

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则