Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.9. 加密

4.9.1. 使用 LUKS 磁盘加密

Linux Unified Key Setup-disk-format (或 LUKS)允许您加密 Linux 计算机上的分区。这在涉及到移动计算机和可移动介质时尤为重要。LUKS 允许多个用户密钥解密主密钥,用于分区的批量加密。

LUKS 概述

LUKS 做什么
  • LUKS 会加密整个块设备,因此非常适合保护移动设备的内容,如可移动介质或笔记本电脑磁盘驱动器。
  • 加密块设备的底层内容是任意的。这使得加密 交换设备 非常有用。对于将特殊格式化块设备用于数据存储的某些数据库,这也很有用。
  • LUKS 使用现有的设备映射器内核子系统。
  • LUKS 增强了对字典攻击的保护。
  • LUKS 设备包含多个密钥插槽,允许用户添加备份密钥或密码短语。
LUKS 做什么:
  • LUKS 不适用于需要许多(超过 8 个)用户对同一设备有不同的访问密钥的情况。
  • LUKS 不适用于需要文件级加密的应用程序。
重要
LUKS 等磁盘加密解决方案仅在您的系统关闭时保护数据。一旦系统开启并且 LUKS 解密了磁盘后,通常有权访问该磁盘的任何人都可以使用该磁盘上的文件。

4.9.1.1. Red Hat Enterprise Linux 中的 LUKS 实施

Red Hat Enterprise Linux 7 使用 LUKS 执行文件系统加密。默认情况下,在安装过程中不选中加密文件系统的选项。如果您选择加密硬盘驱动器的选项,系统会提示您输入每次引导计算机时将要求您输入的密码短语。这个密码短语"解锁"用于解密分区的批量加密密钥。如果您选择修改默认分区表,您可以选择要加密的分区。这是在分区表设置中设定的。
LUKS 使用的默认密码(请参阅 cryptsetup --help)是 aes-cbc-essiv:sha256 (ESSIV - Encrypted Salt-Sector Initialization Vector)。请注意,安装程序 Anaconda 默认使用 XTS 模式(aes-xts-plain64)。LUKS 的默认密钥大小为 256 位。Anaconda (XTS 模式)的 LUKS 的默认密钥大小为 512 位。可用的加密系统包括:

4.9.1.2. 手动加密目录

警告
按照以下步骤删除您要加密的分区中的所有数据。您 WILL 丢失了您的所有信息!在开始此流程前,请确保将数据备份到外部源!
  1. 以 root 用户身份在 shell 提示符后输入以下内容进入运行级别 1:
    telinit 1
  2. 卸载您现有的 /home
    umount /home
  3. 如果上一步中的命令失败,请使用 fuser 查找进程切换 /home 并终止它们:
    fuser -mvk /home
  4. 验证 /home 不再被挂载:
    grep home /proc/mounts
  5. 使用随机数据填充分区:
    shred -v --iterations=1 /dev/VG00/LV_home
    这个命令会按照设备的后续写入速度进行,可能需要一些时间才能完成。确保未加密数据保留在已用设备上的重要步骤,并且模糊处理包含加密数据的设备的部分,而不是只是随机数据。
  6. 初始化分区:
    cryptsetup --verbose --verify-passphrase luksFormat /dev/VG00/LV_home
  7. 打开新加密设备:
    cryptsetup luksOpen /dev/VG00/LV_home home
  8. 确保该设备存在:
    ls -l /dev/mapper | grep home
  9. 创建文件系统:
    mkfs.ext3 /dev/mapper/home
  10. 挂载文件系统:
    mount /dev/mapper/home /home
  11. 确保文件系统可见:
    df -h | grep home
  12. 将以下内容添加到 /etc/crypttab 文件中:
    home /dev/VG00/LV_home none
  13. 编辑 /etc/fstab 文件,删除 /home 的旧条目并添加以下行:
    /dev/mapper/home /home ext3 defaults 1 2
  14. 恢复默认 SELinux 安全上下文:
    /sbin/restorecon -v -R /home
  15. 重启机器:
    shutdown -r now
  16. /etc/crypttab 中的条目使您的计算机在引导时询问您的 luks 密码短语。
  17. 以 root 身份登录并恢复您的备份。
