Skip to Content

磁盘加密

磁盘加密是保护数据安全的重要手段,即使设备丢失或被盗,加密数据也无法被未授权者读取。本文介绍 Ubuntu 26.04 中各种磁盘加密方案。

Caution

加密密码是访问数据的唯一凭证。如果忘记密码且没有备用密钥文件或 LUKS 头备份,加密数据将永久无法恢复。请务必使用密码管理器保存密码,并将 LUKS 头备份存放在安全的外部位置。

LUKS 全盘加密

LUKS(Linux Unified Key Setup)是 Linux 下的标准磁盘加密方案。

安装时启用全盘加密

在安装 Ubuntu 26.04 时启用全盘加密是最简单的方式:

  1. 启动安装程序
  2. 在”安装类型”步骤中选择”高级功能”
  3. 勾选”使用 LVM” 和 “加密安装以提高安全性”
  4. 设置加密密码(请务必牢记)
  5. 完成安装

安装完成后,每次启动都需要输入加密密码才能解锁磁盘。

TPM 支持的全盘加密(TPM-backed FDE)

Ubuntu 26.04 的桌面安装器支持 TPM 支持的全盘加密:加密密钥被封装(seal)到主板的 TPM 2.0 芯片中,并与安全启动(Secure Boot)测量值绑定。启动时如果系统完整性未被篡改,TPM 会自动释放密钥解锁磁盘,无需每次手动输入密码。

安装时启用

  1. 在安装器的”安装类型”步骤选择启用全盘加密
  2. 如检测到可用的 TPM 2.0 且 Secure Boot 已开启,安装器会提供”使用此电脑的 TPM 解锁”选项
  3. 安装器会生成一份恢复密钥(recovery key)——务必离线保存,这是 TPM 无法解锁时的唯一后备
Caution

TPM 封装的密钥与启动测量值绑定。更换主板、清除 TPM、关闭 Secure Boot 或重大固件更新都可能导致 TPM 拒绝解锁,此时必须使用恢复密钥手动解锁,否则数据无法访问。请将恢复密钥保存在与设备分离的安全位置。

Note

26.04.1 起,在固件无法自动验证的硬件上,可以关闭 TPM/FDE 的强制 PIN。官方文档提醒这会降低对固件篡改的防护,请根据威胁模型谨慎选择。

查看与管理 TPM FDE 状态

# 查看 TPM 设备是否存在 ls /dev/tpm* 2>/dev/null sudo systemd-cryptenroll --tpm2-device=list # 查看某个 LUKS 设备已绑定的解锁方式(密码 / TPM / 恢复密钥) sudo systemd-cryptenroll /dev/sda3 # 重新封装/轮换 TPM 绑定(如固件更新后) sudo systemd-cryptenroll --wipe-slot=tpm2 --tpm2-device=auto /dev/sda3

桌面环境下,也可在 Security Center(安全中心) 中查看 FDE 与 TPM 的联动状态、确认恢复密钥是否已备份。

查看加密状态

# 查看 LUKS 设备 sudo dmsetup status # 查看 LUKS 详细信息 sudo cryptsetup luksDump /dev/sda3 # 查看加密卷的状态 sudo cryptsetup status luks-volume-name # 查看块设备和加密关系 lsblk -f

加密外接存储设备

使用 LUKS 加密 USB 硬盘

# 确认设备名称(非常重要,避免加密错误的设备) lsblk # 加密分区(会清除所有数据!) sudo cryptsetup luksFormat /dev/sdb1 # 确认提示输入 YES(大写),然后设置密码 # 打开加密分区 sudo cryptsetup luksOpen /dev/sdb1 encrypted_usb # 格式化 sudo mkfs.ext4 /dev/mapper/encrypted_usb # 挂载 sudo mkdir -p /mnt/encrypted sudo mount /dev/mapper/encrypted_usb /mnt/encrypted # 使用完毕后卸载 sudo umount /mnt/encrypted sudo cryptsetup luksClose encrypted_usb

日常使用加密 USB 设备

在 GNOME 桌面环境中,插入加密 USB 设备后会自动弹出密码输入框。命令行操作:

# 打开加密设备 sudo cryptsetup luksOpen /dev/sdb1 encrypted_usb # 挂载 sudo mount /dev/mapper/encrypted_usb /mnt/encrypted # ... 使用 ... # 卸载并关闭 sudo umount /mnt/encrypted sudo cryptsetup luksClose encrypted_usb

LUKS 密钥管理

添加密钥

Ubuntu 26.04 默认使用 LUKS2,最多支持 32 个密钥槽位(LUKS1 仅 8 个,0-7):

# 添加新密码 sudo cryptsetup luksAddKey /dev/sda3 # 需要先输入现有密码,然后输入新密码 # 添加密钥文件 sudo dd if=/dev/urandom of=/root/luks-keyfile bs=4096 count=1 sudo chmod 600 /root/luks-keyfile sudo cryptsetup luksAddKey /dev/sda3 /root/luks-keyfile

删除密钥

# 删除特定密钥槽 sudo cryptsetup luksKillSlot /dev/sda3 1 # 删除特定密码(输入要删除的密码) sudo cryptsetup luksRemoveKey /dev/sda3

