用 LUKS 给整盘加密 + 启动时密码解锁(Debian / Ubuntu)

笔记本 / 移动机器一旦丢失,硬盘上的数据如果没加密,攻击者拆下盘
插到另一台机器就能读。LUKS(Linux Unified Key Setup)是 Linux
标准全盘加密方案。

下面分两个场景:
- A. 新装系统时加密
- B. 给已有数据盘加密

A. 新装系统时加密(推荐)

Debian / Ubuntu / Fedora 安装器都有"加密整盘"选项,勾上即可:

  • 设置一个开机解锁密码(passphrase)
  • 安装器自动建 LUKS 容器 + LVM 上挂分区

完成后启动会先停在密码输入界面,输对了才进 grub / 启动内核。

校验:

lsblk
# NAME                  TYPE  MOUNTPOINT
# nvme0n1
# ├─nvme0n1p1           part  /boot/efi
# ├─nvme0n1p2           part  /boot
# └─nvme0n1p3           part
#   └─nvme0n1p3_crypt   crypt
#     ├─ubuntu--vg-root lvm   /
#     └─ubuntu--vg-swap lvm   [SWAP]

sudo cryptsetup status nvme0n1p3_crypt
# /dev/mapper/nvme0n1p3_crypt is active and is in use.
# type:    LUKS2
# cipher:  aes-xts-plain64
# keysize: 512 bits

B. 给已有数据盘 / 第二块盘加密

# 准备空盘 /dev/sdb(数据会清!)
sudo cryptsetup luksFormat /dev/sdb
# WARNING! Will overwrite data on /dev/sdb irrevocably.
# Are you sure? (Type 'yes' in capital letters): YES
# Enter passphrase: ...
# Verify passphrase: ...

sudo cryptsetup open /dev/sdb data
# 设备出现在 /dev/mapper/data

# 在加密容器内建文件系统
sudo mkfs.ext4 /dev/mapper/data

# 挂载
sudo mkdir /mnt/data
sudo mount /dev/mapper/data /mnt/data

启动时自动打开(/etc/crypttab)

/etc/crypttab

data UUID=<luks-uuid> none luks,discard

获取 UUID:sudo blkid /dev/sdbUUID="..."

/etc/fstab

/dev/mapper/data /mnt/data ext4 defaults,nofail 0 2

none 是 keyfile 字段。如果填路径,开机用那个文件解锁(无需输密码)。
luks,discard 选项:

  • luks:指定为 LUKS 格式
  • discard:允许 TRIM 给底层 SSD(提性能 + 寿命;但泄露空间使用模式)

重启验证。

加多个密码 / 撤销密码

LUKS 支持最多 8 个 keyslot:

# 加新密码
sudo cryptsetup luksAddKey /dev/sdb
# 输旧密码 + 新密码

# 删某个 keyslot(0 是第一个)
sudo cryptsetup luksKillSlot /dev/sdb 0

# 看 keyslot 状态
sudo cryptsetup luksDump /dev/sdb

主密码忘记了用备用密码登录,进去 KillSlot 删主密码再 AddKey 新的。

用 keyfile 而不是密码

# 生成 4K 随机 keyfile
sudo dd if=/dev/urandom of=/root/luks.key bs=1024 count=4
sudo chmod 400 /root/luks.key

# 加到 LUKS
sudo cryptsetup luksAddKey /dev/sdb /root/luks.key

# crypttab 改用 keyfile
# data UUID=... /root/luks.key luks

适用:服务器机器没人输密码;keyfile 存 USB / TPM。

YubiKey / FIDO2 解锁

sudo apt install -y libpam-u2f systemd-cryptsetup

# 注册 YubiKey 到 LUKS
sudo systemd-cryptenroll --fido2-device=auto /dev/sdb

# /etc/crypttab 加上
# data UUID=... none fido2-device=auto,luks

启动时插 YubiKey 触摸金属片就解锁。比记复杂密码方便。

TPM 解锁(笔记本无人值守)

sudo systemd-cryptenroll --tpm2-device=auto /dev/sdb
# crypttab 加 tpm2-device=auto

TPM 解锁的安全性:

  • ✅ 抗"拔盘到另一机器"攻击:TPM 绑定主板
  • ❌ 抗"原机被偷":开机就自动解锁,攻击者通电就能用

要双保险加 PIN:

sudo systemd-cryptenroll --tpm2-device=auto --tpm2-with-pin=yes /dev/sdb

备份 header(关键!)

LUKS header 在分区开头几 MB,如果损坏(mkfs 误操作 / 磁盘坏块),
整个加密容器无法解开(数据丢失)。备份:

sudo cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /secure/sdb-luks-header.bin

把这个 bin 存到安全的地方(U 盘 / 加密邮箱)。还原:

sudo cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /secure/sdb-luks-header.bin

加密性能

LUKS2 + AES-XTS 是当前默认。现代 CPU(带 AES-NI)几乎无性能损失:

cryptsetup benchmark
# aes-xts        256b   3000 MiB/s   3000 MiB/s
# ...

3 GB/s 远超 SSD 顺序读写速度,加密不会成瓶颈。

隐藏 / SED

进阶:

  • SED(Self-Encrypting Drive):硬件加密,性能更好,但要信任厂商
    实现(多家被发现有后门)
  • Plausible deniability(VeraCrypt 风格的隐藏卷):LUKS 不原生支持

通常 LUKS 已经够。

踩过的坑

  • 装系统时设置弱密码(如 "1234"):暴力破解几秒搞定。LUKS 用 argon2id
    让暴力很慢,但密码本身弱无济于事。最少 16 位混合字符或用 diceware。
  • 没备份 LUKS header → 一次 mkfs 失手数据全没。养成 luksFormat 后立刻
    备份 header 的习惯。
  • crypttab 写错让启动卡在解锁界面无限循环。从 LiveUSB 进入修复。
  • 加密 swap:如果用 hibernation / suspend-to-disk,需要 swap 加密,
    否则 RAM 数据写到 swap 时明文。/etc/crypttab 配 swap 用随机 key
    每次开机重新生成(不能 hibernate)或用固定 key(可以 hibernate)。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。