第 8 章 使用LUKS对块设备进行加密

磁盘加密通过对块设备上的数据进行加密保护。要访问设备的解密内容,用户必须提供一个口令或密钥作为认证。当涉及到移动计算机和可移动媒体时,这一点尤为重要:即使设备已从系统中物理移除,它也有助于保护设备的内容。LUKS格式是RHEL中块设备加密的默认实现。

8.1. LUKS磁盘加密

Linux Unified Key Setup-on-disk-format (LUKS)使您能够对块设备进行加密,它提供了一套工具,简化了对加密设备的管理。LUKS允许多个用户密钥解密一个主密钥,用于分区的批量加密。

RHEL利用LUKS进行块设备加密。默认情况下,在安装过程中不勾选加密块设备的选项。如果你选择了加密磁盘的选项,每次开机时系统都会提示你输入密码。这个口令可以"解锁"解密分区的批量加密密钥。如果您选择修改默认的分区表,可以选择加密哪个分区。这是在分区表设置中设置的。

LUKS是什么?

  • LUKS对整个块设备进行加密,因此非常适合保护移动设备的内容,如可移动存储媒体或笔记本电脑磁盘驱动器。
  • 加密块设备的底层内容是任意的,这使得它对加密交换设备很有用。这对于某些使用特殊格式的块设备进行数据存储的数据库也很有用。
  • LUKS使用现有的设备映射器内核子系统。
  • LUKS提供密码加强功能,可以防止字典攻击。
  • LUKS设备包含多个密钥插槽,允许用户添加备份密钥或密码。

LUKS 不能做什么

  • 像LUKS这样的磁盘加密解决方案只在系统关闭时保护数据。一旦系统开启,LUKS对磁盘进行了解密,该磁盘上的文件就可以供任何正常访问它们的人使用。
  • LUKS并不适合需要许多用户对同一设备拥有不同访问密钥的场景。LUKS1格式提供8个键槽,LUKS2最多可提供32个键槽。
  • LUKS不适合需要文件级加密的应用。

加密系统

LUKS默认使用的密码是aes-xts-plain64。LUKS的默认密钥大小为512位。LUKS的默认密钥大小为 蟒蛇(XTS模式)为512位。可用的加密系统包括:

  • AES - 高级加密标准 -FIPS PUB 197
  • Twofish(128 位块加密)
  • Serpent

8.2. RHEL 8中的LUKS版本

在RHEL 8中,LUKS加密的默认格式是LUKS2。传统的LUKS1格式仍然完全支持,它是作为一种与早期RHEL版本兼容的格式提供的。

LUKS2格式的设计是为了将来能够在不需要修改二进制结构的情况下对各种部件进行更新。LUKS2内部使用JSON文本格式的元数据,提供元数据的冗余,检测元数据损坏,并允许从元数据副本中自动修复。

重要

不要在需要与仅支持LUKS1的旧系统兼容的系统中使用LUKS2。请注意,RHEL 7从7.6版本开始支持LUKS2格式。

警告

LUKS2和LUKS1使用不同的命令来加密磁盘。在LUKS版本中使用错误的命令可能会导致数据丢失。

LUKS版本加密命令

LUKS2

加密设置重新加密

LUKS1

cryptsetup-reencrypt

在线重新加密

LUKS2格式支持在设备使用时对加密设备进行重新加密。例如,您不必卸载设备上的文件系统就可以执行以下任务。

  • 改变音量键
  • 更改加密算法

当对未加密的设备进行加密时,您仍然必须卸载文件系统。你可以在短暂的加密初始化后重新挂载文件系统。

LUKS1格式不支持在线重新加密。

换算

LUKS2格式的灵感来源于LUKS1。在某些情况下,你可以将LUKS1转换为LUKS2。具体在以下情况下无法进行转换。

  • LUKS1设备被标记为正在被基于策略的解密(PBD - Clevis)解决方案使用。当检测到一些luksmeta元数据时,cryptsetup工具拒绝转换设备。
  • 一个设备是活动的。在进行任何转换之前,该设备必须处于非活动状态。

8.3. LUKS2重新加密期间数据保护的选项

LUKS2提供了几个选项,在重新加密过程中优先考虑性能或数据保护。

checksum

这是默认模式。它平衡了数据保护和性能。

这个模式将单独的扇区校验和保存在重新加密区域,因此恢复过程可以检测哪些 LUKS2 扇区已经重新加密。该模式要求块设备扇区写是原子的。

journal
这是最安全的模式,但也是最慢的模式。该模式在二进制区域中记述了重新加密的区域,所以LUKS2写了两次数据。
none
该模式优先考虑性能,不提供数据保护。它只在安全进程终止时保护数据,如SIGTERM信号或用户按下 Ctrl+C.任何意外的系统崩溃或应用程序崩溃都可能导致数据损坏。

你可以使用cryptsetup--resilience选项来选择模式。

如果LUKS2重新加密过程意外强行终止,LUKS2可以通过以下方式进行恢复。

  • 在下一次打开LUKS2设备的过程中,自动进行。这个操作是由cryptsetup open命令或者通过systemd-cryptsetup附加设备来触发的。
  • 手动操作,在LUKS2设备上使用cryptsetup repair命令。

