9.13. 使用 LUKS 加密块设备


通过使用磁盘加密,您可以通过对其进行加密来保护块设备上的数据。要访问设备的解密内容,请输入密码短语或密钥作为身份验证。这对移动计算机和可移动介质非常重要,因为它有助于保护设备的内容,即使它已从系统上物理移除。LUKS 格式是 Red Hat Enterprise Linux 中块设备加密的默认实现。

9.13.1. LUKS 磁盘加密

Linux Unified Key Setup-on-disk-format (LUKS)提供了一组简化管理加密设备的工具。使用 LUKS,您可以加密块设备,并使多个用户密钥解密主密钥。要批量加密分区,请使用这个主密钥。

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

加密系统

LUKS 使用的默认密码是 aes-xts-plain64。LUKS 的默认密钥大小为 512 字节。Anaconda XTS 模式的 LUKS 的默认密钥大小为 512 位。以下是可用的密码:

  • 高级加密标准(AES)
  • Twofish
  • Serpent

LUKS 执行的操作

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

在以下情况下不建议使用 LUKS:

  • 磁盘加密解决方案,如 LUKS,仅在您的系统关闭时保护数据。在系统启动并且 LUKS 解密磁盘后,该磁盘上的文件可供有权访问它们的用户使用。
  • 需要多个用户对同一设备具有不同的访问密钥的情况。LUKS1 格式提供八个密钥插槽,LUKS2 提供最多 32 个密钥插槽。
  • 需要文件级加密的应用程序。

9.13.2. RHEL 中的 LUKS 版本

在 Red Hat Enterprise Linux 中,LUKS 加密的默认格式为 LUKS2。旧的 LUKS1 格式仍被完全支持,它作为与早期 Red Hat Enterprise Linux 版本兼容的格式提供。与 LUKS1 重新加密相比,LUKS2 重新加密被视为更强大且更安全。

LUKS2 格式允许各种部分的未来更新,而无需修改二进制结构。它在内部对元数据使用 JSON 文本格式,提供元数据冗余,检测元数据损坏,并从元数据副本自动修复。

重要

不要在只支持 LUKS1 的系统中使用 LUKS2,因为 LUKS2 和 LUKS1 使用不同的命令来加密磁盘。对 LUKS 版本使用错误的命令可能会导致数据丢失。

表 9.2. 取决于 LUKS 版本的加密命令
LUKS 版本加密命令

LUKS2

cryptsetup reencrypt

LUKS1

cryptsetup-reencrypt

在线重新加密

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

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

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

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

转换

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

  • LUKS1 设备被标记为被基于策略的解密(PBD) Clevis 解决方案使用。当检测到某些 luksmeta 元数据时,cryptsetup 工具不会转换设备。
  • 设备正在活跃。在任何转换前,设备必须处于不活跃状态。

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

LUKS2 提供了几个选项,在重新加密过程中优先选择性能或数据保护。它为 resilience 选项提供以下模式,您可以使用 cryptsetup reencrypt --resilience resilience-mode /dev/sdx 命令选择这些模式之一:

checksum

默认模式。它在数据保护和性能之间保持平衡。

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

journal
最安全的模式,但也是最慢的模式。由于此模式在二进制区域中记录重新加密区域,因此 LUKS2 将数据写入两次。
none
none 模式优先选择性能,不提供数据保护。它只保护数据免受安全进程终止的影响,如 SIGTERM 信号或用户按了 Ctrl+C 键。任何意外的系统故障或应用程序失败都可能会导致数据损坏。

如果 LUKS2 重新加密进程意外被强行终止,LUKU2 可通过以下方法执行恢复:

自动

在下一个 LUKS2 设备打开操作过程中,执行以下操作之一会触发自动恢复操作:

  • 执行 cryptsetup open 命令。
  • 使用 systemd-cryptsetup 命令附加设备。
手动
通过在 LUKS2 设备上使用 cryptsetup repair /dev/sdx 命令。

其它资源

  • 您系统上的 cryptsetup-reencrypt (8)cryptsetup-repair (8) 手册页

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

