磁盘加密
磁盘加密是保护数据安全的重要手段,即使设备丢失或被盗,加密数据也无法被未授权者读取。本文介绍 Ubuntu 26.04 中各种磁盘加密方案。
加密密码是访问数据的唯一凭证。如果忘记密码且没有备用密钥文件或 LUKS 头备份,加密数据将永久无法恢复。请务必使用密码管理器保存密码,并将 LUKS 头备份存放在安全的外部位置。
LUKS 全盘加密
LUKS(Linux Unified Key Setup)是 Linux 下的标准磁盘加密方案。
安装时启用全盘加密
在安装 Ubuntu 26.04 时启用全盘加密是最简单的方式:
- 启动安装程序
- 在”安装类型”步骤中选择”高级功能”
- 勾选”使用 LVM” 和 “加密安装以提高安全性”
- 设置加密密码(请务必牢记)
- 完成安装
安装完成后,每次启动都需要输入加密密码才能解锁磁盘。
TPM 支持的全盘加密(TPM-backed FDE)
Ubuntu 26.04 的桌面安装器支持 TPM 支持的全盘加密:加密密钥被封装(seal)到主板的 TPM 2.0 芯片中,并与安全启动(Secure Boot)测量值绑定。启动时如果系统完整性未被篡改,TPM 会自动释放密钥解锁磁盘,无需每次手动输入密码。
安装时启用
- 在安装器的”安装类型”步骤选择启用全盘加密
- 如检测到可用的 TPM 2.0 且 Secure Boot 已开启,安装器会提供”使用此电脑的 TPM 解锁”选项
- 安装器会生成一份恢复密钥(recovery key)——务必离线保存,这是 TPM 无法解锁时的唯一后备
TPM 封装的密钥与启动测量值绑定。更换主板、清除 TPM、关闭 Secure Boot 或重大固件更新都可能导致 TPM 拒绝解锁,此时必须使用恢复密钥手动解锁,否则数据无法访问。请将恢复密钥保存在与设备分离的安全位置。
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_usbLUKS 密钥管理
添加密钥
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/fstabLUKS 性能优化
检查加密性能
# 查看当前加密算法
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