Linux统一密钥设置
Linux统一密钥设置(英语:Linux Unified Key Setup,缩写:LUKS)是由Clemens Fruhwirth在2004年为Linux开发的磁盘加密规范。LUKS实现了可用于各种工具上的跨平台标准磁盘加密格式,促进了不同工具之间的兼容性和互操作性,确保它们都以安全和统一的方式实施密码管理。[2]
原作者 | Clemens Fruhwirth |
---|---|
当前版本 | 2.3.4[1](2020年9月3日,4年前) |
编程语言 | C语言 |
操作系统 | 见#操作系统支持 |
类型 | 磁盘加密 |
许可协议 | GNU宽通用公共许可证第2.1版 |
网站 | gitlab |
简介
编辑LUKS的用途是加密设备文件系统。被加密的内容无需是某种格式,因此任何文件系统都可以被加密,甚至包括虚拟内存分区。[3]在每个已加密的磁盘的头部,均有未加密的部分用以承载加密密钥[注 1]以及诸如加密类型和密钥大小等加密参数。[4][5]
磁盘头部承载的加密密钥是LUKS和plain dm-crypt的主要分别。LUKS允许使用多个不同的密码解密同一个磁盘,也可以随时轻易的修改或移除之。但是如果磁盘头部被损坏,则不可能撤销被加密的资料。[6]
加密的过程使用了多层加密:首先,资料被主密钥加密,然后主密钥被复制多份,分别被不同的用户密钥加密,最后被加密的主密钥均被存储到磁盘中。[7]通常,用户密钥是密码词组,但其他加密方式例如OpenPGP公开密钥或者X.509数字证书也可使用。PGP公开密钥可以与被连接到主机的OpenPGP智能卡合并使用。[8][9]这种分层加密方法被称为TKS1。[10][11]
LUKS有两个版本:LUKS1以及LUKS2。LUKS1默认使用PBKDF2加密,而LUKS2默认使用Argon2;LUKS2也具备对磁盘头部损坏的弹性。[12]在两个LUKS版本之间切换或许可能,但某些功能(例如Argon2)未必能在LUKS1上使用。[4]LUKS2使用JSON作为其元数据单元格式。[4][13]
可用的加密算法取决于内核的支持。Libgcrypt支持所有LUKS支持的加密算法,可以作为散列的后端。[14]默认加密算法由操作系统决定。[15]LUKS1使用一种名为AFsplitter的反电脑鉴证技术,以保护文件以及确保文件能够被彻底抹除。
在LVM上使用LUKS
编辑- LUKS加密的LVM
- 类似直接分割一个LUKS加密卷,LUKS可以直接加密整个LVM物理卷,允许之中的所有逻辑卷被单一密钥加密。LVM物理卷的架构在解密之前不可见。[17]
- LUKS加密的LVM逻辑卷
- 如果LUKS被用于加密单一LVM逻辑卷,其可以分布于多个物理卷上。LVM物理卷的架构在解密之前已经可见。[18]
对整个磁盘加密
编辑LUKS常用于对整个磁盘加密,包括加密操作系统的根目录,以保护所有资料免被具有物理访问权限的攻击者或未获授权的第三方访问或修改。[16]
在Linux系统上,为防止第三方篡改Linux内核,引导分区可以在引导程序支持LUKS的前提下同样被加密。[注 2]但是,第一阶段引导程序以及EFI系统分区无法被如此加密。[16]
加密家目录
编辑操作系统支持
编辑LUKS的参考实现是在Linux上运行的修改版cryptsetup
,并使用dm-crypt
作为加密后端。在Microsoft Windows,LUKS加密的磁盘以前可以通过LibreCrypt访问,[21]但已因安全漏洞而弃用;[22][23]现在则可以通过适用于Linux的Windows子系统使用。[24]DragonFly BSD支持LUKS。[25]
安装程序支持
编辑部分Linux发行版的安装程序可以在安装时对整个磁盘加密,包括Calamares[26],Ubiquity[27]以及Debian安装程序[28]。
磁盘格式
编辑LUKS磁盘头是向前兼容的,新版的LUKS可以读取旧版LUKS的磁盘头。
LUKS2
编辑LUKS2设备以二进制标头开头,旨在让blkid更容易进行识别。LUKS2磁盘头的所有字符串资料均是以null标记完结的字符串。JSON资料区紧接在二进制标头后,当中存储了LUKS的设置、密钥以及加密细节。LUKS2密钥槽的二进制格式与LUKS1大致相似,但允许个别密钥槽的算法(例如不同的PBKDF)。LUKS2包含另一种密钥以在在重新加密过程中断的情况下允许冗余。[13]
使用示例
编辑本章节使用LUKS的参考实现cryptsetup
来示范操作。
加密设备/dev/sda1
:
# cryptsetup luksFormat /dev/sda1
解密已被LUKS加密的同一磁盘,而name
是映射的设备名称:
# cryptsetup luksOpen /dev/sda1 name
重新加密
编辑对LUKS容器的重新加密可以使用cryptsetup
或者旧工具cryptsetup-reencrypt
实现。这些工具也可以用来加密先前未加密的磁盘,或永久解密已加密的磁盘。[14][29]两个方法所适用的命令语法相近:
# # 使用 cryptsetup
# cryptsetup reencrypt /dev/sda1
# # 使用 cryptsetup-reencrypt
# cryptsetup-reencrypt /dev/sda1
参见
编辑备注
编辑参考来源
编辑- ^ https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/v2.3/v2.3.4-ReleaseNotes.
- ^ Fruhwirth, Clemens. LUKS On-Disk Format Specification Version 1.2.3 (PDF). 2018-01-20 [2021-09-23]. (原始内容存档 (PDF)于2023-04-12).
- ^ Encrypting drives using LUKS. Fedora Docs. [6 May 2022]. (原始内容存档于2023-06-10).
- ^ 4.0 4.1 4.2 Chapter 12. Encrypting block devices using LUKS. Red Hat Customer Portal. [2023-04-12]. (原始内容存档于2023-04-17).
- ^ How to Encrypt Hard Disk (partition) using LUKS in Linux. 27 February 2019 [2023-04-12]. (原始内容存档于2023-04-12).
- ^ How to Encrypt Your Data with dm-crypt. Linode. [2023-04-12]. (原始内容存档于2023-04-17).
- ^ Bossi, Simone; Visconti, Andrea. What Users Should Know About Full Disk Encryption Based on LUKS (PDF). 2015 [2023-04-12]. (原始内容存档 (PDF)于2021-05-06).
- ^ Full-Disk Encryption With cryptsetup/LUKS. [6 May 2022]. (原始内容存档于2023-05-21).
- ^ How to encrypt a LUKS container using a smart card or token. 20 April 2014 [2023-04-12]. (原始内容存档于2023-05-18).
- ^ TKS1 · Wiki · cryptsetup / cryptsetup · GitLab. GitLab. [2023-04-12]. (原始内容存档于2023-04-12) (英语).
- ^ Fruhwirth, Clemens. TKS1 – An anti-forensic, two level, and iterated key setup scheme (PDF). Draft. 2004-07-15 [2021-09-23]. (原始内容存档 (PDF)于2023-04-12).
- ^ How LUKS works with Full Disk Encryption in Linux. 25 September 2021 [2023-04-12]. (原始内容存档于2023-04-12).
- ^ 13.0 13.1 on-disk-format-luks2.pdf (PDF). [2023-04-12]. (原始内容存档 (PDF)于2023-04-12).
- ^ 14.0 14.1 Linux系统管理员工具(Administration and Privileged Commands)手册页 –
- ^ Breaking LUKS Encryption. eForensics. 21 August 2020 [2023-04-12]. (原始内容存档于2023-06-04).
- ^ 16.0 16.1 16.2 dm-crypt/Encrypting an entire system. [6 May 2022]. (原始内容存档于2023-06-10).
- ^ Arch with LVM on LUKS. [2023-04-12]. (原始内容存档于2023-04-17).
- ^ LUKS on LVM: encrypted logical volumes and secure backups. 12 September 2014 [2023-04-12]. (原始内容存档于2023-04-17).
- ^ GRUB - ArchWiki. wiki.archlinux.org. [2023-04-12]. (原始内容存档于2023-06-11).
- ^ Home Directories. systemd. [2023-04-12]. (原始内容存档于2023-06-08).
- ^ LibreCrypt. GitHub. 27 July 2022 [2023-04-12]. (原始内容存档于2018-05-16).
- ^ Flaw in driver allows privilege escalation. Feedback wanted · Issue #38 · t-d-k/LibreCrypt. GitHub. 30 September 2015 [2023-04-12]. (原始内容存档于2023-03-20).
- ^ Driver allows writing to arbitrary devices · Issue #39 · t-d-k/LibreCrypt. GitHub. 7 October 2015 [2023-04-12]. (原始内容存档于2023-03-20).
- ^ Servicing the Windows Subsystem for Linux (WSL) 2 Linux Kernel. Microsoft Developer Blogs. 16 April 2021 [2023-04-12]. (原始内容存档于2023-05-22).
- ^ DragonFly's Major Features List. [6 May 2022]. (原始内容存档于2023-05-13).
- ^ Michael Larabel. Calamares Installer Adds LUKS Encryption Support. Phoronix. 8 May 2016 [2023-04-12]. (原始内容存档于2022-05-21).
- ^ How to Encrypt Your Hard Disk in Ubuntu. Make Tech Easier. 13 January 2017 [2023-04-12]. (原始内容存档于2023-05-11).
- ^ PartmanCrypto. Debian Wiki. [6 May 2022]. (原始内容存档于2023-04-12).
- ^ CRYPTSETUP-REENCRYPT(8) Man page. man7.org. [2023-04-12]. (原始内容存档于2023-05-10).