您可以使用 LUKS2 格式在尚未加密的设备上加密现有数据。新的 LUKS 标头保存在设备的标头中。

先决条件

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

    警告

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

流程

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

    # umount /dev/mapper/vg00-lv00
  2. 为存储 LUKS 标头腾出空间。使用以下适合您场景的选项之一:

    • 如果是加密逻辑卷,您可以扩展逻辑卷而无需调整文件系统的大小。例如:

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

    # cryptsetup reencrypt --encrypt --init-only --reduce-device-size 32M /dev/mapper/vg00-lv00 lv00_encrypted
    
    /dev/mapper/lv00_encrypted is now active and ready for online encryption.
  4. 挂载该设备:

    # mount /dev/mapper/lv00_encrypted /mnt/lv00_encrypted
  5. /etc/crypttab 文件添加持久映射的一个条目:

    1. 查找 luksUUID

      # cryptsetup luksUUID /dev/mapper/vg00-lv00
      
      a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325
    2. 在您选择的文本编辑器中打开 /etc/crypttab,并在此文件中添加设备:

      $ vi /etc/crypttab
      
      lv00_encrypted UUID=a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325 none

      a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325 替换为您设备的 luksUUID

    3. 使用 dracut 刷新 initramfs:

      $ dracut -f --regenerate-all
  6. /etc/fstab 文件中添加一个永久挂载条目:

    1. 查找活跃 LUKS 块设备的文件系统 UUID:

      $ blkid -p /dev/mapper/lv00_encrypted
      
      /dev/mapper/lv00-encrypted: UUID="37bc2492-d8fa-4969-9d9b-bb64d3685aa9" BLOCK_SIZE="4096" TYPE="xfs" USAGE="filesystem"
    2. 在您选择的文本编辑器中打开 /etc/fstab,并在此文件中添加设备,例如:

      $ vi /etc/fstab
      
      UUID=37bc2492-d8fa-4969-9d9b-bb64d3685aa9 /home auto rw,user,auto 0

      37bc2492-d8fa-4969-9d9b-bb64d3685aa9 替换为您文件系统的 UUID。

  7. 恢复在线加密:

    # cryptsetup reencrypt --resume-only /dev/mapper/vg00-lv00
    
    Enter passphrase for /dev/mapper/vg00-lv00:
    Auto-detected active dm device 'lv00_encrypted' for data device /dev/mapper/vg00-lv00.
    Finished, time 00:31.130, 10272 MiB written, speed 330.0 MiB/s

验证

  1. 验证现有数据是否已加密:

    # cryptsetup luksDump /dev/mapper/vg00-lv00
    
    LUKS header information
    Version: 2
    Epoch: 4
    Metadata area: 16384 [bytes]
    Keyslots area: 16744448 [bytes]
    UUID: a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325
    Label: (no label)
    Subsystem: (no subsystem)
    Flags: (no flags)
    
    Data segments:
      0: crypt
    	offset: 33554432 [bytes]
    	length: (whole device)
    	cipher: aes-xts-plain64
    [...]
  2. 查看加密的空白块设备的状态:

    # cryptsetup status lv00_encrypted
    
    /dev/mapper/lv00_encrypted is active and is in use.
      type:    LUKS2
      cipher:  aes-xts-plain64
      keysize: 512 bits
      key location: keyring
      device:  /dev/mapper/vg00-lv00

其它资源

  • cryptsetup (8), cryptsetup-reencrypt (8), lvextend (8), resize2fs (8), 和 parted (8) man page

9.13.5. 使用带有分离标头的 LUKS2 在块设备上加密现有数据

您可以加密块设备上的现有数据,而无需为存储 LUKS 标头创建可用空间。标头存储在分离的位置,它也充当额外的安全层。该流程使用 LUKS2 加密格式。

先决条件

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

    警告

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

