目录

目录

Proxmox VE 9 全盘加密部署指南 - LUKS2 + TPM2 + USB Key 自动解锁

基于 Debian 13 Trixie 的企业级加密虚拟化平台部署实战

目录

本文记录了如何为 Proxmox VE 9 部署全盘加密系统。相较于之前的文章,这次我们将实现 TPM2 和 USB Key 等多种自动解锁方式,特别适合需要加密保护的边缘节点部署场景。

注意这篇文章会涉及到大量的mermaid图表加载会比较慢。

整体安装流程如下:

  1. 创建并配置 LUKS 加密分区
  2. 初始化 LVM 卷组和逻辑卷
  3. 使用 debootstrap 安装 Debian 13 基础系统
  4. 配置 GRUB 引导和 fstab 挂载
  5. 在加密系统之上部署 Proxmox VE

本次部署的重点在于配置多种 LUKS 解锁方式(密码、TPM2、USB Key),实现无人工干预的自动解锁,让加密节点可以在断电重启后自动恢复服务。

LUKS (Linux Unified Key Setup) 是 Linux 下的磁盘加密标准,它提供了一个平台无关的标准磁盘加密格式。LUKS 的核心设计理念是将加密密钥和用户密码分离,采用主密钥(Master Key)和密钥槽(Key Slot)的架构。

LUKS 的加密架构分为两层:

  1. 主密钥(Master Key)层: 这是真正用于加密磁盘数据的密钥,通常是 256 位或 512 位的随机数。这个密钥在 LUKS 分区创建时随机生成,永远不会改变。所有的磁盘数据都使用这个主密钥通过 AES-XTS 等加密算法进行加密。

  2. 密钥槽(Key Slot)层: LUKS 支持最多 8 个(LUKS1)或 32 个(LUKS2)密钥槽,每个槽位可以存储一份用不同方式加密的主密钥副本。用户可以使用密码、密钥文件、TPM、智能卡等多种方式来解密任意一个槽位中的主密钥,进而解锁整个磁盘。

graph TB
    subgraph "LUKS 分区结构"
        A[LUKS Header
元数据区域] --> B[密钥槽区域
Key Slots Area] B --> C[加密数据区域
Encrypted Data] end subgraph "密钥槽详情 - 最多32个" B --> D[槽位 0: 密码] B --> E[槽位 1: USB Key] B --> F[槽位 2: TPM2] B --> G[槽位 3-31: ...] end subgraph "加密层级" H[用户密码/Token] -->|解密| I[密钥槽中的
加密主密钥] I -->|解密| J[主密钥
Master Key
512 bits] J -->|AES-XTS| C end

工作原理说明

sequenceDiagram
    participant U as 用户
    participant L as LUKS 系统
    participant S as 密钥槽
    participant M as 主密钥
    participant D as 加密磁盘
    
    Note over U,D: 初始化阶段
    U->>L: luksFormat /dev/sda3
    L->>M: 生成随机主密钥 (512 bits)
    U->>L: 输入密码
    L->>S: 用密码加密主密钥副本
    S-->>L: 存储到槽位 0
    M->>D: 用主密钥加密所有数据
    
    Note over U,D: 添加新解锁方式
    U->>L: luksAddKey (TPM/USB Key)
    L->>S: 读取主密钥(需要现有密码)
    L->>S: 用新方式加密主密钥副本
    S-->>L: 存储到新槽位
    
    Note over U,D: 解锁阶段
    U->>L: cryptsetup open
    L->>S: 尝试解密密钥槽
    S->>M: 返回主密钥
    M->>D: 用主密钥解密数据
    D-->>U: 访问明文数据

这种设计的优势在于:

  • 更改解锁方式(如修改密码)时,只需要重新加密对应槽位中的主密钥副本,而不需要重新加密整个磁盘
  • 可以同时设置多种解锁方式,提供了极大的灵活性
  • 即使某个槽位的密钥泄露,只要及时删除该槽位并更改其他解锁方式,磁盘数据仍然安全

LUKS2 相比 LUKS1 做了诸多改进:

  • 更灵活的头部结构: 支持冗余的元数据存储,提高了容错能力
  • 更多的密钥槽: 从 8 个增加到 32 个
  • Token 支持: 原生支持 TPM2、FIDO2 等硬件令牌
  • Argon2 密钥派生: 使用更安全的 Argon2id 算法替代 PBKDF2,更好地抵抗暴力破解
  • 在线重加密: 支持在不卸载分区的情况下更改加密算法

TPM (Trusted Platform Module) 是一个独立的安全芯片,用于提供硬件级别的密钥存储和密码学操作。TPM2 解锁 LUKS 的工作原理如下:

graph LR
    subgraph "系统组件"
        A[UEFI 固件] --> B[GRUB]
        B --> C[内核]
        C --> D[initramfs]
    end
    
    subgraph "TPM 芯片"
        E[PCR 寄存器]
        F[密钥存储]
        G[加密引擎]
    end
    
    subgraph "LUKS 分区"
        H[Token: TPM2 Blob]
        I[密钥槽 2]
        J[加密数据]
    end
    
    A -.测量.-> E
    B -.测量.-> E
    D -->|请求解封| G
    E -->|验证 PCR| G
    G -->|解封密钥| D
    D -->|使用密钥| I
    I -->|解密主密钥| J
    
sequenceDiagram
    participant UEFI as UEFI 固件
    participant PCR0 as PCR 0
    participant PCR7 as PCR 7
    participant GRUB as GRUB
    participant Kernel as 内核
    participant TPM as TPM 芯片
    
    Note over UEFI,TPM: 启动测量阶段
    UEFI->>PCR0: 测量固件代码 Hash
    UEFI->>PCR7: 测量安全启动状态
    UEFI->>GRUB: 加载 GRUB
    GRUB->>Kernel: 加载内核
    Kernel->>TPM: 请求解封密钥
    TPM->>PCR0: 读取当前值
    TPM->>PCR7: 读取当前值
    
    alt PCR 值匹配
        TPM-->>Kernel: [成功] 返回解封的密钥
        Kernel->>Kernel: 解锁 LUKS 分区
    else PCR 值不匹配
        TPM-->>Kernel: [失败] 拒绝解封
        Kernel->>Kernel: 降级到其他解锁方式
    end

在使用 systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/sda3 注册 TPM 时:

  1. 生成随机密钥: systemd-cryptenroll 生成一个随机密钥,这个密钥将被添加到 LUKS 的某个密钥槽中
  2. TPM 封存(Seal)操作: 将这个随机密钥通过 TPM 的封存功能进行加密,并绑定到特定的 PCR (Platform Configuration Register) 值
  3. 存储加密的密钥: 加密后的密钥(称为 blob)存储在 LUKS2 的 Token 中,可以通过 cryptsetup luksDump 查看

TPM 注册流程图

flowchart TD
    A[执行 systemd-cryptenroll] --> B[生成随机密钥]
    B --> C[读取当前 PCR 0, 7 值]
    C --> D{TPM 可用?}
    
    D -->|是| E[TPM Seal 操作]
    D -->|否| F[错误: TPM 不可用]
    
    E --> G[绑定到 PCR 0+7]
    G --> H[生成 TPM Blob]
    H --> I[添加密钥到 LUKS 槽位]
    I --> J[存储 Blob 到 LUKS Token]
    J --> K["注册完成"]
    
    F --> L[检查 TPM 硬件/驱动]
    

PCR (Platform Configuration Register) 是 TPM 中的一组寄存器,用于记录系统启动过程中各个阶段的度量值(哈希值)。常用的 PCR 包括:

PCR 编号 测量内容 用途
PCR 0 BIOS/UEFI 固件代码 检测固件篡改
PCR 1 BIOS/UEFI 配置 检测 BIOS 设置变化
PCR 2 UEFI 驱动和应用 检测启动组件变化
PCR 4 引导加载程序 (GRUB) 检测 bootloader 篡改
PCR 7 安全启动状态 检测安全启动策略

使用 --tpm2-pcrs=0+7 意味着密钥被绑定到 PCR 0 和 PCR 7 的当前值。只有当系统启动时这些 PCR 的值与注册时相同,TPM 才会解封密钥。

PCR 值计算方式

PCR 值 = Hash(Hash(Hash(初始值, 测量1), 测量2), 测量3, ...)

例如 PCR 0:
初始值: 0x0000...
测量1: Hash(UEFI 固件代码)
PCR 0 = Hash(0x0000..., 测量1)

这种链式哈希确保了任何阶段的改变都会导致最终 PCR 值不同。

系统启动时:

  1. initramfs 检测: systemd-cryptsetup 检测到 LUKS 分区有 TPM2 token
  2. 读取 PCR 值: 读取当前系统的 PCR 0 和 7 的值
  3. 请求 TPM 解封: 向 TPM 发送解封请求,附带当前的 PCR 值
  4. PCR 验证: TPM 比对当前 PCR 值与注册时的 PCR 值
  5. 解封密钥: 如果 PCR 值匹配,TPM 解封并返回随机密钥
  6. 解锁 LUKS: 使用解封的密钥解锁 LUKS 分区

