LUKS入门介绍
2012-06-02 10:44:35 阿炯

Linux统一密钥设置(英语:Linux Unified Key Setup,缩写:LUKS)是由Clemens Fruhwirth在2004年为Linux开发的磁盘加密规范。其实现了可用于各种工具上的跨平台标准磁盘加密格式,促进了不同工具之间的兼容性和互操作性,确保它们都以安全和统一的方式实施密码管理。是 Linux 用户中流行的磁盘加密机制。


计算机安全旨在保护私密信息,业界有许多方法可以保护系统。一些用户使用简单的用户名/密码登录方案进行基本保护。其他用户可能会通过加密以不同的方式增加额外的保护,如使用 VPN 和磁盘加密。如果计算机上有敏感的客户数据或被视为知识产权的材料,或者对隐私非常谨慎,就可能要考虑本地磁盘和传输链路加密。

磁盘加密的一些好处包括:
防止数据泄露
保护系统免受黑客的攻击
保护你免受潜在的责任问题

磁盘加密软件可以防止台式机硬盘驱动器、便携式USB 存储设备或笔记本电脑被访问,除非用户输入正确的身份验证数据。如果笔记本电脑丢失或被盗,加密会保护磁盘上的数据。如今新的 Windows 系统默认配备了 BitLocker 加密。Linux下的 LUKS 是最常用的磁盘加密方式。

LUKS的用途是加密设备文件系统。被加密的内容无需是某种格式,因此任何文件系统都可以被加密,甚至包括虚拟内存分区。在每个已加密的磁盘的头部,均有未加密的部分用以承载加密密钥以及诸如加密类型和密钥大小等加密参数。磁盘头部承载的加密密钥是LUKS和plain dm-crypt的主要分别。LUKS允许使用多个不同的密码解密同一个磁盘,也可以随时轻易的修改或移除之;但是如果磁盘头部被损坏,则不可能撤销被加密的资料。

加密的过程使用了多层加密:首先资料被主密钥加密,然后主密钥被复制多份,分别被不同的用户密钥加密,最后被加密的主密钥均被存储到磁盘中。通常用户密钥是密码词组,但其他加密方式例如OpenPGP公开密钥或者X.509数字证书也可使用。PGP公开密钥可以与被连接到主机的OpenPGP智能卡合并使用。这种分层加密方法被称为TKS1。

LUKS有两个版本:LUKS1以及LUKS2。LUKS1默认使用PBKDF2加密,而LUKS2默认使用Argon2;LUKS2也具备对磁盘头部损坏的弹性。在两个LUKS版本之间切换或许可能,但某些功能(例如Argon2)未必能在LUKS1上使用。LUKS2使用JSON作为其元数据单元格式。

可用的加密算法取决于内核的支持。Libgcrypt支持所有LUKS支持的加密算法,可以作为散列的后端,默认加密算法由操作系统决定。LUKS1使用一种名为AFsplitter的反电脑鉴证技术,以保护文件以及确保文件能够被彻底抹除。

技术术语

在继续之前需要定义一些术语。LUKS 有很多内容,因此将其拆解为细项将有助于进一步了解。

卷(Volume):卷是一个逻辑存储区域,可用于存储数据。在磁盘加密的场景中卷指的是已加密以保护其内容的磁盘部分。

参数(Parameters):参数是控制加密算法运行方式的设置。参数可能包括所使用的加密算法、密钥大小以及有关如何执行加密的其他详细信息。

加密类型(Cipher type):它是指用于加密的数学算法。它指的是用于保护加密卷上数据的具体加密算法。

密钥大小Key size:密钥大小是衡量加密算法强度的指标:密钥大小越大,加密强度越高。通常以位数表示,例如 128 位加密或 256 位加密。

头部(Header):头部是加密卷开头的特殊区域,包含有关加密的信息,例如所使用的加密算法和加密密钥。

下一个定义对于新手来说可能有些棘手,但了解它还是很重要的,尤其在处理 LUKS 时会非常有用。

容器(Container):容器是一个特殊的文件,类似于虚拟加密卷。它可以用于存储加密数据,就像加密分区一样。不同之处在于容器是一个文件,可以存储在未加密的分区上,而加密分区是整个磁盘的一部分,已经完全加密。因此容器是充当虚拟加密卷的文件。


在LVM上使用LUKS

逻辑卷管理(LVM)可以与LUKS并用。

