LUKS 磁盘加密实战:Linux 全盘加密配置指南

适用场景

LUKS(Linux Unified Key Setup)磁盘加密适用于以下场景:一是**物理服务器与机房托管**,服务器被物理窃取或硬盘被拔出时,加密盘无法被读取;二是**云主机数据盘**,对存放数据库、备份、日志等敏感数据的分区加密;三是**合规要求**,等保、GDPR 等监管要求对静态数据加密存储。LUKS 加密的是整个块设备,对上层文件系统完全透明,应用无需改造。

前置条件

  • Linux 发行版(本文以 Debian/Ubuntu 为例,CentOS 命令基本一致)
  • root 权限或 sudo 权限
  • 待加密的独立磁盘或分区(建议整块新磁盘,如 /dev/sdb)
  • 已备份重要数据:加密过程会清空目标设备数据

原理说明

LUKS 是基于 dm-crypt 内核模块的磁盘加密规范,采用**密钥槽(Key Slot)**机制:设备头部保存 8 个密钥槽,每个槽位可存一份密钥,任一槽位密码正确即可解锁设备。加密密钥由密码通过 PBKDF2 派生,设备级加密使用 AES-256-XTS 等算法。相比直接使用 dm-crypt,LUKS 提供标准头部格式,可跨工具兼容,支持多密码、密码修改与密钥备份,是生产环境的首选方案。

操作步骤

第一步:安装 cryptsetup

# Debian/Ubuntu
sudo apt update && sudo apt install -y cryptsetup

# CentOS/RHEL
sudo yum install -y cryptsetup

# 确认版本
cryptsetup --version

第二步:对磁盘执行 LUKS 格式化

# 以 /dev/sdb 为例,执行 LUKS 格式化(会清空磁盘,务必确认盘符)
sudo cryptsetup luksFormat /dev/sdb

# 使用指定加密算法与密钥大小(推荐 AES-256-XTS)
sudo cryptsetup luksFormat /dev/sdb --cipher aes-xts-plain64 --key-size 256

执行后按提示输入两次大写 YES 确认,再设置解锁密码。密码强度直接影响安全性,建议 16 位以上混合字符。若输错盘符导致数据丢失,无法恢复。

第三步:解锁并创建文件系统

# 解锁加密设备,映射为 /dev/mapper/sdb_crypt
sudo cryptsetup luksOpen /dev/sdb sdb_crypt

# 查看映射设备
ls -l /dev/mapper/sdb_crypt

# 创建 ext4 文件系统
sudo mkfs.ext4 /dev/mapper/sdb_crypt

luksOpen 需要输入解锁密码,成功后会在 /dev/mapper/ 下生成映射设备名 sdb_crypt。之后对该映射设备的读写都是透明加解密。

第四步:挂载与验证

# 创建挂载点并挂载
sudo mkdir -p /mnt/encrypted
sudo mount /dev/mapper/sdb_crypt /mnt/encrypted

# 验证挂载
df -h | grep encrypted

# 测试读写
sudo dd if=/dev/urandom of=/mnt/encrypted/test.bin bs=1M count=100
sudo sha256sum /mnt/encrypted/test.bin

第五步:开机自动解锁配置

生产环境常需要开机自动挂载。创建密钥文件并加入密钥槽:

# 生成密钥文件(权限必须为 0400)
sudo dd if=/dev/urandom of=/etc/luks-keys/sdb.key bs=512 count=8
sudo chmod 0400 /etc/luks-keys/sdb.key

# 将密钥文件加入 LUKS 密钥槽
sudo cryptsetup luksAddKey /dev/sdb /etc/luks-keys/sdb.key

配置自动解锁与挂载,编辑 /etc/crypttab:

# /etc/crypttab 内容
sdb_crypt /dev/sdb /etc/luks-keys/sdb.key luks

编辑 /etc/fstab 添加挂载项:

# /etc/fstab 内容(注意是映射设备,不是 /dev/sdb)
/dev/mapper/sdb_crypt /mnt/encrypted ext4 defaults 0 2

然后更新 initramfs 使其生效:

sudo update-initramfs -u

注意:密钥文件与磁盘同机存放时,防护强度取决于服务器本体安全。高安全场景应将密钥文件置于 TPM 或远端密钥管理系统。

第六步:备份 LUKS 头部

LUKS 头部损坏会导致数据永久无法解锁,必须备份:

# 备份头部(头部仅几 MB)
sudo cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /backup/sdb-luks-header.bin

# 恢复头部
sudo cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /backup/sdb-luks-header.bin

配置验证

完整验证加密是否生效:

  1. cryptsetup luksDump /dev/sdb 查看密钥槽状态与加密算法,确认 PBKDF2AES-XTS 配置正确
  2. 重启后确认 /mnt/encrypted 自动挂载,mount | grep encrypted 能看到 /dev/mapper/sdb_crypt
  3. cryptsetup luksClose sdb_crypt 测试安全卸载,确认在锁定时 /dev/mapper/sdb_crypt 消失

常见问题

Q1:忘记 LUKS 解锁密码怎么办?

若其他密钥槽中还有有效密码或密钥文件,可用 luksOpen 解锁后通过 luksChangeKey 重置槽位。若所有槽位密码均丢失,数据无法恢复。这也是必须备份 LUKS 头部、并为重要数据保留第二把密钥的原因。建议将管理员密钥文件离线保存。

Q2:加密后磁盘性能下降多少?

现代 CPU 都支持 AES-NI 硬件加速,AES-256-XTS 模式下性能损耗通常低于 5%,对普通业务几乎无感。若服务器 CPU 较老不支持 AES-NI,可考虑使用 aes-xts-plain64 外的轻量算法,但安全性会降低,不推荐。

Q3:加密盘可以迁移到另一台服务器吗?

可以。LUKS 设备与硬件无关,新服务器安装 cryptsetup 后,用 luksOpen 解锁并挂载即可读取。迁移时需同步导入密钥槽(或重新 luksAddKey),并确保内核支持对应加密算法。若迁移后 initramfs 未更新导致无法自动解锁,重新执行 update-initramfs -u 即可。

总结

LUKS 磁盘加密为 Linux 服务器提供了标准化的静态数据加密方案,核心流程为格式化、解锁、建文件系统、挂载、自动解锁、备份头部六步。生产部署时牢记三个要点:加密前备份数据、密码与密钥文件分开存放、LUKS 头部定期离线备份。磁盘加密不能替代访问控制,应与其他安全措施(防火墙、文件权限、日志审计)组合使用,构建纵深防御。