现在,在计算机关闭时,您已有一个加密的分区,用于安全剩余的所有数据。

4.9.1.3. 向现有设备添加新密码

使用以下命令在现有设备中添加一个新的密码短语:
cryptsetup luksAddKey device
在提示输入现有验证密码短语之一后,会提示您输入新的密码短语。

4.9.1.4. 从现有设备中删除密码

使用以下命令从现有设备中删除密码短语:
cryptsetup luksRemoveKey device
系统将提示您输入您要删除的密码短语,然后针对任何剩余的密码进行身份验证。

4.9.1.5. 在 Anaconda 中创建加密块设备

您可以在系统安装过程中创建加密设备。这可让您使用加密分区轻松配置系统。
要启用块设备加密,请在创建单个分区、软件 RAID 阵列或逻辑卷时选择 Encrypt System 复选框。完成分区后,会提示您输入加密密码短语。需要此密码短语才能访问加密设备。如果您预先存在的 LUKS 设备,并在安装过程的前面为它们提供正确的密码短语,则密码短语条目对话框也会包含复选框。选中此复选框表示您要添加到每个预先存在的加密块设备中的可用插槽的新密码短语。
注意
在自动分区屏幕上选中 Encrypt System 复选框,然后选择 Create custom layout 不会导致任何块设备被自动加密。
注意
您可以使用 kickstart 为每个新加密块设备设置单独的密码短语。

4.9.2. 创建 GPG 密钥

GPG 用于识别自己并验证您的通信,包括您不知道的人。GPG 允许读取 GPG 签名电子邮件的任何人验证其真实性。换句话说,GPG 允许某人合理地与您签署的通信。GPG 非常有用,因为它有助于防止第三方更改代码或拦截对话并更改消息。

4.9.2.1. 在 GNOME 中创建 GPG 密钥

要在 GNOME 中创建 GPG 密钥,请按照以下步骤操作:
  1. 安装 Seahorse 工具,其使 GPG 密钥管理更容易:
    ~]# yum install seahorse
  2. 要创建密钥,请从 应用程序附件 菜单中选择 Passwords and Encryption Keys,这将启动应用程序 Seahorse
  3. File 菜单中,选择 New,然后选择 PGP Key。然后单击 Continue
  4. 输入您的全名、电子邮件地址和可选注释,描述您是谁(例如:John C. Smith、、软件工程师)。点 Create。此时会显示一个对话框,要求输入密钥的密码短语。选择强大的密码短语,但易于记住。点 OK 并创建密钥。
警告
如果您忘记了您的密码短语,您将无法解密数据。
要查找您的 GPG 密钥 ID,请查看新创建的密钥旁边的密钥 ID 列。在大多数情况下,如果您请求密钥 ID,请将 0x 添加到密钥 ID 前,如 0x6789ABCD 中。您应该备份您的私钥,并将它保存在某个地方安全。

4.9.2.2. 在 KDE 中创建 GPG 密钥

要在 KDE 中创建 GPG 密钥,请按照以下步骤操作:
  1. 从主菜单中选择 应用程序实用程序 加密工具,从主菜单启动 KGpg 程序。如果您之前使用 KGpg,则程序将引导您完成创建自己的 GPG 密钥对的过程。
  2. 此时会出现一个对话框,提示您创建新密钥对。输入您的名字、电子邮件地址和可选注释。您还可以为您的密钥选择过期时间,以及密钥强度(位数)和算法。
  3. 在下一个对话框中输入您的密码短语。此时,您的密钥会出现在主 KGpg 窗口中。
警告
如果您忘记了您的密码短语,您将无法解密数据。
要查找您的 GPG 密钥 ID,请查看新创建的密钥旁边的密钥 ID 列。在大多数情况下,如果您请求密钥 ID,请将 0x 添加到密钥 ID 前,如 0x6789ABCD 中。您应该备份您的私钥,并将它保存在某个地方安全。

