cryptsetup LUKS dm-crypt 是linux 上常见的磁盘加密方法。其中cryptsetup 是一个用户态工具,LUKS 是一种用于为块设备加密提供统一格式的加密元数据规范。dm-crypt 是进行块设备加解密读写的模块,dm-crypt 对于读写本身是透明的。
示例步骤(AI)
只要 LUKS 设备处于解锁状态,宿主机可以直接访问 /dev/mapper/my_encrypted_disk
,操作方式与普通分区基本一致。加密/解密过程对使用设备的进程来说是“透明的”。
用 LUKS 格式化磁盘
sudo cryptsetup luksFormat /dev/sda
系统会提示你输入一个密码,这个密码用于解锁磁盘。
打开加密分区
sudo cryptsetup luksOpen /dev/sda my_encrypted_disk
这将会在 /dev/mapper/
下创建一个名为 my_encrypted_disk
的解密设备节点。
对解密后的设备进行分区与格式化(例如格式化为 ext4)
sudo mkfs.ext4 /dev/mapper/my_encrypted_disk
挂载加密磁盘
sudo mkdir /mnt/secure
sudo mount /dev/mapper/my_encrypted_disk /mnt/secure
卸载与关闭加密分区
卸载:
sudo umount /mnt/secure
关闭 LUKS 设备:
sudo cryptsetup luksClose my_encrypted_disk
技术流程
LUKS 是规范(标准)
- LUKS(Linux Unified Key Setup) 是设计用于为块设备加密提供统一格式的加密元数据规范。
- LUKS 规定了设备头部(header)的结构:包括版本、加密算法、加盐、多个密钥槽、主密钥的加密副本等。
- 这保证了不同工具/发行版之间的兼容性。
cryptsetup 是工具
- cryptsetup 是用户空间的命令行工具,负责
- 初始化加密设备(生成 LUKS 头部,随机主密钥,设置密码等)
- 解锁加密设备(输入密码,解密主密钥)
- 管理密钥槽(添加、删除、更新密码)
- cryptsetup 主要完成:
- 把你的分区/块设备"加工"成一个带 LUKS 头部的加密卷
- 负责用密码解密出主密钥,并临时传递给内核的 dm-crypt
dm-crypt 是内核模块(核心加解密引擎)
- dm-crypt 是 Linux 内核中的块设备加密模块。
- dm-crypt 不关心 LUKS 格式,它只负责用你给它的密钥对块设备的数据块进行加解密。
- cryptsetup 将从 LUKS 头部解密出来的主密钥,传递给 dm-crypt,后者负责实际的加解密操作。
工作流程梳理
-
初始化
使用
cryptsetup luksFormat /dev/sdaX
,工具会:- 写入 LUKS 头部,保存密钥相关元数据
- 随机生成主密钥,使用密码加密主密钥,填入密钥槽
-
解锁流程
使用
cryptsetup luksOpen /dev/sdaX myvolume
,输入密码:- cryptsetup 读取头部,用密码解密出主密钥
- 将主密钥传递给 dm-crypt,并创建
/dev/mapper/myvolume
设备
-
数据读写
- 对
/dev/mapper/myvolume
的读写请求,dm-crypt 用主密钥实时加解密,实际存储在物理设备的数据都是密文 - LUKS 头部只在解锁时用,平时不参与数据流
- 对
技术优势
数据安全(防止物理窃取/丢失泄露)
- 核心意义:保护数据隐私和机密性。
- 即使整块硬盘/SSD/移动硬盘被偷走、丢失或拆下来,没有正确的解密密码,别人无法读取盘里的数据。
- 适用于笔记本、服务器、存储介质等任何有被物理获取风险的场景。
防止非法访问
- 即便有人获得了超级用户(root)权限,只要系统未解锁加密盘,无法直接读取加密数据。
- 适合服务器托管、云主机等场景,能限制管理员、外部人员等越权访问敏感数据。
保护数据下线(报废/转让/销毁)
- 硬盘报废、转让、返修时,只需销毁加密密钥或LUKS头部,数据就不可恢复,而无需将整个盘物理粉碎。
- 这在企业、政府等对数据销毁有合规要求的环境非常重要。
透明性和易用性
- 对用户和应用来说,加密/解密是“透明”的,不影响日常操作。
- 不需要逐文件/逐目录加密,全盘/分区加密一次到位。
支持多用户和密钥管理
- LUKS 支持多个密钥槽,便于权限移交、多人共享安全访问、密码更换等实际需求。
LUKS 如何实现多访问密码
LUKS 中规定主密钥(Master Key)主密钥永远不会以明文形式暴露给用户或保存在磁盘上,只在解锁卷时,短暂地以明文形式存在于内存(RAM)中,由内核的 dm-crypt 模块使用。而在加密卷的起始部分得LUKS 头部 存储了多个密钥槽,每个槽对应一个访问密码。
密钥槽中得密钥是用户密钥 通过KDF 生成得强密钥。KDF(密钥派生函数)是一种加密学算法,它的主要作用是将一个用户输入的弱秘密(比如密码、PIN码)转换为一个强密钥,用于加密、签名等场景。KDF 能抵抗暴力破解和字典攻击。
生成密码
生成密码时,可使用sudo cryptsetup luksAddKey /dev/sda1
命令,这个命令会:
通过KDF 生成一个高强度密钥密钥,
DerivedKey = KDF(password="XXX", salt=SaltX, iterations=XXX)
然后用它加密主密钥,写入密钥槽。
MasterKey = Decrypt(Encrypted_MasterKey, DerivedKey)
输入密码
输入密码后,对每个启用的密钥槽,cryptsetup 会做如下操作:
根据该槽的salt 和其他参数,根据KDF 算法生成DerivedKey,然后通过DerivedKey 解密密钥槽中存放的Encrypted_MasterKey。解密后会有一个校验,如果主密钥解密出来校验成功,说明密码正确。解密成功后,主密钥(Master Key)被加载到内存。这个主密钥就是后续 dm-crypt 用来实时加解密整个数据区的真正密钥。
如果解密失败(校验失败),cryptsetup 会用同样的流程尝试下一个密钥槽(即用不同的 salt/KDF 参数再来一次)。直到某一槽校验通过或所有槽都失败。
因此这里的加解密均为对称加密算法。