Red Hat Training

A Red Hat training course is available for RHEL 8

第 18 章 使用 LUKS 加密块设备

磁盘加密通过加密来保护块设备中的数据。要访问设备的解密内容,用户必须提供密语或密钥作为身份验证。这对于移动计算机和可移动介质而言尤为重要:即使它已从系统物理上移除,它也有助于保护设备的内容。LUKS 格式是 RHEL 中块设备加密的默认实现。

18.1. LUKS 磁盘加密

Linux Unified Key Setup-disk-format(LUKS)允许您加密块设备,并提供一组简化加密设备管理的工具。LUKS 允许多个用户密钥解密主密钥,用于批量加密分区。

RHEL 使用 LUKS 执行块设备加密。默认情况下,在安装过程中取消选中加密块设备的选项。如果您选择加密磁盘的选项,则系统会在每次引导计算机时提示您输入密码短语。这个密码短语"解锁"用于解密分区的批量加密密钥。如果您选择修改默认的分区表,可以选择加密哪个分区。这是在分区表设置中设定的。

LUKS 做什么

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

LUKS 不能做什么

  • LUKS 等磁盘加密解决方案仅在您的系统关闭时保护数据。当系统处于 on 状态并且 LUKS 解密了磁盘后,该磁盘上的文件将可供通常具有访问权限的任何人使用。
  • LUKS 不适用于需要许多用户具有同一设备的不同访问密钥的情况。LUKS1 格式提供八个关键插槽,LUKU2 最多提供 32 个密钥插槽。
  • LUKS 不适用于需要文件级加密的应用程序。

加密系统

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

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

18.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

cryptsetup reencrypt

LUKS1

cryptsetup-reencrypt

在线重新加密

LUKS2 格式支持在设备正在使用时重新加密加密设备。例如:您不必卸载该设备中的文件系统来执行以下任务:

  • 更改卷密钥
  • 更改加密算法

加密非加密设备时,您仍然必须卸载该文件系统。您可以在简短初始化加密后重新挂载文件系统。

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

转换

LUKS2 格式由 LUKS1 实现。在某些情况下,您可以将 LUKS1 转换为 LUKS2。在以下情况下无法进行转换:

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

18.3. LUKS2 重新加密过程中数据保护选项

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

checksum

这是默认的模式。它在数据保护和性能之间取得平衡。

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

journal
这是最安全的模式,也是速度最慢的模式。此模式记录二进制区域中的再加密区域,因此 LUKS2 将数据写入两次。
none
此模式优先选择性能,不提供数据保护。它只保护数据,以防止安全进程终止,如 SIGTERM Ctrl+C 的用户。任何意外的系统崩溃或应用程序崩溃都可能会导致数据崩溃。

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

如果 LUKS2 重新加密进程意外终止了强制终止,LUKU2 可使用以下方法之一执行恢复:

  • 自动执行下一个 LUKS2 设备打开操作。此操作由 cryptsetup open 命令触发,或者通过将设备附加到 systemd-cryptsetup 触发。
  • 在 LUKS2 设备中使用 cryptsetup repair 命令手动手动。

18.4. 使用 LUKS2 加密块设备上的现有数据

这个过程使用 LUKS2 格式加密设备中的数据。新的 LUKS 标头保存在设备的标头中。

先决条件

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

    警告

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

流程

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

    # umount /dev/sdb1
  2. 为存储 LUKS 标头腾出空间。选择适合您的场景的以下选项之一:

    • 如果是加密逻辑卷,您可以扩展逻辑卷而不重新定义文件系统大小。例如:

      # lvextend -L+32M vg00/lv00
    • 使用分区管理工具(如 parted )扩展分区。
    • 缩小该设备的文件系统。您可以将 resize2fs 工具用于 ext2、ext3 或 ext4 文件系统。请注意,您无法缩小 XFS 文件系统。
  3. 初始化加密。例如:

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

    该命令会要求您输入密码短语并启动加密过程。

  4. 挂载该设备:

    # mount /dev/mapper/sdb1_crypt /mnt/sdb1_encrypted
  5. 启动在线加密:

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

其它资源

  • cryptsetup(8)lvextend(8)resize2fs(8)parted(8) man page

18.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_crypt /mnt/sdb1_encrypted
  4. 启动在线加密:

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

其它资源

  • cryptsetup(8) man page

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

此流程提供有关使用 LUKS2 格式加密空白块设备的信息。

先决条件

  • 空白块设备。

流程

  1. 将分区设置为加密的 LUKS 分区:

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

    # cryptsetup open /dev/sdb1 sdb1_encrypted

    这样可解锁分区并使用设备映射器将其映射到新设备中。这个提示提示内核 device 是一个加密设备,应该使用 /dev/mapper/device_mapped_name 通过 LUKS 来解决,而不是覆盖加密的数据。

  3. 要向分区写入加密的数据,必须通过设备映射名称进行访问。为此,您必须创建一个文件系统。例如:

    # mkfs -t ext4 /dev/mapper/sdb1_encrypted
  4. 挂载该设备:

    # mount /dev/mapper/sdb1_encrypted mount-point

其它资源

  • cryptsetup(8) man page

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

您可以通过运行 Ansible playbook,使用 storage 角色创建并配置使用 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

其它资源