4.9.2.3. 使用命令行创建 GPG 密钥

  1. 使用以下 shell 命令:
    ~]$ gpg2 --gen-key
    此命令生成由公钥和私钥组成的密钥对。其他人使用您的公钥来验证和解密您的通信。尽可能广泛地分发您的公钥,特别是您所知道希望接收您的身份通信(如邮件列表)的人员。
  2. 一系列提示会指示您完成该过程。如果需要,按 Enter 键分配默认值。第一个提示要求您选择您喜欢的密钥类型:
    Please select what kind of key you want:
    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
    Your selection?
    在几乎所有情况下,默认值都是正确的选择。RSA/RSA 密钥允许您仅签署通信,也允许您加密文件。
  3. 选择密钥大小:
    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048)
    此外,默认的 2048 几乎对于所有用户来说都足够了,代表非常强大的安全性级别。
  4. 选择 键将过期的时间。最好选择过期日期,而不使用默认值,即无。例如,如果密钥上的电子邮件地址无效,过期日期将提醒其他人停止使用该公钥。
    Please specify how long the key should be valid.
    0 = key does not expire
    d = key expires in n days
    w = key expires in n weeks
    m = key expires in n months
    y = key expires in n years
    key is valid for? (0)
    例如,输入值 1y 使密钥在一年内有效。(如果您更改您的主意,您可以在生成密钥后更改此过期日期。)
  5. gpg2 应用程序请求签名信息前,会出现以下提示:
    Is this correct (y/N)?
    输入 y 以完成该过程。
  6. 输入您的 GPG 密钥的名称和电子邮件地址。请记住,这个过程将作为真实个人进行身份验证。因此,请包含您的真实名称。如果您选择了一个虚假的电子邮件地址,则其他电子邮件地址将更难以查找您的公钥。这使得验证您的通信变得困难。如果您在邮件列表中将这个 GPG 密钥用于自我引入,例如,请输入您在该列表中使用的电子邮件地址。
    使用注释字段包含别名或其他信息。(某些人使用不同的密钥来满足不同的目的,并使用注释来标识每个键,如"Office"或"开源项目"。")
  7. 在确认提示下,输入字母 O 以继续所有条目(如果所有条目都正确),或者使用其他选项来修复任何问题。最后,为您的 secret 密钥输入密码短语。gpg2 程序要求您输入两次密码短语以确保您没有输入错误。
  8. 最后,gpg2 生成随机数据,使您的密钥尽可能唯一。在这一步中移动鼠标、类型随机密钥或在系统上执行其他任务以加快进程。完成此步骤后,您的密钥已完成并可使用:
    pub  1024D/1B2AFA1C 2005-03-31 John Q. Doe <jqdoe@example.com>
    Key fingerprint = 117C FE83 22EA B843 3E86  6486 4320 545E 1B2A FA1C
    sub  1024g/CEA4B22E 2005-03-31 [expires: 2006-03-31]
    
  9. 密钥指纹是您的密钥的简写"signature"。它允许您确认他们已经收到了您的实际公钥,而无需篡改。您不需要将此指纹写出。要随时显示指纹,请使用这个命令替换您的电子邮件地址:
    ~]$ gpg2 --fingerprint jqdoe@example.com
    您的"GPG 密钥 ID"由标识公钥的 8 个十六进制数组成。在上例中,GPG 密钥 ID 为 1B2AFA1C。在大多数情况下,如果您请求密钥 ID,请将 0x 添加到密钥 ID 前,如 0x6789ABCD 中。
警告
如果您忘记了您的密码短语,则无法使用密钥,并且使用该密钥加密的任何数据都将丢失。

4.9.2.4. 关于公钥加密

4.9.3. 对公共密钥加密使用 openCryptoki

openCryptoki 是一种 Linux 实现,它是一种公共密钥加密 标准,它定义了名为令牌的加密设备的应用编程接口(API)。令牌可以在硬件或软件中实施。本章概述了在 Red Hat Enterprise Linux 7 中安装、配置和使用 openCryptoki 系统的方式。

4.9.3.1. 安装 openCryptoki 并启动服务