查看密钥槽状态

sudo cryptsetup luksDump /dev/sda3 | grep "Key Slot" # 输出示例: # Key Slot 0: ENABLED # Key Slot 1: ENABLED # Key Slot 2: DISABLED # ...

修改密码

# 修改现有密码 sudo cryptsetup luksChangeKey /dev/sda3 # 先输入旧密码,再输入新密码

使用密钥文件自动解锁

为数据分区配置自动解锁

如果系统盘已加密,可以使用密钥文件让数据分区随系统盘解锁后自动解锁:

# 生成密钥文件 sudo dd if=/dev/urandom of=/root/.luks-data-key bs=4096 count=1 sudo chmod 400 /root/.luks-data-key # 将密钥文件添加到 LUKS 设备 sudo cryptsetup luksAddKey /dev/sdb1 /root/.luks-data-key # 获取 UUID sudo blkid /dev/sdb1 # 配置 /etc/crypttab sudo nano /etc/crypttab

在 /etc/crypttab 中添加:

# <名称> <设备> <密钥文件> <选项> data_encrypted UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /root/.luks-data-key luks

在 /etc/fstab 中添加挂载配置:

/dev/mapper/data_encrypted /mnt/data ext4 defaults 0 2
# 测试配置 sudo cryptdisks_start data_encrypted sudo mount /mnt/data

加密主目录

使用 fscrypt 加密主目录

Ubuntu 26.04 推荐使用 fscrypt 进行目录级加密:

# 安装 fscrypt sudo apt install fscrypt libpam-fscrypt # 初始化 fscrypt(在文件系统上) sudo fscrypt setup sudo fscrypt setup /home # 加密新用户主目录 sudo fscrypt encrypt /home/newuser --user=newuser

为现有目录启用加密

# 创建加密目录 mkdir ~/Private fscrypt encrypt ~/Private # 选择保护方式(密码、PAM 登录等) # 推荐选择 PAM 登录保护,登录时自动解锁 # 锁定目录 fscrypt lock ~/Private # 解锁目录 fscrypt unlock ~/Private # 查看加密状态 fscrypt status ~/Private

加密 Swap

使用随机密钥加密 swap

# 编辑 /etc/crypttab sudo nano /etc/crypttab

添加:

cryptswap /dev/sdXN /dev/urandom swap,cipher=aes-xts-plain64,size=256

更新 /etc/fstab:

/dev/mapper/cryptswap none swap sw 0 0

使用 swap 文件(LUKS 加密磁盘上)

如果系统已使用 LUKS 全盘加密,swap 文件已经被加密保护:

# 创建 swap 文件 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 持久化 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

LUKS 性能优化

检查加密性能

# 查看当前加密算法 sudo cryptsetup luksDump /dev/sda3 | grep "Cipher" # 基准测试加密性能 sudo cryptsetup benchmark # 输出示例: # PBKDF2-sha1 1200000 iterations per second # PBKDF2-sha256 800000 iterations per second # Algorithm | Key | Encryption | Decryption # aes-cbc 128b 1200.0 MiB/s 3500.0 MiB/s # aes-cbc 256b 900.0 MiB/s 2800.0 MiB/s # aes-xts 256b 2500.0 MiB/s 2600.0 MiB/s # aes-xts 512b 2100.0 MiB/s 2200.0 MiB/s

优化选项

# 使用 AES-NI 硬件加速(大多数现代 CPU 都支持) grep aes /proc/cpuinfo # 创建加密分区时指定高性能参数 sudo cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha256 /dev/sdb1

备份加密头

LUKS 头信息损坏会导致数据完全丢失,务必备份:

# 备份 LUKS 头 sudo cryptsetup luksHeaderBackup /dev/sda3 --header-backup-file /safe/location/luks-header-backup # 恢复 LUKS 头(数据恢复时使用) sudo cryptsetup luksHeaderRestore /dev/sda3 --header-backup-file /safe/location/luks-header-backup

将 LUKS 头备份存放在安全的外部位置(如保险箱中的 USB 设备)。

紧急数据擦除

如果需要紧急销毁加密数据:

# 擦除 LUKS 头(数据将永久不可恢复!) sudo cryptsetup luksErase /dev/sda3 # 或覆盖 LUKS 头区域 sudo dd if=/dev/urandom of=/dev/sda3 bs=1M count=2

这只需要几秒钟,因为只需销毁加密密钥,无需擦除全部数据。

故障排除

忘记密码

如果忘记了 LUKS 密码且没有备用密钥文件,数据将无法恢复。预防措施:

  • 使用密码管理器保存加密密码
  • 设置多个密钥槽作为备用
  • 备份 LUKS 头信息

启动时无法解锁

# 从 Live USB 启动 # 打开加密分区 sudo cryptsetup luksOpen /dev/sda3 recovery # 挂载 sudo mount /dev/mapper/recovery /mnt # 检查和修复 sudo fsck /dev/mapper/recovery # 完成后 sudo umount /mnt sudo cryptsetup luksClose recovery
Last updated on