From Fedora Project Wiki

什么是块设备加密?

Block device encryption encrypts/decrypts the data transparently as it is written/read from block devices, the underlying block device sees only encrypted data.

要挂载加密的块设备,系统管理员(或用户,取决于具体情况)必须提供密码才能访问加密的设备。

加密提供了超越现有操作系统安全机制更高的安全性,因为它可以保护设备的内容,即使它已经从系统中物理移除。一些系统要求加密密钥与解密密钥相同,还有一些系统需要用特定的加密密钥和用特定的二次解密密钥。

使用dm-crypt/LUKS加密块设备

LUKS (Linux统一密钥管理)是块设备加密的规范。它为数据建立了磁盘标准,以及(复杂的)密码/密钥管理策略。

LUKS通过dm-crypt模块完成内核设备映射到子系统。 这种提供了一个低级别的映射,用于处理设备数据的加密和解密。 用户操作(例如创建和访问加密设备)是通过使用cryptsetup来程序完成。

LUKS概述

  • LUKS做了什么:
    • LUKS加密整个块设备
      • 因此,LUKS非常适合保护移动设备的内容,例如:
        • 可移动存储介质
        • 笔记本电脑设备
    • 这个加密块设备的底层内容是随机的
      • 这使得它对加密swap设备很有效。
      • 它同样适用对某些特定格式的块设备数据存储也有效。
    • LUKS uses the existing device mapper kernel subsystem.
      • This is the same subsystem used by LVM, so it is well tested.
    • LUKS提供加强的(复杂)密码
      • 这可以防止暴力破解。
    • LUKS设备可以包含多个密钥方式
      • 允许用户添加备份密钥/密码(复杂的)。
  • 什么是LUKS不适合使用的:
    • LUKS is not well-suited for applications requiring many (more than eight) users to have distinct access keys to the same device.
    • LUKS is not well-suited for applications requiring file-level encryption.

安装后如何访问加密设备? (系统启动时)

在系统启动期间,你会看到一个要求输入密码的提示。 在输入正确的密码后,系统会继续正常启动。 如果你对多个设备使用了不同的密码,则可能需要在启动期间输入多个密码。

Idea.png
提示
应考虑对给定系统中的所有加密块设备使用相同的密码。这将简化系统启动,你将记住更少的密码。只要确保你选择一个好的密码(不容易破解的)!

选择一个合适密码

虽然dm-crypt/LUKS支持密钥和密码,但Anaconda安装的程序仅支持使用密码,来创建和访问加密的块设备。

LUKS确实提供了复杂密码的选择,但选择一个合适的(意思是“不容易猜测”)密码仍然是一个好方法。 请注意使用的是“passphrase“,而不是“password”。 这是故意的。 提供包含多个单词的短语以提高数据的安全性非常重要(备注:password意思是简单的密码,如12345,passphrase意思是复杂的密码,如zKCDGNZ94UKG)。

在Anaconda中创建加密块设备

你可以在系统安装期间添加加密设备。 这使你可以容易的配置具有加密分区的系统。

要启用块设备加密,请在选择自动分区时选中“Encrypt System”复选框,或在创建单个分区的软磁盘阵列(软RAID)或逻辑卷时选中“Encrypt”复选框。 完成分区后,系统将提示你输入加密的密码。 需要此密码才能访问加密设备。 如果你有预先存在的LUKS设备并在安装过程的之前为它们提供了正确的密码,则密码输入对话框也将包含一个复选框。 选中此复选框表示你希望将新密码添加到每个预先存在的加密块设备中的可用项中。

Idea.png
提示
检查"Automatic Partitioning"屏幕上的"Encrypt System"复选框,然后选择"Create custom layout" 不会导致任何块设备自动加密。
Idea.png
提示
你可以使用 kickstart 为每个新增的块加密设备设置单独的(复杂)密码。

什么类型的块设备可以加密?

大多数类型的块设备都可以使用LUKS来加密。 从Anaconda可以加密分区,LVM物理卷,LVM逻辑卷和软磁盘阵列(软RAID)。

Anaconda的块设备加密支持的局限性

在加密前使用随机数据填充设备

在加密前用随机数据填充设备可以提高加密的复杂性。 但是使用随机数据填充设备可能需要更长的时间。正是由于这个原因Anaconda不提供此选项。可以使用脚本kickstart %pre来手动执行。 可以在 这里 找到说明。

使用由随机数据生成的密钥来访问加密设备

除了使用(复杂的)密码之外,还可以使用由随机数据生成的密钥来访问LUKS设备。 设置一个或多个密钥来访问加密设备,可以在已安装的系统上操作,也可以使用脚本kickstart %post 来手动执行。 可以在 这里找到说明。

在已安装的系统上创建加密块设备

安装后可以创建、配置加密块设备。

创建块设备

创建要使用加密块设备的parted, pvcreate, lvcreatemdadm

可选:使用随机数据填充设备

在加密之前用随机数据填充设备 <device> (eg: /dev/sda3)会大大增加加密的强度。缺点是可能需要很长时间。

