1 分钟阅读 次阅读

一、LUKS 是什么

LUKS(Linux Unified Key Setup)是 Linux 下块设备(磁盘/分区)加密的事实标准,通过 cryptsetup 工具管理。

简单说:LUKS 对整块分区或磁盘进行透明加密,挂载后使用和普通磁盘无异,但底层数据是密文,拔走硬盘无法直接读取。

┌─────────────────────────────────┐
│         应用层(App)             │  ← 读写文件和普通磁盘一样
├─────────────────────────────────┤
│         VFS / 文件系统            │
├─────────────────────────────────┤
│    dm-crypt(内核映射层)         │  ← 透明加解密,内核完成
├─────────────────────────────────┤
│    LUKS Header → 实际块设备       │  ← 磁盘上存的是密文
└─────────────────────────────────┘

LUKS 只是一个标准格式规范,实际加解密由内核模块 dm-crypt 执行,管理工具是 cryptsetup


二、核心概念

2.1 LUKS Header(头部)

每个 LUKS 加密分区的开头有一个 LUKS Header,存储:

内容 说明
魔数 LUKS\xba\xbe,识别 LUKS 格式
版本 LUKS1 或 LUKS2
加密算法 AES、Serpent、Twofish 等
密钥槽(Key Slot) 最多 8 个独立密码位置
主密钥(Master Key)密文 每个槽存储一份用槽密码加密的主密钥副本

2.2 主密钥 vs 用户密码

用户密码(Passphrase)
    │
    └──→ [PBKDF2/Argon2 密钥派生] → 槽密钥
              │
              └──→ 解密主密钥(Master Key)← 存在 LUKS Header
                        │
                        └──→ 真正加密/解密磁盘数据
对比 用户密码 主密钥(Master Key)
谁设置的 用户 cryptsetup luksFormat 随机生成
能否修改 luksChangeKey ❌ 修改需要全盘重新加密
长度 用户定义 通常是 256/512 位随机数
用途 解锁密钥槽 真正加密数据的密钥

关键设计:修改用户密码不需要重新加密全盘,因为只改密钥槽里的主密钥密文,主密钥本身不变。

2.3 密钥槽(Key Slots)

LUKS 支持最多 8 个密钥槽,每个槽独立解密主密钥:

LUKS Header
├── Key Slot 0: 主密钥密文(用员工A的密码加密)
├── Key Slot 1: 主密钥密文(用员工B的密码加密)
├── ...
└── Key Slot 7: 主密钥密文

实际用途

  • 管理员和用户各持一个密码
  • 设置一个恢复密码(万一忘记主密码)
  • 离职只需删除对应槽,不影响其他人

三、LUKS1 vs LUKS2

对比 LUKS1 LUKS2
发布年份 2004 2017
Header 大小 固定 2MB 灵活,默认 16MB
密钥派生算法 仅 PBKDF2 Argon2(抗 GPU/ASIC 破解)
完整性校验 ✅ 防止篡改攻击
元数据格式 二进制 JSON,可扩展
支持持久化标识 ✅ token、label 等
内核要求 全部支持 需要 4.12+
当前推荐 遗留兼容 默认推荐

现在用 cryptsetup luksFormat 默认创建的就是 LUKS2。


五、LUKS 加密层的内核实现

5.1 dm-crypt 与 device-mapper

用户写入 /mnt/
    │
    ▼
文件系统 (ext4/xfs)
    │
    ▼
/dev/mapper/mysecret  ← dm-crypt 虚拟块设备
    │                    │
    │                    ├── 加密写入数据
    │                    └── 解密读取数据
    ▼
/dev/sdb1             ← 物理设备,存储的是密文

LUKS 是”格式标准”,dm-crypt 是”加密引擎”,device-mapper 是”目标映射框架”。三者关系:

cryptsetup(用户工具)
    │
    ├── luksFormat:写入 LUKS Header 到磁盘
    │
    └── luksOpen:配置 dm-crypt 目标
            │
            └── dmsetup create mysecret --table "0 <size> crypt aes-xts-plain64 <key> 0 /dev/sdb1 0"
                    │
                    └── 创建 /dev/mapper/mysecret

六、LUKS 在实际产品中的应用

6.1 嵌入式设备数据分区加密

Rockchip / Android / Ubuntu 设备
├── boot 分区:不加密(需要启动)
├── rootfs:可选加密(initramfs 解锁)
└── userdata:LUKS 加密
    └── 存储用户数据、日志、配置文件

七、安全注意事项

注意点 说明
LUKS Header 备份 cryptsetup luksHeaderBackup 备份头部,Header 损坏 = 数据完全丢失
忘记密码 没有后门!删完所有密钥槽则数据永久不可恢复
主密钥泄露 更换密码不更新主密钥,若担心主密钥泄露需 reencrypt 全盘重加密
冷启动攻击 内存中的密钥在关机后短暂残留,物理接触攻击面
性能影响 CPU 有 AES-NI 指令集时加密开销极小(< 5%),软件实现约 10~30%

八、与其他加密方案对比

方案 层级 特点
LUKS + dm-crypt 块设备层 整盘透明加密,对上层文件系统/应用无感知
fscrypt 文件系统层 按目录加密(Android 用此方案)
eCryptfs 文件系统层 按文件加密(旧 Ubuntu Home 加密方案)
f2fs 原生加密 文件系统层 f2fs 内置,Android 数据分区常用
自加密硬盘 SED 硬件层 主控内完成,不消耗 CPU

留下评论