使用LUKS加密磁盘

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,后者负责实际的加解密操作。

工作流程梳理

  1. 初始化

    使用cryptsetup luksFormat /dev/sdaX,工具会:

    • 写入 LUKS 头部,保存密钥相关元数据
    • 随机生成主密钥,使用密码加密主密钥,填入密钥槽
  2. 解锁流程

    使用cryptsetup luksOpen /dev/sdaX myvolume,输入密码:

    • cryptsetup 读取头部,用密码解密出主密钥
    • 将主密钥传递给 dm-crypt,并创建 /dev/mapper/myvolume 设备
  3. 数据读写

    • /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 参数再来一次)。直到某一槽校验通过或所有槽都失败。

因此这里的加解密均为对称加密算法。

updatedupdated2025-09-232025-09-23