8.4. 使用LUKS2对块设备上的现有数据进行加密。

该过程使用LUKS2格式对尚未加密的设备上的现有数据进行加密。一个新的LUKS头存储在设备的头部。

先决条件

  • 块设备包含一个文件系统。
  • 你已经备份了你的数据。

    警告

    您可能会在加密过程中丢失数据:由于硬件、内核或人为故障。在开始加密数据之前,请确保你有一个可靠的备份。

流程

  1. 卸载您计划加密的设备上的所有文件系统。例如:

    # umount /dev/sdb1
  2. 为存储LUKS头腾出空间。在以下适合你的情况的选项中选择一个:

    • 在加密逻辑卷的情况下,您可以在不调整文件系统大小的情况下扩展逻辑卷。例如:

      # lvextend -L+32M vg00/lv00
    • 使用分区管理工具扩展分区,如parted
    • 收缩设备上的文件系统。您可以在ext2、ext3或ext4文件系统中使用resize2fs工具。请注意,你不能收缩XFS文件系统。
  3. 初始化加密。例如:

    # cryptsetup reencrypt \
                 --encrypt \
                 --init-only \
                 --reduce-device-size 32M \
                 /dev/sdb1 sdb1_encrypted

    该命令要求你输入密码并开始加密过程。

  4. 安装设备。

    # mount /dev/mapper/sdb1_encrypted /mnt/sdb1_encrypted
  5. 开始在线加密。

    # cryptsetup reencrypt --resume-only /dev/sdb1

其它资源

  • 更多细节, 请参见cryptsetup(8)lvextend(8)resize2fs(8)parted(8)的手册页。

8.5. 使用LUKS2加密块设备上的现有数据,并附加一个头。

这个过程会对块设备上的现有数据进行加密,而不会为存储LUKS头创建空闲空间。头部存储在一个分离的位置,这也是一个额外的安全层。该程序采用LUKS2加密格式。

先决条件

  • 块设备包含一个文件系统。
  • 你已经备份了你的数据。

    警告

    您可能会在加密过程中丢失数据:由于硬件、内核或人为故障。在开始加密数据之前,请确保你有一个可靠的备份。

流程

  1. 卸载设备上的所有文件系统。例如:

    # umount /dev/sdb1
  2. 初始化加密。

    # cryptsetup reencrypt \
                 --encrypt \
                 --init-only \
                 --header /path/to/header \
                 /dev/sdb1 sdb1_encrypted

    /path/to/header替换为带有LUKS头的文件路径。分离的LUKS头必须可以访问,以便以后可以解锁加密设备。

    该命令要求你输入密码并开始加密过程。

  3. 安装设备。

    # mount /dev/mapper/sdb1_encrypted /mnt/sdb1_encrypted
  4. 开始在线加密。

    # cryptsetup reencrypt --resume-only --header /path/to/header /dev/sdb1

其它资源

  • 更多细节请参见cryptsetup(8)man 页面。

8.6. 使用LUKS2加密空白块设备

本程序提供了关于使用LUKS2格式加密空白块设备的信息。

先决条件

  • 空白块设备。

流程

  1. 将一个分区设置为加密的LUKS分区。

    # cryptsetup luksFormat /dev/sdb1
  2. 打开一个加密的LUKS分区。

    # cryptsetup open /dev/sdb1 sdb1_encrypted

    这将解锁分区,并使用设备映射器将其映射到新设备上。这将提醒内核设备是一个加密设备,应该通过LUKS使用的 /dev/mapper/device_mapped_name。以免覆盖加密数据。

  3. 要将加密数据写入分区,必须通过设备映射名进行访问。要做到这一点,你必须创建一个文件系统。例如:

    # mkfs -t ext4 /dev/mapper/sdb1_encrypted
  4. 安装设备。

    # mount /dev/mapper/sdb1_encrypted

其它资源

  • 更多细节请参见cryptsetup(8)man 页面。

8.7. 使用存储角色创建 LUKS 加密卷

您可以使用存储角色通过运行Ansible剧本来创建和配置用LUKS加密的卷。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要创建卷的系统中安装 Red Hat Ansible Automation Platform。

  • 你在Ansible控制器上安装了rhel-system-roles包。
  • 您有一个清单文件详细描述了您要使用存储系统角色部署 LUKS 加密卷的系统。

流程

  1. 创建一个新的 playbook.yml含有以下内容的文件:

    - hosts: all
      vars:
        storage_volumes:
          - name: barefs
            type: disk
            disks:
             - sdb
            fs_type: xfs
            fs_label: label-name
            mount_point: /mnt/data
            encryption: true
            encryption_password: your-password
      roles:
       - rhel-system-roles.storage
  2. 可选。验证 playbook 语法:

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory.file /path/to/file/playbook.yml

其它资源

  • 如需了解更多与 LUKS 相关的信息,请参阅 17。使用 LUKS 加密块设备
  • 有关存储系统角色中使用的参数的详细信息,请参阅/usr/share/ansible/roles/rhel-system-roles.storage/README.md文件。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。