笔记本 / 移动机器一旦丢失,硬盘上的数据如果没加密,攻击者拆下盘
插到另一台机器就能读。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/sdb 取 UUID="..."。
/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)。
登录后参与评论。