TPM2 解锁提供了以下安全保障:

  • 硬件绑定: 密钥存储在 TPM 芯片中,无法被软件直接读取
  • 启动状态验证: 通过 PCR 确保系统固件、引导加载程序没有被篡改
  • 防御恶意启动: 如果从其他设备启动或固件被修改,PCR 值会不同,TPM 将拒绝解封
  • 无密码解锁: 在安全状态下自动解锁,无需人工输入密码
  • 固件更新敏感: BIOS/UEFI 更新会改变 PCR 0,导致无法自动解锁,需要重新注册
  • 硬件依赖: 需要主板支持 TPM 2.0 芯片
  • 安全启动要求: 通常需要开启 UEFI 安全启动才能充分发挥作用

USB Key 解锁是一种基于密钥文件的解锁方式,原理相对简单但同样有效。

flowchart TD
    subgraph "准备阶段"
        A[格式化 USB 设备] --> B[生成随机密钥文件
4KB 随机数] B --> C[添加到 LUKS 密钥槽] C --> D[复制密钥到 USB Key] end subgraph "启动解锁阶段" E[系统启动] --> F[initramfs 加载] F --> G{检测 USB 设备} G -->|找到 USB-KEY| H[挂载 USB 设备] G -->|未找到| I[等待3秒或超时] I --> G H --> J[读取密钥文件] J --> K[使用密钥解锁 LUKS] K --> L[卸载 USB 设备] L --> M[继续启动] end
flowchart TB
    subgraph USB["USB Key 设备"]
        A["/dev/sdb"]
        A --> B["分区表"]
        B --> C["/dev/sdb1
ext4 文件系统
Label: USB-KEY"] end subgraph FILES["文件结构"] C --> D["/luks_usb.key
4096 bytes
随机数据"] C --> E["其他文件
(可选)"] end subgraph LUKS["LUKS 密钥槽"] F["槽位 1"] --> G["存储用密钥文件
加密的主密钥"] end D -.解锁.-> F
  1. 生成随机密钥文件: 使用 dd if=/dev/urandom of=/tmp/luks_usb.key bs=4096 count=1 生成一个 4KB 的随机密钥文件
  2. 添加到 LUKS: 使用 cryptsetup luksAddKey /dev/sda3 /tmp/luks_usb.key 将密钥文件添加到一个新的密钥槽
  3. 存储到 USB: 将密钥文件复制到 USB 设备的特定位置,如 /mnt/usbkey/luks_usb.key

详细流程

sequenceDiagram
    participant Admin as 管理员
    participant USB as USB Key
    participant LUKS as LUKS 分区
    participant Slot as 密钥槽 1
    
    Note over Admin,Slot: 初始化 USB Key
    Admin->>USB: mkfs.ext4 -L 'USB-KEY'
    Admin->>Admin: dd if=/dev/urandom of=key
    
    Note over Admin,Slot: 添加到 LUKS
    Admin->>LUKS: luksAddKey /dev/sda3 key
    LUKS->>Admin: 请求输入现有密码
    Admin->>LUKS: 输入密码验证
    LUKS->>Slot: 用密钥文件加密主密钥
    Slot-->>LUKS: 存储完成
    
    Note over Admin,Slot: 保存密钥
    Admin->>USB: 挂载 USB Key
    Admin->>USB: 复制密钥文件
    Admin->>USB: chmod 400 luks_usb.key
    Admin->>USB: 卸载并妥善保管

在 initramfs 阶段:

  1. 检测 USB 设备: 系统启动时检测 USB 设备(通过 UUID 或 LABEL)
  2. 挂载 USB: 将 USB 设备挂载到临时位置
  3. 读取密钥文件: 从 USB 读取密钥文件内容
  4. 解锁 LUKS: 使用密钥文件内容作为密码解锁 LUKS 分区
  5. 卸载 USB: 解锁成功后卸载 USB 设备

LUKS 的自动解锁配置主要通过 /etc/crypttab 文件来管理。这个文件在系统启动时被 initramfs 读取,决定如何解锁加密设备。

基本格式:

<target> <source> <key-file> <options>

实际配置示例

cryptlvm UUID=558ed1f4-cc23-4d7d-8b14-a2b2de3d0882 none luks,initramfs,discard

字段说明

  1. target(目标名称):cryptlvm

    • 解锁后的设备映射名称
    • 将创建 /dev/mapper/cryptlvm 设备
    • 这个名称会在 /etc/fstab 和 LVM 配置中引用
    • 命名规范:建议使用描述性名称,只包含字母、数字、下划线和连字符
  2. source(源设备):UUID=558ed1f4-cc23-4d7d-8b14-a2b2de3d0882

    • 加密设备的标识符
    • 推荐使用 UUID= 而不是设备路径(如 /dev/sda3
    • UUID 在设备重新分区或插入顺序改变时保持不变
    • 可用格式:
      • UUID=<uuid> - 推荐,最稳定
      • PARTUUID=<partuuid> - GPT 分区 UUID
      • LABEL=<label> - 设备标签
      • /dev/disk/by-id/<disk-id> - 磁盘 ID
      • /dev/sda3 - 不推荐,可能变化

    如何查找 UUID

    # 方法 1: 使用 blkid
    blkid /dev/sda3
    
    # 方法 2: 使用 lsblk
    lsblk -f /dev/sda3
    
    # 方法 3: 查看 /dev/disk/by-uuid/
    ls -la /dev/disk/by-uuid/
  3. key-file(密钥文件):none

    • 指定用于自动解锁的密钥文件路径
    • none 表示不使用密钥文件,依赖其他解锁方式(密码、TPM Token)
    • 如果使用 USB Key,这里仍然写 none,因为 USB Key 解锁由自定义脚本处理
    • 固定密钥文件示例:/root/keyfile.key - 使用该文件自动解锁
    • 注意:密钥文件必须在 initramfs 构建时可访问
  4. options(选项):luks,initramfs,discard

    这是最关键的配置部分,多个选项用逗号分隔,不含空格。

    常用选项详解

    • luks - 必需

      • 指定这是一个 LUKS 加密设备
      • cryptsetup 会使用 luksOpen 命令处理
      • 自动检测 LUKS1 或 LUKS2 版本
    • initramfs - 非常重要

      • 将此配置包含到 initramfs 中
      • 没有此选项,设备只会在系统完全启动后才解锁
      • 根分区加密必须使用此选项
      • 影响 update-initramfs 的行为
    • discard - SSD 优化

      • 启用 TRIM 支持,允许 SSD 优化存储
      • 性能优化:延长 SSD 寿命,提升写入性能
      • 安全警告:可能泄露文件系统使用信息
      • 仅在 SSD 上使用,机械硬盘忽略此选项
      • LUKS2 默认支持,LUKS1 需要显式启用
    • nofail - 可选,增强容错性

      • 即使解锁失败,系统仍继续启动
      • 适用于非关键分区(如数据盘)
      • 不要在根分区使用,会导致无法启动
    • timeout=<秒数> - 可选

      • 设置解锁等待超时时间
      • 例如:timeout=90 - 等待 90 秒
      • 超时后根据其他选项决定行为(如 nofail
    • tries=<次数> - 可选

      • 密码输入尝试次数
      • 默认值:3
      • 例如:tries=5 - 允许 5 次密码尝试
    • keyfile-timeout=<秒数> - 可选

      • 等待密钥文件可用的超时时间
      • 用于 USB Key 等外部存储设备
      • 例如:keyfile-timeout=10
    • noauto - 可选

      • 系统启动时不自动解锁
      • 需要手动执行 cryptsetup open
      • 适用于按需挂载的加密分区
    • readonly - 可选

      • 以只读模式打开加密设备
      • 用于数据保护场景

其他高级配置示例

# 示例 1: 使用密钥文件的数据分区
data UUID=12345678-... /root/data.key luks,discard,nofail

# 示例 2: 非关键加密分区,允许失败
backup UUID=abcdef01-... none luks,nofail,timeout=30

# 示例 3: 外部 USB 加密盘,等待设备
usbdrive UUID=fedcba98-... none luks,nofail,timeout=60,tries=3

# 示例 4: 只读加密分区
archive UUID=11111111-... none luks,readonly,nofail

修改 /etc/crypttab 后,执行以下验证步骤:

# 1. 检查语法错误
cat /etc/crypttab

# 2. 验证 UUID 是否正确
blkid | grep 558ed1f4

# 3. 测试配置(不实际解锁)
cryptdisks_start --test cryptlvm

# 4. 更新 initramfs
update-initramfs -u -k all

# 5. 验证 crypttab 是否被包含在 initramfs 中
lsinitramfs /boot/initrd.img-$(uname -r) | grep crypttab

在我们的配置中:

  • /etc/crypttab 定义了基本的解锁配置
  • /etc/initramfs-tools/scripts/local-top/cryptroot-unlock 脚本实现了具体的解锁逻辑
  • TPM Token 和 USB Key 解锁由脚本处理,不在 crypttab 中体现
  • crypttab 的主要作用是告诉 initramfs 哪些设备需要解锁

Q: 为什么 key-file 是 none,但 USB Key 解锁仍然工作?

A: 因为我们使用了自定义的 cryptroot-unlock 脚本来处理 USB Key 解锁。crypttab 只负责定义设备,具体解锁逻辑由脚本实现。

Q: 修改 crypttab 后需要做什么?

A: 必须运行 update-initramfs -u -k all 重新生成 initramfs,否则修改不会生效。

Q: discard 选项安全吗?

A: discard 可能泄露文件系统的使用模式(哪些块被使用),但不会泄露数据内容。如果你的威胁模型包括防止使用模式分析,应该禁用此选项。对于大多数场景,SSD 性能优化的好处大于风险。

USB Key 解锁的安全性取决于:

  • 物理安全: USB Key 必须妥善保管,丢失即意味着加密失效
  • 组合使用: 可以与密码组合使用,要求"你拥有的东西(USB Key) + 你知道的东西(密码)"
  • 密钥文件质量: 密钥文件应该是高质量的随机数,至少 512 字节以上
  • 文件系统加密: USB Key 本身最好也加密,防止被克隆

安全威胁模型

graph TD
    A[USB Key 安全威胁] --> B[物理丢失]
    A --> C[被克隆]
    A --> D[被篡改]
    
    B --> E[解决方案:
备份+及时撤销] C --> F[解决方案:
加密 USB 本身] D --> G[解决方案:
校验和验证] H[最佳实践] --> I[USB + 密码] H --> J[定期更换密钥] H --> K[多重备份]

LUKS2 支持同时配置多种解锁方式,提供灵活的安全策略:

graph TB
    subgraph "解锁方式特性对比"
        A[密码解锁]
        B[TPM2 解锁]
        C[USB Key 解锁]
    end
    
    A --> A1[优点: 永远可用
无需额外硬件] A --> A2[缺点: 需要人工输入
可能被遗忘] B --> B1[优点: 全自动
硬件绑定安全] B --> B2[缺点: 固件更新敏感
需要 TPM 硬件] C --> C1[优点: 物理令牌
相对灵活] C --> C2[缺点: 可能丢失
可被克隆]

配置示例

  • 密钥槽 0: 用户密码
  • 密钥槽 1: USB Key
  • 密钥槽 2: TPM2

任意一种方式都可以独立解锁,适合不同场景:

  • 正常启动: TPM2 自动解锁
  • TPM 失效: 使用 USB Key 解锁
  • 恢复场景: 使用密码解锁

解锁优先级流程

flowchart LR
    A[系统启动] --> B{尝试 TPM2}
    B -->|成功| Z["启动完成"]
    B -->|失败| C{尝试 USB Key}
    C -->|成功| Z
    C -->|失败| D{密码输入}
    D -->|正确| Z
    D -->|错误| E["重试或恢复模式"]
    

LUKS2.1+ 支持策略组合,例如要求 TPM2 AND USB Key 同时存在才能解锁,提供更高的安全级别。

双因素验证示例

flowchart TD
    A[启动系统] --> B{TPM2 验证}
    B -->|失败| F["拒绝访问"]
    B -->|通过| C{USB Key 验证}
    C -->|失败| F
    C -->|通过| D["解锁成功"]
    
    E[可选: 密码作为
紧急恢复方式] -.备用路径.-> D

在 initramfs 中可以配置解锁尝试顺序:

  1. 优先尝试 TPM2(最便捷)
  2. TPM 失败则尝试 USB Key
  3. 都失败则提示输入密码(最后的后备方案)

完整的多层级解锁架构

flowchart TB
    subgraph layer1["第一层 - 自动解锁"]
        A[TPM2 自动解锁] --> A1{PCR 验证}
        A1 -->|通过| SUCCESS["解锁成功"]
        A1 -->|失败| B
    end
    
    subgraph layer2["第二层 - 物理令牌"]
        B[USB Key 解锁] --> B1{检测 USB}
        B1 -->|找到| SUCCESS
        B1 -->|未找到| C
    end
    
    subgraph layer3["第三层 - 人工干预"]
        C[密码解锁] --> C1{密码验证}
        C1 -->|正确| SUCCESS
        C1 -->|错误 3次| D[恢复 Shell]
    end
    
    subgraph layer4["第四层 - 紧急恢复"]
        D --> E[Live CD 修复]
        E --> F[管理员介入]
    end
    
场景 主要解锁方式 备用方式 紧急恢复 适用性
边缘节点 TPM2 自动 USB Key 密码 + 远程解锁 ★★★★★
个人工作站 密码 TPM2 USB Key ★★★★
数据中心 TPM2 网络解锁 密码 ★★★★★
笔记本电脑 密码 TPM2 USB Key ★★★
高安全环境 TPM2 + USB + 密码 管理员密钥 多人授权 ★★★★★

对于部署在边缘机房的加密节点:

graph LR
    subgraph "正常运行"
        A[断电] --> B[自动重启]
        B --> C[TPM2 自动解锁]
        C --> D[服务恢复]
    end
    
    subgraph "TPM 失效场景"
        E[BIOS 更新] --> F[TPM 失败]
        F --> G[USB Key 解锁]
        G --> H[服务恢复]
    end
    
    subgraph "完全失败"
        I[硬件故障] --> J[远程 SSH 解锁]
        J --> K[或现场密码输入]
    end
    

配置策略

  • 主要方式: TPM2 自动解锁,重启后无需人工干预
  • 备用方式: 配置 USB Key,在 TPM 失效时使用
  • 紧急方式: 保留密码解锁,用于远程救援

对于个人使用的工作站:

mindmap
    root((个人工作站
加密策略)) 日常使用 密码解锁 简单直接 习惯输入 便捷性 TPM2 可选 快速启动 自动解锁 数据恢复 USB Key 备份 存放安全位置 密码备忘

配置策略

  • 主要方式: 密码解锁,保持简单
  • 便捷方式: TPM2 自动解锁(可选)
  • 恢复方式: USB Key 作为密码遗忘后的恢复手段

对于高安全要求的环境:

sequenceDiagram
    participant U as 用户
    participant T as TPM2
    participant K as USB Key
    participant P as 密码系统
    participant S as 系统
    
    Note over U,S: 多因素验证流程
    
    U->>T: 启动系统
    T->>T: PCR 验证
    T-->>S: [成功] TPM 通过
    
    S->>K: 检测 USB Key
    K-->>S: [成功] USB 通过
    
    S->>U: 请求输入密码
    U->>P: 输入密码
    P->>P: 验证密码强度
    P-->>S: [成功] 密码通过
    
    S->>S: 所有验证通过
    S-->>U:  系统解锁

配置策略

  • 多因素: 要求 TPM2 + USB Key + 密码
  • 定期轮换: 定期更改密码和重新生成 USB Key
  • 审计记录: 记录所有解锁尝试

这种灵活的多层次加密解锁机制,使得 LUKS 可以适应从个人桌面到企业数据中心的各种应用场景,在安全性和便捷性之间取得平衡。

为了更直观地理解加密系统的启动过程,下面是完整的启动流程图:

flowchart TD
    A[UEFI 固件启动] --> B[加载 GRUB 引导加载程序]
    B --> C[加载内核和 initramfs]
    C --> D[initramfs 环境启动]
    D --> E[执行 /scripts/local-top/cryptroot-unlock]
    
    E --> F{检查设备是否已解锁}
    F -->|已解锁| Z[系统就绪 - 登录界面]
    F -->|未解锁| G[开始解锁流程]
    
    G --> H{步骤1: 尝试 TPM Token 解锁}
    
    H -->|发现 TPM 设备| I[执行 cryptsetup open --token-only]
    H -->|无 TPM 设备| M
    
    I --> J{TPM 解锁结果}
    J -->|成功| K[创建 /dev/mapper/cryptlvm]
    J -->|失败| L[记录 TPM 解锁失败]
    
    L --> M{步骤2: 尝试 USB Key 解锁}
    
    M --> N[等待 USB 设备 - udevadm settle]
    N --> O{检测30秒内是否找到 USB-KEY}
    
    O -->|找到 USB-KEY| P[挂载 /dev/disk/by-label/USB-KEY]
    O -->|30秒超时| U
    
    P --> Q{检查密钥文件是否存在}
    Q -->|找到 luks_usb.key| R[执行 cryptsetup luksOpen --key-file]
    Q -->|文件不存在| S[卸载 USB]
    
    R --> T{USB Key 解锁结果}
    T -->|成功| K
    T -->|失败| S
    
    S --> U[记录 USB Key 解锁失败]
    U --> V{步骤3: systemd 密码提示}
    
    V --> W[systemd-cryptsetup 请求密码]
    W --> X{用户输入密码}
    X -->|密码正确| K
    X -->|密码错误| Y[重试或超时进入恢复shell]
    
    Y --> X
    
    K --> AA[激活 LVM 卷组 pve]
    AA --> AB[挂载根文件系统 /dev/pve/root]
    AB --> AC[挂载 /boot 和 /boot/efi]
    AC --> AD[切换到真实根目录]
    AD --> AE[启动 systemd init]
    AE --> AF[启动系统服务]
    AF --> Z
    

阶段 1: UEFI 启动(PCR 0, 7 测量)

  1. UEFI 固件初始化硬件并测量自身到 PCR 0
  2. 如果开启了安全启动,相关状态记录到 PCR 7
  3. UEFI 加载 GRUB 引导加载程序

阶段 2: GRUB 加载(PCR 2, 4 测量)

  1. GRUB 读取配置文件 /boot/grub/grub.cfg
  2. 加载 Linux 内核到内存
  3. 加载 initramfs(包含自定义的加密解锁脚本)

阶段 3: initramfs 环境初始化

  1. 内核启动后首先运行 initramfs 中的 /init 脚本
  2. 加载必要的内核模块(USB、TPM、加密模块)
  3. 执行 /scripts/local-top/cryptroot-unlock 脚本

阶段 4: 多方式解锁尝试(按优先级顺序)

根据你的 /etc/initramfs-tools/scripts/local-top/cryptroot-unlock 脚本,解锁流程如下:

步骤 1 - TPM2 Token 解锁(优先级最高):

# 脚本逻辑:
if [ -e /dev/tpm0 ] || [ -e /dev/tpmrm0 ]; then
    # 检测到 TPM 设备
    cryptsetup open --token-only /dev/disk/by-uuid/558ed1f4... cryptlvm
    if [ $? -eq 0 ]; then
        # 解锁成功,直接退出
        exit 0
    fi
fi

工作原理:

  1. 检查 /dev/tpm0/dev/tpmrm0 是否存在
  2. 使用 cryptsetup --token-only 尝试使用 TPM2 token 解锁
  3. TPM 芯片验证当前 PCR 0+7 值是否与注册时一致
  4. 如果一致,TPM 解封密钥并自动解锁 ✅
  5. 如果不一致(如 BIOS 更新),TPM 拒绝解封 ❌

步骤 2 - USB Key 解锁:

# 脚本逻辑:
udevadm settle --timeout=10  # 等待设备稳定

for i in $(seq 1 30); do
    if [ -e "/dev/disk/by-label/$USB_LABEL" ]; then
        # 找到 USB Key
        mount -t ext4 -o ro "/dev/disk/by-label/$USB_LABEL" /tmp/usbkey
        if [ -f "/tmp/usbkey/$KEYFILE" ]; then
            cryptsetup luksOpen ... --key-file "/tmp/usbkey/$KEYFILE"
            # 解锁成功,清理并退出
            umount /tmp/usbkey
            exit 0
        fi
        umount /tmp/usbkey
    fi
    sleep 1  # 每秒检查一次,最多30秒
done

工作原理:

  1. 执行 udevadm settle 等待设备枚举完成
  2. 循环检测 30 秒,每秒查找标签为 USB-KEY 的设备
  3. 找到设备后,以只读方式挂载
  4. 检查密钥文件 luks_usb.key 是否存在
  5. 使用密钥文件调用 cryptsetup luksOpen 解锁 ✅
  6. 解锁成功后卸载 USB Key 并退出

步骤 3 - 密码解锁(后备方案):

# 脚本执行完毕后返回 exit 0
# systemd-cryptsetup 接管,提示用户输入密码

工作原理:

  1. 如果前两种方式都失败,脚本正常退出
  2. systemd 的 [email protected] 继续执行
  3. 在控制台显示密码提示符:
    Please unlock disk cryptlvm:
  4. 用户输入密码进行验证
  5. 密码正确则解锁 ✅,错误则重试
  6. 多次失败后进入 emergency shell

阶段 5: 挂载真实根文件系统

  1. LUKS 解锁成功,创建 /dev/mapper/cryptlvm
  2. LVM 自动激活卷组 pve 和逻辑卷
  3. 挂载 /dev/pve/root/sysroot
  4. 挂载 /dev/sda1/sysroot/boot
  5. 挂载 /dev/sda2/sysroot/boot/efi

阶段 6: 切换到真实系统

  1. switch_root 切换到 /sysroot
  2. initramfs 环境被销毁
  3. 真实系统的 systemd (PID 1) 启动

阶段 7: 系统服务启动

  1. systemd 按照依赖顺序启动服务
  2. 网络、SSH、Proxmox VE 等服务启动
  3. 系统进入可用状态
阶段 耗时 备注
UEFI 初始化 2-5 秒 取决于硬件
GRUB 加载 0.5 秒 几乎瞬间
内核加载 1-2 秒
TPM2 Token 解锁 0.5-1 秒 PCR 验证很快
USB Key 检测 + 解锁 3-10 秒 需等待 USB 枚举,最多30秒超时
密码解锁 N/A 等待用户输入
LVM 激活 0.5 秒
根分区挂载 0.5-1 秒 SSD 更快
systemd 启动 5-10 秒 取决于服务数量

总启动时间

  • TPM2 自动解锁:约 10-20 秒
  • USB Key 解锁:约 15-25 秒
  • 密码解锁:取决于用户输入速度
flowchart LR
    A[TPM2 Token 解锁] -->|成功| E[系统启动]
    A -->|失败或无 TPM| B[USB Key 解锁]
    B -->|成功| E
    B -->|失败或超时| C[密码提示]
    C -->|密码正确| E
    C -->|密码错误 或 超时| D[进入 Emergency Shell]
    D -->|手动修复| E

这种多层次的故障切换机制确保了系统在各种情况下都能解锁:

  • 正常情况:TPM2 自动解锁,无需人工干预
  • TPM 失效:降级到 USB Key 或密码
  • 完全失败:进入恢复 Shell,管理员可以手动修复

PVE 9 基于 Debian 13 “Trixie”,因此我们需要先部署一个加密的 Debian 13 系统,然后在此基础上安装 Proxmox VE。

首先制作一个 Debian 13 Live CD 的 USB 启动盘。

下载 ISO 镜像:

wget -c https://mirrors.tuna.tsinghua.edu.cn/debian-cd/current-live/amd64/iso-hybrid/debian-live-13.1.0-amd64-standard.iso

刻录到 USB 设备(注意替换 /dev/sdX 为你的 USB 设备):

dd if=debian-live-13.1.0-amd64-standard.iso of=/dev/sdX bs=4M status=progress

使用 USB 启动盘启动目标机器后,配置 SSH 以便远程操作:

apt install -y ssh
systemctl start ssh
passwd user

从另一台机器通过 SSH 连接(更方便操作):

ssh user@<目标机器IP>
sudo -i

确认系统是否具备 TPM 2.0 芯片:

dmesg | grep -i tpm
ls -l /dev/tpm*

如果看到 /dev/tpm0/dev/tpmrm0,说明 TPM 设备可用。

apt update
apt install debootstrap dosfstools cryptsetup lvm2 tpm2-tools gdisk -y

验证 TPM 功能:

tpm2_getcap properties-fixed
systemd-cryptenroll --tpm2-device=list

如果需要 USB Key 作为备用解锁方式,准备一个 U 盘:

格式化 U 盘:

mkfs.ext4 -L 'USB-KEY' /dev/sdb

生成随机密钥文件:

dd if=/dev/urandom of=/tmp/luks_usb.key bs=4096 count=1

将密钥文件复制到 U 盘:

mkdir /mnt/usbkey
mount /dev/disk/by-label/USB-KEY /mnt/usbkey
cp /tmp/luks_usb.key /mnt/usbkey/
umount /mnt/usbkey

本次部署的分区方案如下:

分区 大小 文件系统 挂载点 说明
/dev/sda1 500M ext4 /boot 引导分区(未加密)
/dev/sda2 64M vfat /boot/efi EFI 分区
/dev/sda3 剩余空间 - - LUKS 加密容器
/dev/mapper/cryptlvm - - - LVM 物理卷
/dev/pve/root 20G ext4 / 根文件系统
/dev/pve/swap 4G swap - 交换分区

使用 fdisk 创建 GPT 分区表:

fdisk /dev/sda

在 fdisk 交互界面中执行以下操作:

fdisk /dev/sda

在 fdisk 交互界面中执行以下操作:

Welcome to fdisk (util-linux 2.41).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/sda: 32 GiB, 34359738368 bytes, 67108864 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 419591BB-AF1D-4722-AAA9-F0B73CF9D026

# 创建第一个分区(/boot,500M)
Command (m for help): n
Partition number (1-128, default 1): 
First sector (2048-67108830, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-67108830, default 67106815): +500M

Created a new partition 1 of type 'Linux filesystem' and of size 500 MiB.

# 创建第二个分区(/boot/efi,64M)
Command (m for help): n
Partition number (2-128, default 2): 
First sector (1026048-67108830, default 1026048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1026048-67108830, default 67106815): +64M

Created a new partition 2 of type 'Linux filesystem' and of size 64 MiB.

# 创建第三个分区(LUKS 加密容器,使用剩余空间)
Command (m for help): n
Partition number (3-128, default 3): 
First sector (1157120-67108830, default 1157120): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1157120-67108830, default 67106815): 

Created a new partition 3 of type 'Linux filesystem' and of size 31.4 GiB.

# 保存分区表
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

格式化 /boot/boot/efi 分区:

mkfs.ext4 /dev/sda1
mkfs.fat -F32 /dev/sda2

创建 LUKS2 加密容器:

# 使用 LUKS2 格式初始化加密分区
cryptsetup luksFormat --type luks2 /dev/sda3

系统会提示确认操作,输入 YES(大写),然后设置一个强密码。这个密码将作为主要的恢复手段。

如果之前准备了 USB Key,现在添加密钥文件到 LUKS:

cryptsetup luksAddKey /dev/sda3 /tmp/luks_usb.key

输入刚才设置的 LUKS 密码以确认。

验证 USB Key 是否能正常解锁:

cryptsetup open /dev/sda3 cryptlvm --key-file /tmp/luks_usb.key

如果成功,会创建 /dev/mapper/cryptlvm 设备。

在加密容器之上创建 LVM 卷组和逻辑卷:

# 创建物理卷
pvcreate /dev/mapper/cryptlvm

# 创建卷组
vgcreate pve /dev/mapper/cryptlvm

# 创建逻辑卷(根据实际需求调整大小)
lvcreate -L 20G -n root pve    # 根分区
lvcreate -L 4G -n swap pve      # 交换分区

# 格式化逻辑卷
mkfs.ext4 /dev/pve/root
mkswap /dev/pve/swap

创建挂载点并挂载所有分区:

# 挂载根分区
mkdir -pv /mnt/debinst
mount /dev/pve/root /mnt/debinst

# 挂载 /boot
mkdir -pv /mnt/debinst/boot
mount /dev/sda1 /mnt/debinst/boot

# 挂载 /boot/efi
mkdir -pv /mnt/debinst/boot/efi
mount /dev/sda2 /mnt/debinst/boot/efi

使用 debootstrap 安装 Debian 13 “Trixie”:

debootstrap --arch amd64 trixie /mnt/debinst https://mirrors.infra.plz.ac/debian/

这个过程需要几分钟时间,会下载并安装基础系统包。

挂载必要的虚拟文件系统并切换到新系统:

# 挂载虚拟文件系统
mount -v -t proc none /mnt/debinst/proc
mount -v --rbind /sys /mnt/debinst/sys
mount -v --rbind /dev /mnt/debinst/dev
mount -v --make-rslave /mnt/debinst/sys
mount -v --make-rslave /mnt/debinst/dev

# 进入 chroot 环境
chroot /mnt/debinst /bin/bash
dpkg-reconfigure tzdata

选择你所在的时区(例如:Asia/Shanghai)。

apt-get install locales -y
dpkg-reconfigure locales

选择需要的语言环境,推荐至少包含 en_US.UTF-8zh_CN.UTF-8

apt-get update
apt install linux-image-amd64 grub-efi-amd64 lvm2 tpm2-tools wget \
  systemd-cryptsetup apt-transport-https ca-certificates aptitude \
  vim dosfstools cryptsetup efibootmgr dropbear-initramfs \
  initramfs-tools cryptsetup-initramfs -y

这些软件包包括:

  • linux-image-amd64: Linux 内核
  • grub-efi-amd64: UEFI 引导加载程序
  • lvm2: LVM 工具
  • tpm2-tools: TPM 2.0 工具
  • cryptsetup-initramfs: initramfs 中的加密支持
  • dropbear-initramfs: 可选的远程解锁支持
echo "debian-tpm" > /etc/hostname
passwd

首先获取各个分区和逻辑卷的 UUID:

blkid /dev/pve/root
blkid /dev/pve/swap
blkid /dev/sda1
blkid /dev/sda2

记录下这些 UUID,接下来需要用到。

vi /etc/fstab

添加以下内容(替换为你自己的 UUID):

# <文件系统>                                    <挂载点>    <类型>  <选项>              <dump> <pass>
UUID=c29b35e2-6d42-4444-aa03-01eb39146f87       /           ext4    errors=remount-ro   0      1
UUID=6e5fad3a-c4f9-4ec9-abad-58fe31886c7d       /boot       ext4    defaults            0      2
UUID=92A5-56AF                                  /boot/efi   vfat    umask=0077          0      1
UUID=f10a8543-a85f-425e-9100-ee8b09aa2e76       none        swap    sw                  0      0
vi /etc/crypttab

添加 LUKS 设备配置(替换为 /dev/sda3 的 UUID):

# <目标名称> <源设备> <密钥文件> <选项>
cryptlvm UUID=558ed1f4-cc23-4d7d-8b14-a2b2de3d0882 none luks,initramfs,discard

这里的配置说明:

  • cryptlvm: 解锁后的设备映射名称
  • UUID=...: LUKS 加密分区的 UUID
  • none: 不使用密钥文件(启动时会尝试 TPM/密码)
  • luks,initramfs,discard: 选项
    • luks: 使用 LUKS 解密
    • initramfs: 在 initramfs 阶段处理
    • discard: 支持 SSD TRIM(可选)

为了实现说tpm、usb key这些兜底要自己写hook。

创建并编辑/etc/initramfs-tools/hooks/crypt-unlock 内容如下:

#!/bin/sh
PREREQ=""

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
        ;;
esac

. /usr/share/initramfs-tools/hook-functions

# 复制解锁脚本到 initramfs
cat > "${DESTDIR}/usr/bin/unlock" <<'UNLOCK_SCRIPT'
#!/bin/sh
echo "Available encrypted devices:"
ls -l /dev/disk/by-uuid/ | grep 558ed1f4

echo ""
echo "Enter passphrase to unlock cryptlvm:"
/lib/cryptsetup/askpass "Enter passphrase: " | \
    /sbin/cryptsetup luksOpen /dev/disk/by-uuid/558ed1f4-cc23-4d7d-8b14-a2b2de3d0882 cryptlvm

if [ $? -eq 0 ]; then
    echo "Device unlocked successfully!"
    echo "Killing dropbear and continuing boot..."
    killall dropbear
    exit 0
else
    echo "Unlock failed!"
    exit 1
fi
UNLOCK_SCRIPT

chmod +x "${DESTDIR}/usr/bin/unlock"

exit 0

tpm的支持/etc/initramfs-tools/hooks/tpm-support

#!/bin/sh
PREREQ=""

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
        ;;
esac

. /usr/share/initramfs-tools/hook-functions

echo "Adding TPM support to initramfs..."

# 复制 systemd-cryptenroll
if [ -x /usr/bin/systemd-cryptenroll ]; then
    copy_exec /usr/bin/systemd-cryptenroll
    echo "  Added: systemd-cryptenroll"
fi

# 复制所有 TSS2 库
for lib in /usr/lib/x86_64-linux-gnu/libtss2-*.so*; do
    if [ -f "$lib" ]; then
        # 使用 copy_exec 自动处理符号链接和依赖
        copy_exec "$lib"
        echo "  Added: $(basename $lib)"
    fi
done

# 复制 cryptsetup token 插件目录
if [ -d /usr/lib/x86_64-linux-gnu/cryptsetup ]; then
    mkdir -p "${DESTDIR}/usr/lib/x86_64-linux-gnu/cryptsetup"
    cp -a /usr/lib/x86_64-linux-gnu/cryptsetup/* \
        "${DESTDIR}/usr/lib/x86_64-linux-gnu/cryptsetup/" 2>/dev/null || true
    echo "  Added: cryptsetup plugins"
fi

# 确保必要的库存在
for lib in libcrypto libssl libgcc_s libc; do
    for file in /usr/lib/x86_64-linux-gnu/${lib}.so*; do
        if [ -f "$file" ]; then
            copy_exec "$file"
        fi
    done
done

echo "TPM support added successfully"

exit 0

usb的支持/etc/initramfs-tools/hooks/usb-unlock

#!/bin/sh
PREREQ=""

prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
        ;;
esac

. /usr/share/initramfs-tools/hook-functions

# 复制必要的二进制文件
copy_exec /bin/mount /bin
copy_exec /bin/umount /bin
copy_exec /sbin/cryptsetup /sbin
copy_exec /bin/mkdir /bin

# 添加文件系统模块
manual_add_modules ext4
manual_add_modules vfat
manual_add_modules nls_cp437
manual_add_modules nls_iso8859_1

# 添加 USB 驱动
manual_add_modules usb-storage
manual_add_modules uas
manual_add_modules xhci-hcd
manual_add_modules ehci-hcd
manual_add_modules ohci-hcd
manual_add_modules uhci-hcd
manual_add_modules xhci-pci
manual_add_modules ehci-pci

# 添加 TPM 驱动
manual_add_modules tpm_tis
manual_add_modules tpm_crb
manual_add_modules tpm

exit 0

创建解锁的脚本/etc/initramfs-tools/scripts/local-top/cryptroot-unlock

#!/bin/sh
PREREQ="udev"
prereqs() {
    echo "$PREREQ"
}

case "$1" in
    prereqs)
        prereqs
        exit 0
        ;;
esac

. /scripts/functions

USB_LABEL="USB-KEY"
KEYFILE="luks_usb.key"
LUKS_UUID="558ed1f4-cc23-4d7d-8b14-a2b2de3d0882"
LUKS_NAME="cryptlvm"

# 检查是否已经解锁
if [ -e "/dev/mapper/$LUKS_NAME" ]; then
    log_success_msg "LUKS device already unlocked"
    exit 0
fi

# 第一步:尝试 TPM Token 解锁
log_begin_msg "Attempting TPM token unlock..."
if [ -e /dev/tpm0 ] || [ -e /dev/tpmrm0 ]; then
    # 使用 cryptsetup 的 token 功能解锁
    if /sbin/cryptsetup open --token-only "/dev/disk/by-uuid/$LUKS_UUID" "$LUKS_NAME" 2>&1; then
        log_success_msg "LUKS unlocked with TPM token"
        exit 0
    else
        log_warning_msg "TPM token unlock failed"
    fi
else
    log_warning_msg "No TPM device found"
fi

# 第二步:尝试 USB Key 解锁
log_begin_msg "Looking for USB key..."
udevadm settle --timeout=10

for i in $(seq 1 30); do
    if [ -e "/dev/disk/by-label/$USB_LABEL" ]; then
        log_success_msg "USB key found"
        break
    fi
    sleep 1
done

if [ -e "/dev/disk/by-label/$USB_LABEL" ]; then
    mkdir -p /tmp/usbkey

    if mount -t ext4 -o ro "/dev/disk/by-label/$USB_LABEL" /tmp/usbkey 2>/dev/null; then
        if [ -f "/tmp/usbkey/$KEYFILE" ]; then
            log_success_msg "Found keyfile, attempting unlock..."
            if /sbin/cryptsetup luksOpen "/dev/disk/by-uuid/$LUKS_UUID" "$LUKS_NAME" \
                --key-file "/tmp/usbkey/$KEYFILE" 2>&1; then
                log_success_msg "LUKS unlocked with USB key"
                umount /tmp/usbkey
                exit 0
            fi
        fi
        umount /tmp/usbkey
    fi
fi

log_warning_msg "All automatic unlock methods failed"
exit 0
update-initramfs -u -k all

这会生成包含加密支持的 initramfs。

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Debian

编辑 GRUB 默认配置:

vi /etc/default/grub

修改内核命令行参数:

GRUB_CMDLINE_LINUX="root=/dev/mapper/pve-root"

生成 GRUB 配置文件:

grub-mkconfig -o /boot/grub/grub.cfg

将 LUKS 密钥注册到 TPM 芯片:

systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/sda3

输入之前设置的 LUKS 密码,系统会输出类似信息:

 Please enter current passphrase for disk /dev/sda3: ••••••••••••••••
Warning: keyslot operation could fail as it requires more than available memory.
New TPM2 token enrolled as key slot 2.

这表示 TPM 密钥已成功添加到密钥槽 2。

查看当前的 LUKS 配置:

cryptsetup luksDump /dev/sda3

输出示例:

LUKS header information
Version:        2
Epoch:          6
Metadata area:  16384 [bytes]
Keyslots area:  16744448 [bytes]
UUID:           558ed1f4-cc23-4d7d-8b14-a2b2de3d0882

Keyslots:
  0: luks2                    # 用户密码
     Key:        512 bits
     ...
  1: luks2                    # USB Key
     Key:        512 bits
     ...
  2: luks2                    # TPM2
     Key:        512 bits
     PBKDF:      pbkdf2
     ...
Tokens:
  0: systemd-tpm2
     tpm2-hash-pcrs:   0+7
     tpm2-pcr-bank:    sha256
     ...
     Keyslot:    2

可以看到三个密钥槽:

  • 槽位 0: 用户密码
  • 槽位 1: USB Key 密钥文件
  • 槽位 2: TPM2 自动解锁
apt-get install ssh -y

编辑 SSH 配置文件:

vi /etc/ssh/sshd_config

修改或添加以下行:

PermitRootLogin yes

启用 SSH 服务开机自启:

systemctl enable ssh

编辑网络配置文件:

vi /etc/network/interfaces

添加静态 IP 配置(根据实际情况修改):

auto ens18
iface ens18 inet static
    address 10.31.0.119
    network 10.31.0.0
    netmask 255.255.255.0
    broadcast 10.31.0.255
    gateway 10.31.0.254
echo "nameserver 10.31.0.252" > /etc/resolv.conf
echo "10.31.0.119 debian-tpm" >> /etc/hosts

编辑软件源列表:

vi /etc/apt/sources.list

使用以下内容(这里使用了国内镜像加速):

deb https://mirrors.infra.plz.ac/debian/ trixie main contrib non-free non-free-firmware
# deb-src https://mirrors.infra.plz.ac/debian/ trixie main contrib non-free non-free-firmware

deb https://mirrors.infra.plz.ac/debian/ trixie-updates main contrib non-free non-free-firmware
# deb-src https://mirrors.infra.plz.ac/debian/ trixie-updates main contrib non-free non-free-firmware

deb https://mirrors.infra.plz.ac/debian/ trixie-backports main contrib non-free non-free-firmware
# deb-src https://mirrors.infra.plz.ac/debian/ trixie-backports main contrib non-free non-free-firmware

deb https://mirrors.infra.plz.ac/debian-security trixie-security main contrib non-free non-free-firmware
# deb-src https://mirrors.infra.plz.ac/debian-security trixie-security main contrib non-free non-free-firmware
exit
umount -R /mnt/debinst
vgchange -an pve
cryptsetup close cryptlvm
reboot

现在可以拔掉 Live CD,但如果配置了 USB Key,保持插入状态。

系统重启后,如果 TPM 配置正确,应该会自动解锁加密分区并启动到登录界面。

基础系统安装完成后,现在可以在加密的 Debian 13 之上安装 Proxmox VE 9。

创建并编辑 Proxmox 仓库配置文件:

vi /etc/apt/sources.list.d/proxmox.sources

添加以下内容:

Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg

如果想要用国内仓库可以用:

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
wget https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg \
  -O /usr/share/keyrings/proxmox-archive-keyring.gpg
apt-get update
apt-get full-upgrade -y
apt-get install proxmox-ve -y

安装完成重启后,可以通过浏览器访问 Proxmox VE 的 Web 管理界面:

https://你的服务器IP:8006

使用 root 用户和之前设置的密码登录。

部署完成后,让我们验证各种解锁方式是否正常工作。

重启系统:

reboot

观察启动过程:

  • [成功] 成功:系统直接启动到登录界面,无需输入任何密码
  • [失败] 失败:停在密码输入提示符,说明 TPM 解锁失败

如果 TPM 解锁失败,可能的原因:

  1. PCR 值改变(BIOS 更新、安全启动状态变化)
  2. TPM 芯片被禁用或清空
  3. initramfs 配置问题

如果配置了 USB Key:

  1. 拔掉 USB Key,重启系统
  2. 系统应该停在密码输入提示符
  3. 插入 USB Key
  4. 系统应该自动检测并解锁(取决于 initramfs 配置)

注意:标准的 systemd-cryptsetup 不会自动检测 USB Key 的热插拔,可能仍需输入密码或需要额外的 initramfs 脚本支持。

这是最基本的解锁方式,永远可用:

  1. 在 BIOS 中禁用 TPM 或删除 TPM 密钥
  2. 移除 USB Key
  3. 重启系统
  4. 在启动时输入 LUKS 密码
  5. 系统应该正常解锁并启动

当系统无法正常启动或需要进行维护时,可以使用 Debian Live CD 进入恢复模式。本节介绍完整的故障排查和修复流程。

flowchart TD
    A[系统启动失败] --> B{故障类型判断}
    
    B -->|TPM 解锁失败| C[BIOS 更新/PCR 改变]
    B -->|密码忘记| D[需要重置或恢复]
    B -->|引导损坏| E[GRUB/内核问题]
    B -->|分区损坏| F[文件系统错误]
    
    C --> G[准备 Live CD]
    D --> G
    E --> G
    F --> G
    
    G --> H[启动到 Live 环境]
    H --> I[安装恢复工具]
    I --> J{能否解锁 LUKS?}
    
    J -->|有密码| K[使用密码解锁]
    J -->|有 USB Key| L[使用 USB Key 解锁]
    J -->|都没有| M[尝试暴力恢复或数据丢失]
    
    K --> N[激活 LVM]
    L --> N
    
    N --> O[挂载文件系统]
    O --> P[进入 chroot 环境]
    
    P --> Q{执行修复操作}
    
    Q -->|TPM 问题| R[重新注册 TPM]
    Q -->|引导问题| S[重装 GRUB]
    Q -->|initramfs 问题| T[重建 initramfs]
    Q -->|密钥管理| U[修改密钥槽]
    Q -->|系统更新| V[更新/降级软件包]
    
    R --> W[验证修复]
    S --> W
    T --> W
    U --> W
    V --> W
    
    W --> X[清理并退出 chroot]
    X --> Y[卸载文件系统]
    Y --> Z[关闭 LUKS 和 LVM]
    Z --> AA[重启验证]
    
    AA --> AB{启动成功?}
    AB -->|是| AC["恢复完成 ✓"]
    AB -->|否| AD[重新诊断问题]
    AD --> B
    
    M --> AE[考虑专业数据恢复]

使用之前制作的 Debian Live CD 或 USB 启动盘启动系统。

配置 SSH 以便远程操作(推荐):

# 安装并启动 SSH 服务
apt install -y ssh
systemctl start ssh

# 设置临时密码
passwd user

从另一台机器远程连接

ssh user@<目标机器IP>
sudo -i
apt update
apt install -y debootstrap dosfstools cryptsetup lvm2 tpm2-tools gdisk vim

工具说明

  • cryptsetup: LUKS 加密管理
  • lvm2: LVM 卷管理
  • tpm2-tools: TPM 诊断和管理
  • gdisk: GPT 分区表工具

根据你拥有的解锁方式选择:

方式 1: 使用密码解锁(最常用)

cryptsetup open /dev/sda3 cryptlvm

系统会提示输入密码。输入后会创建 /dev/mapper/cryptlvm 设备。

方式 2: 使用 USB Key 解锁

首先确认 USB Key 已插入并被识别:

# 查看 USB 设备
lsblk
# 或
ls -l /dev/disk/by-label/

# 使用密钥文件解锁
cryptsetup open /dev/sda3 cryptlvm --key-file /dev/disk/by-label/USB-KEY/luks_usb.key

方式 3: 查看 LUKS 信息诊断

# 查看 LUKS 头信息
cryptsetup luksDump /dev/sda3

# 检查可用的密钥槽
cryptsetup luksDump /dev/sda3 | grep "Keyslots:" -A 30

# 检查 TPM Token
cryptsetup luksDump /dev/sda3 | grep "Tokens:" -A 20

LUKS 解锁后,激活 LVM:

# 扫描并激活所有卷组
vgscan
vgchange -ay

# 查看逻辑卷
lvs
lvscan

你应该看到类似输出:

ACTIVE            '/dev/pve/root' [20.00 GiB] inherit
ACTIVE            '/dev/pve/swap' [4.00 GiB] inherit

按照正确的顺序挂载所有分区:

# 创建挂载点
mkdir -pv /mnt/debinst

# 挂载根分区
mount /dev/pve/root /mnt/debinst

# 挂载 /boot 分区
mkdir -pv /mnt/debinst/boot
mount /dev/sda1 /mnt/debinst/boot

# 挂载 EFI 分区
mkdir -pv /mnt/debinst/boot/efi
mount /dev/sda2 /mnt/debinst/boot/efi

# 验证挂载
df -h | grep debinst

挂载虚拟文件系统并切换到目标系统:

# 挂载必要的虚拟文件系统
mount -v -t proc none /mnt/debinst/proc
mount -v --rbind /sys /mnt/debinst/sys
mount -v --rbind /dev /mnt/debinst/dev
mount -v --make-rslave /mnt/debinst/sys
mount -v --make-rslave /mnt/debinst/dev

# 可选:挂载 /run(某些操作需要)
mount -v --rbind /run /mnt/debinst/run
mount -v --make-rslave /mnt/debinst/run

# 进入 chroot
chroot /mnt/debinst /bin/bash

# 设置环境变量(可选)
export PS1="(chroot) $PS1"

现在你已经在目标系统的环境中了!

症状

  • 系统停在密码输入提示符
  • 之前可以自动启动,现在不行
  • BIOS 刚刚更新过

原因:BIOS 更新改变了 PCR 0 的值,TPM 拒绝解封密钥。

修复步骤

# 在 chroot 环境中

# 1. 查看当前 TPM 状态
tpm2_pcrread sha256:0,7

# 2. 删除旧的 TPM 密钥槽
systemd-cryptenroll --wipe-slot=tpm2 /dev/sda3

# 3. 重新注册 TPM(使用新的 PCR 值)
systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/sda3

# 4. 验证注册成功
cryptsetup luksDump /dev/sda3 | grep -A 15 "systemd-tpm2"

症状

  • 系统无法找到引导加载程序
  • 显示 “No bootable device” 或 “GRUB rescue”
  • EFI 启动项丢失

修复步骤

# 在 chroot 环境中

# 1. 重新安装 GRUB
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Debian

# 2. 重新生成 GRUB 配置
grub-mkconfig -o /boot/grub/grub.cfg

# 3. 验证 EFI 启动项
efibootmgr -v

# 4. 如果需要,手动创建启动项
efibootmgr -c -d /dev/sda -p 2 -L "Debian" -l '\EFI\debian\grubx64.efi'

症状

  • 系统启动时内核 panic
  • 找不到根设备
  • 加密模块未加载
  • TPM 或 USB Key 自动解锁不工作

修复步骤

# 在 chroot 环境中

# 1. 检查 initramfs hooks 文件是否存在
ls -la /etc/initramfs-tools/hooks/
# 应该看到:crypt-unlock, tpm-support, usb-unlock

# 2. 检查解锁脚本是否存在
ls -la /etc/initramfs-tools/scripts/local-top/
# 应该看到:cryptroot-unlock

# 3. 验证 hooks 可执行权限
chmod +x /etc/initramfs-tools/hooks/*
chmod +x /etc/initramfs-tools/scripts/local-top/*

# 4. 检查 LUKS UUID 是否正确
blkid /dev/sda3
# 确保 UUID 与 hooks 脚本中的 LUKS_UUID 一致

# 5. 如果需要,更新脚本中的 UUID
ACTUAL_UUID=$(blkid -s UUID -o value /dev/sda3)
echo "实际 UUID: $ACTUAL_UUID"
# 手动编辑脚本更新 UUID
vi /etc/initramfs-tools/hooks/crypt-unlock
vi /etc/initramfs-tools/scripts/local-top/cryptroot-unlock

# 6. 重建所有内核的 initramfs
update-initramfs -u -k all

# 7. 验证 initramfs 内容
lsinitramfs /boot/initrd.img-$(uname -r) | grep -E 'cryptsetup|unlock|tpm|usb'

# 8. 检查是否包含必要的库
lsinitramfs /boot/initrd.img-$(uname -r) | grep tss2

修复步骤

# 在 chroot 环境中(前提是你能用其他方式解锁 LUKS)

# 1. 添加新密码到新的密钥槽
cryptsetup luksAddKey /dev/sda3
# 输入当前可用的密码,然后输入新密码

# 2. 或者更改现有密钥槽的密码
cryptsetup luksChangeKey /dev/sda3 -S 0
# -S 0 指定密钥槽编号

# 3. 删除忘记的密码槽(可选)
cryptsetup luksKillSlot /dev/sda3 1
# 谨慎操作!确保至少保留一个可用的密钥槽

修复步骤

# 在 chroot 环境中

# 1. 准备新的 USB Key
mkfs.ext4 -L 'USB-KEY-NEW' /dev/sdb1

# 2. 生成新的密钥文件
dd if=/dev/urandom of=/tmp/new_usb.key bs=4096 count=1

# 3. 添加新密钥到 LUKS
cryptsetup luksAddKey /dev/sda3 /tmp/new_usb.key

# 4. 复制密钥到新 USB
mkdir /mnt/newusb
mount /dev/disk/by-label/USB-KEY-NEW /mnt/newusb
cp /tmp/new_usb.key /mnt/newusb/luks_usb.key
chmod 400 /mnt/newusb/luks_usb.key
umount /mnt/newusb

# 5. 删除旧的 USB Key 密钥槽(如果需要)
cryptsetup luksDump /dev/sda3  # 先确认槽位号
cryptsetup luksKillSlot /dev/sda3 <旧的槽位号>

# 6. 清理临时文件
shred -vfz -n 3 /tmp/new_usb.key

修复步骤

# 在 chroot 环境中

# 1. 检查系统日志
journalctl -xb -1  # 查看上次启动的日志

# 2. 降级问题软件包(示例)
apt install <package>=<旧版本号>

# 3. 或者更新到最新版本
apt update
apt full-upgrade

# 4. 重建 initramfs 和 GRUB
update-initramfs -u -k all
update-grub
cryptsetup luksDump /dev/sda3

示例输出分析:

Keyslots:
  0: luks2        ← 密码解锁
     Key:        512 bits
     PBKDF:      argon2id
     ...
  1: luks2        ← USB Key 解锁
     Key:        512 bits
     PBKDF:      argon2id
     ...
  2: luks2        ← TPM2 解锁
     Key:        512 bits
     PBKDF:      pbkdf2
     ...
# 推荐配置:至少保留两种解锁方式

# 槽位 0: 主密码(强密码,妥善保管)
# 槽位 1: 备用密码(存放在安全的地方)
# 槽位 2: TPM2(日常使用)
# 槽位 3: USB Key(备用)

# 定期测试所有解锁方式
for slot in 0 1 2 3; do
    echo "Testing slot $slot..."
    cryptsetup luksDump /dev/sda3 | grep -A 5 "^  $slot:"
done

完成所有修复操作后,按以下顺序清理:

# 1. 退出 chroot 环境
exit

# 2. 卸载所有文件系统(顺序很重要!)
umount -v /mnt/debinst/run  # 如果挂载了
umount -v /mnt/debinst/dev
umount -v /mnt/debinst/sys
umount -v /mnt/debinst/proc
umount -v /mnt/debinst/boot/efi
umount -v /mnt/debinst/boot
umount -v /mnt/debinst

# 或者使用递归卸载
umount -R /mnt/debinst

# 3. 停用 LVM 卷组
vgchange -an pve

# 4. 关闭 LUKS 加密设备
cryptsetup close cryptlvm

# 5. 验证清理完成
lsblk
dmsetup ls

# 6. 重启系统
echo "修复完成,准备重启验证..."
reboot

系统重启后,观察启动过程:

flowchart LR
    A[系统重启] --> B{TPM 自动解锁}
    B -->|成功| C["正常启动 ✓"]
    B -->|失败| D{USB Key 解锁}
    D -->|成功| C
    D -->|失败| E{密码解锁}
    E -->|成功| C
    E -->|失败| F["需要重新修复 ✗"]
    
    C --> G[登录系统验证]
    G --> H{检查日志}
    H -->|无错误| I["修复成功 ✓"]
    H -->|有警告| J[进一步调查]
    
    F --> K[重新进入恢复流程]

系统启动后的验证清单

# 1. 检查 systemd 服务状态
systemctl status [email protected]

# 2. 查看启动日志
journalctl -b | grep -i crypt
journalctl -b | grep -i tpm

# 3. 验证所有分区挂载正常
df -h
lsblk

# 4. 检查 LVM 状态
vgs
lvs

# 5. 测试 TPM 功能
tpm2_pcrread sha256:0,7

# 6. 验证 LUKS 配置
cryptsetup status cryptlvm
# ===== LUKS 诊断 =====
cryptsetup luksDump /dev/sda3                    # 查看 LUKS 头信息
cryptsetup isLuks /dev/sda3 && echo "是 LUKS"   # 验证是否为 LUKS 设备
cryptsetup status cryptlvm                       # 查看解锁状态

# ===== TPM 诊断 =====
tpm2_getcap properties-fixed                     # TPM 基本信息
tpm2_pcrread                                     # 读取所有 PCR 值
systemd-cryptenroll --tpm2-device=list          # 列出 TPM 设备

# ===== LVM 诊断 =====
pvs                                              # 物理卷概览
vgs                                              # 卷组概览
lvs                                              # 逻辑卷概览
vgdisplay pve                                    # 详细卷组信息

# ===== 分区诊断 =====
lsblk -f                                         # 显示文件系统和 UUID
blkid                                            # 显示所有块设备 UUID
fdisk -l /dev/sda                                # 分区表信息
gdisk -l /dev/sda                                # GPT 分区表详情

# ===== 引导诊断 =====
efibootmgr -v                                    # EFI 启动项
ls -la /boot/efi/EFI/                           # EFI 分区内容
grub-install --version                           # GRUB 版本
# 备份 LUKS header(非常重要!)
cryptsetup luksHeaderBackup /dev/sda3 \
    --header-backup-file /secure/backup/luks-header-$(date +%Y%m%d).img

# 验证备份
file /secure/backup/luks-header-*.img

# 恢复 header(仅在紧急情况下!)
# cryptsetup luksHeaderRestore /dev/sda3 \
#     --header-backup-file /secure/backup/luks-header-YYYYMMDD.img

创建恢复文档并妥善保管:

# 记录重要信息
cat > /secure/recovery-info.txt << EOF
=== 加密系统恢复信息 ===
创建日期: $(date)
主机名: $(hostname)

LUKS 设备: /dev/sda3
UUID: $(blkid -s UUID -o value /dev/sda3)

密钥槽配置:
- 槽位 0: 主密码
- 槽位 1: 备用密码
- 槽位 2: TPM2 (PCR 0+7)
- 槽位 3: USB Key (label: USB-KEY)

LVM 配置:
- VG: pve
- LV root: /dev/pve/root (20G)
- LV swap: /dev/pve/swap (4G)

TPM PCR 值:
$(tpm2_pcrread sha256:0,7)

最后更新: $(date)
EOF

定期(例如每季度)测试完整的恢复流程:

# 测试检查清单
□ Live CD 可以正常启动
□ 密码可以解锁 LUKS
□ USB Key 可以解锁 LUKS  
□ 可以进入 chroot 环境
□ 可以重建 initramfs
□ 可以重装 GRUB
□ TPM 重新注册流程正常

如果服务器部署在远程机房,可以配置 Dropbear SSH 在 initramfs 阶段允许远程解锁。这在自动解锁失败时非常有用。

# 安装 dropbear-initramfs
apt install -y dropbear-initramfs

# 配置 Dropbear 监听端口和选项
vi /etc/dropbear/initramfs/dropbear.conf

添加配置:

# Dropbear 在 initramfs 中的配置
DROPBEAR_OPTIONS="-p 2222 -s -j -k -I 60"
# -p 2222: 监听 2222 端口(避免与正常 SSH 冲突)
# -s: 禁用密码登录(仅使用密钥)
# -j: 禁用本地端口转发
# -k: 禁用远程端口转发
# -I 60: 60秒无活动断开连接

添加授权的 SSH 公钥:

# 从你的管理机复制公钥
cat ~/.ssh/id_rsa.pub | ssh root@target-server \
    'cat >> /etc/dropbear/initramfs/authorized_keys'

# 或者在目标服务器上直接编辑
vi /etc/dropbear/initramfs/authorized_keys
# 粘贴你的 SSH 公钥

配置网络(initramfs 需要知道网络配置):

vi /etc/initramfs-tools/initramfs.conf

添加或修改:

# 网络配置格式: IP地址:服务器IP:网关:子网掩码:主机名:网卡:off
IP=10.31.0.119::10.31.0.254:255.255.255.0:debian-tpm:ens18:off

在之前创建的 /etc/initramfs-tools/hooks/crypt-unlock 中已经包含了 unlock 命令,它会在解锁成功后自动终止 dropbear:

# unlock 命令会执行以下操作:
# 1. 显示加密设备信息
# 2. 提示输入密码
# 3. 尝试解锁 LUKS 设备
# 4. 成功后自动 killall dropbear,继续启动流程

更新 initramfs 以应用配置:

update-initramfs -u -k all

当服务器重启后 TPM 和 USB Key 都无法自动解锁时,系统会:

  1. 加载 initramfs 中的网络配置
  2. 启动 Dropbear SSH 服务监听 2222 端口
  3. 等待管理员远程连接

从管理机连接

# 使用 SSH 连接到 initramfs 环境
ssh -p 2222 [email protected]

# 连接后,会看到一个简化的 shell 环境

执行解锁

# 方法 1: 使用预置的 unlock 脚本(推荐)
unlock

# 脚本会提示:
# Available encrypted devices:
# lrwxrwxrwx 1 root root 10 Nov 17 08:30 558ed1f4-cc23-4d7d-8b14-a2b2de3d0882 -> ../../sda3
#
# Enter passphrase to unlock cryptlvm:
# Enter passphrase: 

# 输入正确密码后会显示:
# Device unlocked successfully!
# Killing dropbear and continuing boot...

# SSH 连接会自动断开,系统继续启动
# 方法 2: 手动解锁(如果 unlock 脚本不可用)
cryptsetup luksOpen /dev/disk/by-uuid/558ed1f4-cc23-4d7d-8b14-a2b2de3d0882 cryptlvm

# 解锁成功后手动终止 dropbear
killall dropbear
# 或直接 exit,系统会继续启动

在部署到生产环境前,务必测试远程解锁功能:

# 1. 临时移除 TPM 令牌(仅测试)
systemd-cryptenroll --wipe-slot=tpm2 /dev/sda3

# 2. 移除或断开 USB Key

# 3. 重启系统
reboot

# 4. 从另一台机器尝试远程连接和解锁
ssh -p 2222 [email protected]
unlock

# 5. 测试成功后,重新添加 TPM 令牌
systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/sda3
  1. 网络隔离: 确保 initramfs 环境的网络只能从受信任的管理网络访问
  2. 密钥管理: 只使用 SSH 密钥认证,禁用密码登录(-s 选项)
  3. 防火墙规则: 限制 2222 端口只允许特定 IP 访问
  4. 定期测试: 至少每季度测试一次远程解锁流程

如果远程解锁不工作:

# 在恢复模式下检查 initramfs 内容
lsinitramfs /boot/initrd.img-$(uname -r) | grep dropbear
lsinitramfs /boot/initrd.img-$(uname -r) | grep authorized_keys

# 检查网络配置是否包含在 initramfs 中
lsinitramfs /boot/initrd.img-$(uname -r) | grep -E 'ip|network'

# 查看 dropbear 配置
cat /etc/dropbear/initramfs/dropbear.conf

# 验证公钥文件
cat /etc/dropbear/initramfs/authorized_keys
  1. 物理安全:加密只能防止磁盘被盗后的数据泄露,无法防止物理访问时的攻击
  2. 密钥管理
    • LUKS 密码应足够复杂(建议 20+ 字符)
    • USB Key 应妥善保管,最好有备份
    • 定期更换密码
  3. TPM 限制
    • TPM 只绑定到启动路径,无法防止内存攻击(冷启动攻击)
    • 如果需要更高安全性,考虑禁用 TPM 自动解锁,只保留密码
  4. 备份
    • 务必保存 LUKS header 备份:cryptsetup luksHeaderBackup /dev/sda3 --header-backup-file luks-header.img
    • 记录所有密码和恢复方式

为了充分发挥 TPM 的安全性,建议启用 UEFI Secure Boot:

  1. 在 BIOS 中启用 Secure Boot
  2. 使用签名的内核和引导加载程序
  3. 考虑使用 tpm2-pcrs=0+2+7 包含更多 PCR

启用 systemd journal 持久化,记录所有解锁尝试:

mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal

查看解锁日志:

journalctl -u [email protected]

LUKS 加密对性能的影响:

  • CPU:现代 CPU 支持 AES-NI 指令集,加密开销很小(通常 < 5%)
  • 延迟:几乎无影响
  • 吞吐量:SSD 上的影响可忽略不计

验证 AES-NI 是否启用:

grep -m1 -o aes /proc/cpuinfo
cryptsetup benchmark

本文详细介绍了如何为 Proxmox VE 9 部署全盘加密系统,并配置了三种解锁方式:

  1. 密码解锁:最基本的方式,适合恢复和紧急情况
  2. TPM2 自动解锁:最便捷的方式,适合日常使用
  3. USB Key 解锁:物理令牌方式,适合作为备用方案

这种多层次的解锁策略既保证了数据安全,又兼顾了运维便利性,特别适合部署在边缘机房或需要自动重启恢复的场景。

记住加密的黄金法则:加密保护的是磁盘数据,不是正在运行的系统。一旦系统解锁并运行,数据就在内存中处于明文状态。因此,物理安全、访问控制和其他安全措施同样重要。