要在您的系统上安装基本的 openCryptoki 软件包,包括令牌的软件实现用于测试目的,请以 root 用户身份输入以下命令:
~]# yum install opencryptoki
根据您要使用的硬件令牌类型,您可能需要安装为特定用例提供支持的其他软件包。例如:要获得对 受信任的平台模块 (TPM)设备的支持,您需要安装 opencryptoki-tpmtok 软件包。
如需有关如何使用 Yum 软件包管理器安装软件包的信息,请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的安装软件包部分。https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#sec-Installing
要启用 openCryptoki 服务,您需要运行 pkcsslotd 守护进程。以 root 用户身份执行以下命令,启动当前会话的守护进程:
~]# systemctl start pkcsslotd
要确保该服务在引导时自动启动,请输入以下命令:
~]# systemctl enable pkcsslotd
有关如何使用 systemd 目标来管理服务的更多信息,请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的使用 systemd 管理服务 章节。

4.9.3.2. 配置和使用 openCryptoki

启动时,pkcsslotd 守护进程会读取 /etc/opencryptoki/opencryptoki.conf 配置文件,该文件用于收集有关配置用于系统及其插槽的令牌信息。
该文件使用键值对定义各个插槽。每个插槽定义可以包含描述、要使用的令牌库的规格,以及插槽制造商的 ID。另外,也可以定义插槽的硬件和固件的版本。有关文件格式的描述信息请查看 opencryptoki.conf(5) 手册页,以及有关单个键的更详细描述以及可分配给它们的值。
要在运行时修改 pkcsslotd 守护进程的行为,请使用 pkcsconf 工具。此工具允许您显示和配置守护进程的状态,并列出和修改当前配置的插槽和令牌。例如,要显示令牌的相关信息,请发出以下命令(请注意,需要与 pkcsslotd 守护进程通信的所有非 root 用户都必须是 pkcs11 系统组群的一部分):
~]$ pkcsconf -t
如需 pkcsconf 工具可用的参数列表,请查看 pkcsconf(1) 手册页。
警告
请记住,pkcs11 组中只能分配完全可信用户,因为此组的所有成员都有阻止 openCryptoki 服务其他用户访问配置的 PKCS628 令牌的权利。这个组的所有成员都可以使用对 openCryptoki 的任何用户的权限执行任意代码。

4.9.4. 使用智能卡向 OpenSSH Supply 凭证

智能卡是 USB 盘、微SD 或 SmartCard 表单因素中的轻量级硬件安全模块。它提供远程可管理的安全密钥存储。在 Red Hat Enterprise Linux 7 中,OpenSSH 支持使用智能卡进行身份验证。
要将智能卡与 OpenSSH 搭配使用,请将卡中的公钥保存到 ~/.ssh/authorized_keys 文件中。在客户端上安装由 opensc 软件包提供的 PKCS efi 库。PKCS vary 是一个公钥加密标准,它定义了一个应用程序编程接口(API)到名为令牌的加密设备。以 root 用户身份输入以下命令:
~]# yum install opensc

4.9.4.1. 从卡检索公钥

要列出卡中的密钥,请使用 ssh-keygen 命令。使用 -D 指令指定共享库(以下示例中的OpenSC)。
~]$ ssh-keygen -D /usr/lib64/pkcs11/opensc-pkcs11.so
ssh-rsa AAAAB3NzaC1yc[...]+g4Mb9

4.9.4.2. 在服务器上存储公钥

要使用远程服务器上的智能卡启用验证,请将公钥传送到远程服务器。通过复制检索到的字符串(密钥),并将其粘贴到远程 shell,或者将密钥存储到文件(以下示例中的smartcard.pub )并使用 ssh-copy-id 命令进行此操作:
~]$ ssh-copy-id -f -i smartcard.pub user@hostname
user@hostname's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh user@hostname"
and check to make sure that only the key(s) you wanted were added.
在没有私钥文件的情况下存储公钥需要使用 SSH_COPY_ID_LEGACY=1 环境变量或 -f 选项。

4.9.4.3. 使用智能卡中的密钥向服务器进行身份验证

