适用场景
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
配置验证
完整验证加密是否生效:
cryptsetup luksDump /dev/sdb查看密钥槽状态与加密算法,确认PBKDF2与AES-XTS配置正确- 重启后确认
/mnt/encrypted自动挂载,mount | grep encrypted能看到/dev/mapper/sdb_crypt - 用
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 头部定期离线备份。磁盘加密不能替代访问控制,应与其他安全措施(防火墙、文件权限、日志审计)组合使用,构建纵深防御。