流程

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

    # umount /dev/nvme0n1p1
  2. 初始化加密:

    # cryptsetup reencrypt --encrypt --init-only --header /home/header /dev/nvme0n1p1 nvme_encrypted
    
    WARNING!
    ========
    Header file does not exist, do you want to create it?
    
    Are you sure? (Type 'yes' in capital letters): YES
    Enter passphrase for /home/header:
    Verify passphrase:
    /dev/mapper/nvme_encrypted is now active and ready for online encryption.

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

  3. 挂载该设备:

    # mount /dev/mapper/nvme_encrypted /mnt/nvme_encrypted
  4. 恢复在线加密:

    # cryptsetup reencrypt --resume-only --header /home/header /dev/nvme0n1p1
    
    Enter passphrase for /dev/nvme0n1p1:
    Auto-detected active dm device 'nvme_encrypted' for data device /dev/nvme0n1p1.
    Finished, time 00m51s,   10 GiB written, speed 198.2 MiB/s

验证

  1. 验证使用带有分离标头的 LUKS2 块设备上的现有数据是否已加密:

    # cryptsetup luksDump /home/header
    
    LUKS header information
    Version:       	2
    Epoch:         	88
    Metadata area: 	16384 [bytes]
    Keyslots area: 	16744448 [bytes]
    UUID:          	c4f5d274-f4c0-41e3-ac36-22a917ab0386
    Label:         	(no label)
    Subsystem:     	(no subsystem)
    Flags:       	(no flags)
    
    Data segments:
      0: crypt
    	offset: 0 [bytes]
    	length: (whole device)
    	cipher: aes-xts-plain64
    	sector: 512 [bytes]
    [...]
  2. 查看加密的空白块设备的状态:

    # cryptsetup status nvme_encrypted
    
    /dev/mapper/nvme_encrypted is active and is in use.
      type:    LUKS2
      cipher:  aes-xts-plain64
      keysize: 512 bits
      key location: keyring
      device:  /dev/nvme0n1p1

其它资源

  • 您系统上的 cryptsetup (8)cryptsetup-reencrypt (8) 手册页

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

您可以加密空白块设备,您可以使用 LUKS2 格式将其用于加密存储。

先决条件

  • 空白块设备。您可以使用 lsblk 等命令来查找该设备上是否没有实际的数据,例如,文件系统。

流程

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

    # cryptsetup luksFormat /dev/nvme0n1p1
    
    WARNING!
    ========
    This will overwrite data on /dev/nvme0n1p1 irrevocably.
    Are you sure? (Type 'yes' in capital letters): YES
    Enter passphrase for /dev/nvme0n1p1:
    Verify passphrase:
  2. 打开加密的 LUKS 分区:

    # cryptsetup open /dev/nvme0n1p1 nvme0n1p1_encrypted
    
    Enter passphrase for /dev/nvme0n1p1:

    这会解锁分区,并使用设备映射器将其映射到新设备。要不覆盖加密的数据,这个命令会警告内核,该设备是一个加密设备,并使用 /dev/mapper/device_mapped_name 路径通过 LUKS 解决了。

  3. 创建一个文件系统来将加密的数据写入分区,该分区必须可通过设备映射名称访问:

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

    # mount /dev/mapper/nvme0n1p1_encrypted mount-point

验证

  1. 验证空白块设备是否已加密:

    # cryptsetup luksDump /dev/nvme0n1p1
    
    LUKS header information
    Version:       	2
    Epoch:         	3
    Metadata area: 	16384 [bytes]
    Keyslots area: 	16744448 [bytes]
    UUID:          	34ce4870-ffdf-467c-9a9e-345a53ed8a25
    Label:         	(no label)
    Subsystem:     	(no subsystem)
    Flags:       	(no flags)
    
    Data segments:
      0: crypt
    	offset: 16777216 [bytes]
    	length: (whole device)
    	cipher: aes-xts-plain64
    	sector: 512 [bytes]
    [...]
  2. 查看加密的空白块设备的状态:

    # cryptsetup status nvme0n1p1_encrypted
    
    /dev/mapper/nvme0n1p1_encrypted is active and is in use.
      type:    LUKS2
      cipher:  aes-xts-plain64
      keysize: 512 bits
      key location: keyring
      device:  /dev/nvme0n1p1
      sector size:  512
      offset:  32768 sectors
      size:    20938752 sectors
      mode:    read/write