OpenSSH 可以从智能卡读取您的公钥,并使用您的私钥执行操作,而无需公开密钥本身。这意味着私钥不会离开卡。要使用智能卡连接到远程服务器进行验证,请输入以下命令并输入 PIN 保护您的卡:
[localhost ~]$ ssh -I /usr/lib64/pkcs11/opensc-pkcs11.so hostname
Enter PIN for 'Test (UserPIN)':
[hostname ~]$
使用您要连接的实际主机名替换 hostname
要在下次连接到远程服务器时保存不必要的输入,请将路径存储在 ~/.ssh/config 文件中:
Host hostname
    PKCS11Provider /usr/lib64/pkcs11/opensc-pkcs11.so
运行不带任何附加选项的 ssh 命令进行连接:
[localhost ~]$ ssh hostname
Enter PIN for 'Test (UserPIN)':
[hostname ~]$

4.9.4.4. 使用 ssh-agent 自动执行 PIN Logging In

设置环境变量以使用 ssh-agent 开始。在大多数情况下,您可以跳过这一步,因为 ssh-agent 已在典型的会话中运行。使用以下命令检查是否可以连接到您的身份验证代理:
~]$ ssh-add -l
Could not open a connection to your authentication agent.
~]$ eval `ssh-agent`
为了避免在每次使用这个密钥连接时写入 PIN,请运行以下命令将卡添加到代理中:
~]$ ssh-add -s /usr/lib64/pkcs11/opensc-pkcs11.so
Enter PIN for 'Test (UserPIN)':
Card added: /usr/lib64/pkcs11/opensc-pkcs11.so
要从 ssh-agent 中删除卡,请使用以下命令:
~]$ ssh-add -e /usr/lib64/pkcs11/opensc-pkcs11.so
Card removed: /usr/lib64/pkcs11/opensc-pkcs11.so
注意
FIPS 201-2 需要由个人身份验证(PIV)卡拥有者明确的用户操作,作为使用卡中存储的数字签名密钥的条件。OpenSC 正确强制实施这一要求。
但是,对于某些应用程序,需要卡拥有者为每个签名输入 PIN。要缓存智能卡 PIN,请在 /etc/opensc-x86_64.conf 中的 pin_cache_ignore_user_consent = true 之前删除 # 字符。

4.9.4.5. 其它资源

Red Hat Enterprise Linux 7 的智能卡支持中 描述了设置您的硬件或软件令牌。
有关 pkcs11-tool 实用程序管理和使用智能卡和类似 PKCS facilities 安全令牌的更多信息,请参阅 pkcs11-tool (1) 手册页。

4.9.5. 可信和加密的密钥

可信和加密的密钥 是利用内核密钥环服务的内核生成的可变长度对称密钥。密钥从未以未加密的形式显示在用户空间中,意味着可以验证其完整性,这意味着可以通过扩展验证模块(EVM)来验证并确认正在运行的系统的完整性。用户级程序只能以加密 Blob 的形式访问密钥。
可信密钥需要硬件组件: 受信任的平台模块 (TPM)芯片,用于创建和加密(密封)密钥。TPM 使用名为 存储 root 密钥(SRK)的 2048 位 RSA 密钥 密封密钥。
此外,还可以使用特定的 TPM 的平台配置寄存器(PCR)值集密封可信密钥。PCR 包含一组完整性管理值,它们反映了 BIOS、引导装载程序和操作系统。这意味着 PCR- 密封的密钥只能由加密的确切系统上的 TPM 解密。但是,当加载 PCR-sealed 可信密钥(添加到密钥环),并验证其关联的 PCR 值后,就可以使用新的(或将来) PCR 值进行更新,以便可以引导新的内核。单个键也可以保存为多个 blob,每个键都有不同的 PCR 值。
加密密钥不需要 TPM,因为它们使用内核 AES 加密,这使其比可信密钥更快。加密的密钥是使用内核生成的随机数字创建的,并在导入到用户空间 Blob 时由主密钥加密。此主密钥可以是可信密钥或用户密钥,它是其主要缺点 - 如果主密钥不是可信密钥,则加密的密钥仅与用于加密它的用户密钥的安全。

4.9.5.1. 使用密钥