LUKS加密的LVM:类似直接分割一个LUKS加密卷,LUKS可以直接加密整个LVM物理卷,允许之中的所有逻辑卷被单一密钥加密。LVM物理卷的架构在解密之前不可见。其加密的LVM逻辑卷:如果LUKS被用于加密单一LVM逻辑卷,其可以分布于多个物理卷上。LVM物理卷的架构在解密之前已经可见。

对整个磁盘加密

LUKS常用于对整个磁盘加密,包括加密操作系统的根目录,以保护所有资料免被具有物理访问权限的攻击者或未获授权的第三方访问或修改。在Linux系统上为防止第三方篡改Linux内核,引导分区可以在引导程序支持LUKS的前提下同样被加密。但第一阶段引导程序以及EFI系统分区无法被如此加密。

加密家目录

在运行systemd的系统上,systemd-homed可以用以加密个别家目录。


LUKS最初用于 Linux,是一种知名的、安全的、高性能的磁盘加密方法,LUKS 也是网络附加存储(NAS)设备中常用的加密格式。它还可以用于创建和运行加密容器,加密容器具有与 LUKS 全盘加密相同的保护级别。另外它还提供多种加密算法、多种加密模式和多种哈希函数,有 40 多种可能的组合。


LUKS 结构示意图

任何文件系统都可以进行加密,包括交换分区。加密卷的开头有一个未加密的头部,它允许存储多达 8 个(LUKS1)或 32 个(LUKS2)加密密钥,以及诸如密码类型和密钥大小之类的加密参数。

这个头部的存在是 LUKS 和 dm-crypt 的一个重要区别,因为头部允许使用多个不同的密钥短语,并能轻松更改和删除它们。然而需要注意的是,如果头部丢失或损坏,设备将无法解密。

上文已知LUKS有两个版本,LUKS2 具有更强的头部损坏抗击性。在某些情况下,可以在两个版本之间进行转换,但是 LUKS1 可能不支持某些功能。LUKS磁盘头是向前兼容的,新版可以读取旧版的磁盘头。LUKS2设备以二进制标头开头,旨在让blkid更容易进行识别。LUKS2磁盘头的所有字符串资料均是以null标记完结的字符串。JSON资料区紧接在二进制标头后,当中存储了LUKS的设置、密钥以及加密细节。LUKS2密钥槽的二进制格式与LUKS1大致相似,但允许个别密钥槽的算法(例如不同的PBKDF)。LUKS2包含另一种密钥以在在重新加密过程中断的情况下允许冗余。


操作系统支持
LUKS的参考实现是在Linux上运行的修改版cryptsetup,并使用dm-crypt作为加密后端。在Windows下,LUKS加密的磁盘以前可以通过LibreCrypt访问,但已因安全漏洞而弃用;现在则可以通过适用于Linux的Windows子系统使用。DragonFly BSD支持LUKS。

安装程序支持
部分Linux发行版的安装程序可以在安装时对整个磁盘加密,包括Calamares,Ubiquity以及Debian安装程序。


这里使用LUKS的参考实现cryptsetup来示范操作。

加密设备/dev/sda1:
# cryptsetup luksFormat /dev/sda1

解密已被LUKS加密的同一磁盘,而name是映射的设备名称:
# cryptsetup luksOpen /dev/sda1 name

重新加密

对LUKS容器的重新加密可以使用cryptsetup或者旧工具cryptsetup-reencrypt实现。这些工具也可以用来加密先前未加密的磁盘,或永久解密已加密的磁盘。两个方法所适用的命令语法相近:
# # 使用 cryptsetup
# cryptsetup reencrypt /dev/sda1

# # 使用 cryptsetup-reencrypt
# cryptsetup-reencrypt /dev/sda1


优点:
LUKS加密整个块设备,因此非常适合保护移动设备的内容,如可移动存储介质(usb笔)或笔记本电脑磁盘驱动器。
还可以与nas服务器一起使用来保护备份。
带有AES-NI(高级加密标准指令集)的Intel和AMD CPU可以加速Linux内核v2.6.32+的基于dm密码的加密。这将加快硬盘加密。
也适用于交换分区,这样笔记本电脑就可以使用休眠功能(挂起到磁盘),在关闭机器之前将RAM的内容写入交换分区。

缺点:
LUKS最多只支持8个密码,即只有8个用户可以对同一设备拥有不同的访问密钥。
对于需要文件级加密的应用程序,不建议使用LUKS。