Warning.png
警告
以下命令会销毁设备上的所有数据。
  • 最好的方法,提供高质量的随机数据,但需要很长时间(大多数系统每GB需要几分钟时间)
    dd if=/dev/urandom of=<device>
  • 最快的方式,提供较低质量的随机数据
    badblocks -c 10240 -s -w -t random -v <device>

格式化设备使用dm-crypt/LUKS加密设备

Warning.png
警告
以下命令会销毁设备上的所有数据。
cryptsetup luksFormat <device>
Idea.png
重要
有关更多信息,请阅读 man 8 cryptsetup手册。

在提示输入两次密码后,设备将被格式化。 要进行验证,请使用以下命令:

cryptsetup isLuks <device> && echo Success

显示设备的加密信息摘要,请使用以下命令:

cryptsetup luksDump <device>

创建映射以允许访问解密后的设备内容

要访问设备解密后的内容,必须使用内核提供的device-mapper建立映射。

为此映射选择有意义的名称是很有必要的。 LUKS为每个设备提供唯一的UUID标识(通用唯一标识符)。This, unlike the device name (eg: /dev/sda3), is guaranteed to remain constant as long as the LUKS header remains intact. 要查找LUKS设备的UUID,请运行以下命令:

cryptsetup luksUUID <device>

实例,复杂且唯一的映射名称的示例 luks-<uuid>,其中<uuid>是设备的LUKS UUID的标识(例如:luks-50ec957a-5b5a-47ee-85e6-f8085bbc97a8)。 这种约定命名可能看起来很笨拙但是不会经常输入它的。

cryptsetup luksOpen <device> <name>

现在应该有一个设备节点/dev/mapper/<name>,它代表解密的设备。 可以像其它任何没有加密的块设备一样读取和写入。

查看有关映射设备的信息,请使用以下命令:

dmsetup info <name>
Idea.png
提示
有关更多信息,请阅读man 8 dmsetup手册。

在映射设备上创建文件系统,或使用映射的设备来构建复杂的存储结构

使用映射的设备节点 (/dev/mapper/<name>) 作为其它的块设备. 在映射设备上创建ext2的文件格式,请使用以下命令:

mke2fs /dev/mapper/<name>

把设备挂载到/mnt/test系统上,请使用以下命令:

Important.png
重要
在执行此命令之前,目录/mnt/test必须存在。
mount /dev/mapper/<name> /mnt/test

添加映射信息/etc/crypttab

为了使设备映射至系统,文件/etc/crypttab必须存在。 如果该文件不存在,请创建该文件并将所有者和组更改为root(root:root)并将权限更改为0744。 文件的内容使用以下格式:

<name>  <device>  none

<device>字段是以“UUID=<luks_uuid>”的格式,其中 <luks_uuid>是由命令cryptsetup luksUUID <device>输出的LUKS uuid标识。 这可以保证即使设备节点(例如:/dev/sda5)发生变化,也可以正确的识别和使用设备。

Idea.png
提示
有关/etc/crypttab文件格式的详细信息,请阅读man 5 crypttab手册。

/etc/fstab文件中添加

/etc/fstab中添加挂载项。 如果你想在设备与挂载的文件之间建立持久连接时,才需要这样做。 这个解密设备/dev/mapper/<name>添加到/etc/fstab文件中。

在多数情况下,需要通过UUID或文件路经(/dev/mapper/<name>)在添加至/etc/fstab文件中。 这样做的主要目的是在设备名称(例如:/dev/sda4)发生变化时提供不变的标识。 以/dev/mapper/luks-<luks_uuid>形式的LUKS设备名称仅基于设备的LUKS UUID,因此可以确保不会发生变化。 这个很适合在/etc/fstab中使用。

Idea.png
提示
有关 /etc/fstab文件格式的详细信息,请阅读man 5 fstab手册页。

安装后常用操作

备份 LUKS headers

如果包含LUKS headers的扇区损坏 - 由于用户错误或硬件故障 - 加密块设备中的所有数据都将丢失。 在这种情况下,备份headers可以帮助恢复数据。

要备份LUKS headers,请使用以下命令:

cryptsetup luksHeaderBackup --header-backup-file <file> <device>

要还原LUKS headers,请使用以下命令:

Warning.png
警告
如果使用了错误的标题或选择了错误的设备,下面的命令可能会破坏数据! 请务必先从备份的headers恢复设备。
cryptsetup luksHeaderRestore --header-backup-file <file> <device>

请参阅 https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#6-backup-and-data-recovery

设置一个随机生成的密钥作为访问加密块设备的另一种方式

生成一个密钥

这会在文件$HOME/keyfile生成一个256位密钥。

dd if=/dev/urandom of=$HOME/keyfile bs=32 count=1
chmod 600 $HOME/keyfile

将密钥添加到加密设备上的可用位置

cryptsetup luksAddKey <device>~/keyfile

为现有设备添加新密码(复杂)

cryptsetup luksAddKey <device>

在提示你输入密码进行身份验证后(目前正在使用的密码),系统会提示你输入新密码。

从设备中删除密码或密钥

cryptsetup luksRemoveKey <device>

系统会提示你输入要删除的密码,然后提示你输入其他剩余密码以进行身份验证。