在使用密钥执行任何操作前,请确保在系统中载入 trustedencrypted-keys 内核模块。在不同 RHEL 内核构架中载入内核模块时请考虑以下点:
  • 对于带有 x86_64 架构的 RHEL 内核,TRUSTED_KEYSENCRYPTED_KEYS 代码作为核心内核代码的一部分构建。因此,x86_64 系统用户可以使用这些密钥,而无需加载 trustedencrypted-keys 模块。
  • 对于所有其他架构,需要先加载 trustedencrypted-keys 内核模块,然后才能使用密钥执行任何操作。要载入内核模块,请执行以下命令:
    ~]# modprobe trusted encrypted-keys
可以使用 keyctl 实用程序创建、加载、导出和更新可信和加密的密钥。有关使用 keyctl 的详情,请参考 keyctl(1)
注意
要使用 TPM (如用于创建和密封可信密钥),需要启用并激活它。这通常可以通过机器的 BIOS 中的设置,或使用 tpm-tools 软件包中的 tpm_setactive 命令来实现。另外,还需要安装 TrouSers 应用程序( trousers 软件包)和 tcsd 守护进程,它们是 TrouSers 套件的一部分,与 TPM 进行通信。
要使用 TPM 创建可信密钥,请执行具有以下语法的 keyctl 命令:
~]$ keyctl add trusted name "new keylength [options]" keyring
使用上述语法时,可以按照如下所示构建示例命令:
~]$ keyctl add trusted kmk "new 32" @u
642500861
上面的示例创建一个名为 kmk 的可信密钥,长度为 32 字节(256 位),并将其放置在用户密钥环中(@u)。密钥长度为 32 到 128 字节(256 到 1024 位)。使用 show 子命令列出内核密钥环的当前结构:
~]$ keyctl show
Session Keyring
       -3 --alswrv    500   500  keyring: _ses
 97833714 --alswrv    500    -1   \_ keyring: _uid.1000
642500861 --alswrv    500   500       \_ trusted: kmk
print 子命令将加密密钥输出到标准输出。要将密钥导出到用户空间 blob,请使用 pipe 子命令,如下所示:
~]$ keyctl pipe 642500861 > kmk.blob
要从 user-space blob 加载可信密钥,请再次使用带有 blob 的 add 命令作为参数:
~]$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824
然后,可以使用 TPM密封的可信密钥来创建安全加密密钥。以下命令语法用于生成加密密钥:
~]$ keyctl add encrypted name "new [format] key-type:master-key-name keylength" keyring
根据上述语法,可以构建使用已创建的可信密钥生成加密密钥的命令,如下所示:
~]$ keyctl add encrypted encr-key "new trusted:kmk 32" @u
159771175
要在 TPM 不可用的系统中创建加密密钥,请使用随机数字序列生成用户密钥,然后使用该密钥密封实际加密密钥。
~]$ keyctl add user kmk-user "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u
427069434
然后,使用 random-number 用户密钥生成加密密钥:
~]$ keyctl add encrypted encr-key "new user:kmk-user 32" @u
1012412758
list 子命令可用于列出指定内核密钥环中的所有密钥:
~]$ keyctl list @u
2 keys in keyring:
427069434: --alswrv  1000  1000 user: kmk-user
1012412758: --alswrv  1000  1000 encrypted: encr-key
重要
请记住,未由 master 可信密钥密封的加密密钥仅作为用于加密它们的用户主密钥(随机数字密钥)安全。因此,master 用户密钥应该尽可能安全地加载,最好在引导过程中提前载入。

4.9.5.2. 其它资源

以下离线和在线资源可用于获取与使用可信和加密的密钥相关的其他信息。

安装的文档

  • keyctl(1) - 描述 keyctl 工具及其子命令的使用。

在线文档

另请参阅

4.9.6. 使用随机数字生成器