其它资源

  • cryptsetup (8), cryptsetup-open (8), 和 cryptsetup-lusFormat (8) man page

9.13.7. 在 web 控制台中配置 LUKS 密码短语

如果要在系统中的现有逻辑卷中添加加密,则只能通过格式化卷进行。

先决条件

  • 已安装 RHEL 8 web 控制台。

    具体步骤请参阅安装并启用 Web 控制台

  • cockpit-storaged 软件包已安装在您的系统上。
  • 在没有加密的情况下可用的现有逻辑卷.

流程

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 Web 控制台的日志记录

  2. Storage
  3. Storage 表中,单击您要加密的存储设备旁边的菜单按钮
  4. 从下拉菜单中选择 Format
  5. Encryption field 中,选择加密规格 LUKS1LUKS2
  6. 设置并确认您的新密码短语。
  7. 可选:修改其他加密选项。
  8. 完成格式化设置。
  9. Format

9.13.8. 在 web 控制台中更改 LUKS 密码短语

在 web 控制台中的加密磁盘或分区上更改 LUKS 密码短语。

先决条件

  • 已安装 RHEL 8 web 控制台。

    具体步骤请参阅安装并启用 Web 控制台

  • cockpit-storaged 软件包已安装在您的系统上。

流程

  1. 登录到 RHEL 8 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Storage
  3. Storage 表中,选择带有加密数据的磁盘。
  4. 在磁盘页面中,滚动到 Keys 部分,然后点 edit 按钮。

    cockpit LUKS edit

  5. 更改密码短语对话框中:

    1. 输入您当前的密码短语。
    2. 输入您的新密码短语。
    3. 确认您的新密码短语。

      cockpit change pwd

  6. Save

9.13.9. 使用 storage RHEL 系统角色创建 LUKS2 加密的卷

您可以通过运行 Ansible playbook,使用 storage 角色来创建和配置使用 LUKS 加密的卷。

先决条件

流程

  1. 将您的敏感变量存储在一个加密文件中:

    1. 创建 vault :

      $ ansible-vault create vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      luks_password: <password>
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Manage local storage
      hosts: managed-node-01.example.com
      vars_files:
        - vault.yml
      tasks:
        - name: Create and configure a volume encrypted with LUKS
          ansible.builtin.include_role:
            name: rhel-system-roles.storage
          vars:
            storage_volumes:
              - name: barefs
                type: disk
                disks:
                  - sdb
                fs_type: xfs
                fs_label: <label>
                mount_point: /mnt/data
                encryption: true
                encryption_password: "{{ luks_password }}"

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.storage/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不会防止错误但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

验证

  1. 查找 LUKS 加密卷的 luksUUID 值:

    # ansible managed-node-01.example.com -m command -a 'cryptsetup luksUUID /dev/sdb'
    
    4e4e7970-1822-470e-b55a-e91efe5d0f5c
  2. 查看卷的加密状态:

    # ansible managed-node-01.example.com -m command -a 'cryptsetup status luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c'
    
    /dev/mapper/luks-4e4e7970-1822-470e-b55a-e91efe5d0f5c is active and is in use.
      type:    LUKS2
      cipher:  aes-xts-plain64
      keysize: 512 bits
      key location: keyring
      device:  /dev/sdb
    ...
  3. 验证创建的 LUKS 加密的卷:

    # ansible managed-node-01.example.com -m command -a 'cryptsetup luksDump /dev/sdb'
    
    LUKS header information
    Version:        2
    Epoch:          3
    Metadata area:  16384 [bytes]
    Keyslots area:  16744448 [bytes]
    UUID:           4e4e7970-1822-470e-b55a-e91efe5d0f5c
    Label:          (no label)
    Subsystem:      (no subsystem)
    Flags:          (no flags)
    
    Data segments:
      0: crypt
            offset: 16777216 [bytes]
            length: (whole device)
            cipher: aes-xts-plain64
            sector: 512 [bytes]
    ...

其它资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.