为了能够生成无法轻松中断的安全加密密钥,需要一个随机数字的来源。通常,数字越随机的是,获取唯一密钥的几率越好。生成随机数字的 通常从计算环境"noise"或使用硬件 随机数生成器 获得。
rngd 守护进程是 rng-tools 软件包的一部分,能够同时使用环境 noise 和硬件随机数字生成器来提取熵。守护进程检查由随机性源提供的数据是否足够随机,然后将其存储在内核的随机的熵池中。它生成的随机数字可以通过 /dev/random 和 / dev/urandom 字符设备 提供。
/dev/random/dev/urandom 之间的区别在于,前者是一个阻塞设备,这意味着它在确定熵的数量不足以生成正确的随机输出时停止提供数字。相反,/dev/urandom 是一个非阻塞源,它重复使用内核的熵池,因此可以提供不受限制的伪随机数字,带有较少的熵。因此,/dev/urandom 不应该用于创建长期加密密钥。
要安装 rng-tools 软件包,以 root 用户身份运行以下命令:
~]# yum install rng-tools
要启动 rngd 守护进程,请以 root 用户身份执行以下命令:
~]# systemctl start rngd
要查询守护进程的状态,请使用以下命令:
~]# systemctl status rngd
要使用可选参数启动 rngd 守护进程,请直接执行它。例如,要指定随机数字输入的替代源(除 /dev/hwrandom),请使用以下命令:
~]# rngd --rng-device=/dev/hwrng
上一命令使用 /dev/hwrng 作为读取随机数字的设备启动 rngd 守护进程。同样,您可以使用 -o (或 --random-device)选项为随机数字输出选择内核设备(不是默认的 /dev/random)。有关所有可用选项的列表,请查看 rngd(8) 手册页。
要检查给定系统中有哪些熵源可用,请以 root 用户身份执行以下命令:
~]# rngd -vf
Unable to open file: /dev/tpm0
Available entropy sources:
	DRNG
注意
输入 rngd -v 命令后,根据的进程会在后台继续运行。默认情况下应用 -b、--background 选项(成为后台程序)。
如果没有 TPM 设备,您将只看到 Intel numeric Random Number Generator (DRNG)作为熵源。要检查您的 CPU 是否支持 RDRAND 处理器指令,请输入以下命令:
~]$ cat /proc/cpuinfo | grep rdrand
注意
如需更多信息和软件代码示例,请参阅 Intel Digital Random Number Generator (DRNG)软件实现指南。
rng-tools 软件包还包含 rngtest 工具,可用于检查数据的随机性。要测试 /dev/random 输出的随机性级别,请使用 rngtest 工具,如下所示:
~]$ cat /dev/random | rngtest -c 1000
rngtest 5
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 998
rngtest: FIPS 140-2 failures: 2
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 2
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.171; avg=8.453; max=11.374)Mibits/s
rngtest: FIPS tests speed: (min=15.545; avg=143.126; max=157.632)Mibits/s
rngtest: Program run time: 2390520 microseconds
rngtest 工具输出中显示的大量故障表示经过测试的数据的随机性不足,不应依赖于它。有关 rngtest 工具可用选项列表,请查看 rngtest(1) 手册页。
Red Hat Enterprise Linux 7 引入了 virtio RNG (随机数字生成器)设备,它为 KVM 虚拟机提供从主机机器访问熵的 KVM 虚拟机。在推荐的设置中,hwrng 发送到主机 Linux 内核的熵池(通过 /dev/random),QEMU 将使用 /dev/random 作为客户机请求的熵源。

图 4.1. virtio RNG 设备

virtio RNG 设备
在以前的版本中,Red Hat Enterprise Linux 7.0 和 Red Hat Enterprise Linux 6 客户机可以通过 rngd 用户空间守护进程从主机使用熵。设置守护进程是每个 Red Hat Enterprise Linux 安装的手动步骤。通过 Red Hat Enterprise Linux 7.1,手动步骤已被消除,使整个流程无缝且自动。现在不需要使用 rngd,当可用的熵低于特定阈值时,客户机内核本身从主机获取熵。然后,guest 内核在请求后马上为应用程序提供随机数字。
Red Hat Enterprise Linux 安装程序 Anaconda 现在在其安装程序镜像中提供 virtio-rng 模块,在 Red Hat Enterprise Linux 安装过程中提供可用的主机熵。
重要
要正确决定您应该用于您的场景的随机数字生成器,请参阅 了解 Red Hat Enterprise Linux 随机数字生成器接口 文章。