安全强化
增强 Red Hat Enterprise Linux 10 系统的安全性
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 将 RHEL 切换到 FIPS 模式 复制链接链接已复制到粘贴板!
要启用联邦信息处理标准(FIPS) 140-3 强制的加密模块自我检查,您必须在 FIPS 模式下操作 Red Hat Enterprise Linux 10。将系统切换到 FIPS 模式的唯一方法是在安装过程中启用它。
Red Hat Enterprise Linux 10 不支持在安装后将系统切换到 FIPS 模式。特别是,设置 FIPS 系统范围的加密策略 不足以启用 FIPS 模式,并保证遵守 FIPS 140 标准。将 FIPS 策略用于 FIPS 模式启用过程的 fips-mode-setup 工具已被删除。
要关闭 FIPS 模式,您必须重新安装系统,并且在安装过程中不启用 FIPS 模式。
1.1. 联邦信息处理标准 140 和 FIPS 模式 复制链接链接已复制到粘贴板!
联邦信息处理标准(FIPS)出版物 140 是国家标准与技术研究所开发的一系列计算机安全标准,以确保加密模块的质量。FIPS 140 标准确保加密工具正确实现其算法。运行时加密算法和完整性自我测试是确保系统使用满足标准要求的加密的一些机制。
1.1.1. FIPS 模式下的 RHEL 复制链接链接已复制到粘贴板!
要确保 RHEL 系统只生成并使用所有带有 FIPS 批准的算法的加密密钥,您必须将 RHEL 切换到 FIPS 模式。
要启用 FIPS 模式,请在 FIPS 模式下开始安装。这可避免加密密钥材料重新生成和与转换已部署系统关联的结果系统的合规性的重新评估。另外,根据是否启用了 FIPS 模式来更改其算法选择的组件会选择正确的算法。例如,LUKS 磁盘加密在 FIPS 模式下安装时使用 PBKDF2 密钥派生功能(KDF),否则它会选择不符合 FIPS 的 Argon2 KDF。因此,在安装后切换到 FIPS 模式时,带有磁盘加密的非 FIPS 安装不符合或可能无法引导。
要操作遵守 FIPS 的系统,请在 FIPS 模式下创建所有加密密钥资料。另外,加密密钥材料不得离开 FIPS 环境,除非它被安全包装,且永远不会在非 FIPS 环境下打开包装。
1.1.2. FIPS 模式状态 复制链接链接已复制到粘贴板!
FIPS 模式是否启用了是由内核命令行上的 fips=1 引导选项决定的。如果没有使用 update-crypto-policies --set FIPS 命令明确设置,系统范围的加密策略会自动遵循此设置。带有 /boot 单独分区的系统还需要 boot=UUID=<uuid-of-boot-disk> 内核命令行参数。在 FIPS 模式下启动时,安装程序会执行所需的更改。
FIPS 模式所需的限制的强制执行取决于 /proc/sys/crypto/fips_enabled 文件的内容。如果文件包含 1,RHEL 核心加密组件切换到模式,在此模式下,它们只使用 FIPS 批准的加密算法的实现。如果 /proc/sys/crypto/fips_enabled 包含 0 ,则加密组件不会启用其 FIPS 模式。
1.1.3. 加密策略中的 FIPS 复制链接链接已复制到粘贴板!
FIPS 系统范围的加密策略有助于配置更高级别的限制。因此,支持加密灵活性的通信协议不会在选择时宣布系统拒绝的密码。例如,ChaCha20 算法不是 FIPS 批准的,FIPS 加密策略确保 TLS 服务器和客户端不宣布 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS 密码套件,因为任何使用此类密码的尝试都会失败。
如果您在 FIPS 模式下操作 RHEL,并使用提供其自己的与 FIPS 模式相关的配置选项的应用程序,请忽略这些选项和相应的应用程序指导。系统在 FIPS 模式下运行,系统范围的加密策略只强制执行符合 FIPS 的加密。例如,如果系统在 FIPS 模式下运行,请忽略 Node.js 配置选项 --enable-fips。如果您在没有在 FIPS 模式下运行的系统上使用 --enable-fips 选项,则您没有满足 FIPS-140 合规性要求。
1.1.4. RHEL 10.0 OpenSSL FIPS 指标 复制链接链接已复制到粘贴板!
因为 RHEL 在 OpenSSL 上游引入 OpenSSL FIPS 指标之前引入了它,且两种设计有所不同,所以指标可能会在将来的 RHEL 10 次版本中有所变化。在可能使用上游 API 后,RHEL 10.0 指标可能会返回一个错误消息 "unsupported" ,而不是结果。详情请查看 OpenSSL FIPS 指标 GitHub 文档。
RHEL 10 的加密模块尚未获得国家标准与技术研究院(NIST)加密模块验证计划(CMVP)的 FIPS 140-3 要求的认证。您可以在 产品合规性 红帽客户门户网站页面上的 FIPS - Federal Information Processing Standards 部分中看到加密模块的验证状态。
1.2. 安装启用了 FIPS 模式的系统 复制链接链接已复制到粘贴板!
要启用联邦信息处理标准(FIPS) 140 强制的加密模块自检,请在系统安装过程中启用 FIPS 模式。
完成 FIPS 模式的设置后,如果不使系统处于不一致的状态,就不能关闭 FIPS 模式。如果您的场景需要这个变化,唯一的正确方法是完全重新安装系统。
流程
在系统安装开始时,当 Red Hat Enterprise Linux 引导窗口打开并显示可用的引导选项时,将
fips=1选项添加到内核命令行中。在 UEFI 系统上,按 e 键,将光标移至
linuxefi内核命令行的末尾,将fips=1添加到此行的末尾,例如:linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.\ check quiet fips=1
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.\ check quiet fips=1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 BIOS 系统上,按 Tab 键,将光标移至内核命令行的末尾,并将
fips=1添加到此行的末尾,例如:> vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.check quiet fips=1
> vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.check quiet fips=1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 在软件选择阶段,请勿安装任何第三方软件。
- 安装后,系统会自动以 FIPS 模式启动。
验证
系统启动后,检查是否启用了 FIPS 模式:
cat /proc/sys/crypto/fips_enabled 1
$ cat /proc/sys/crypto/fips_enabled 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. 使用 RHEL 镜像构建器启用 FIPS 模式 复制链接链接已复制到粘贴板!
您可以创建一个自定义镜像,并引导启用了 FIPS 的 RHEL 镜像。在制作镜像前,您必须更改蓝图中 fips 指令的值。
先决条件
-
您以 root 用户身份登录,或者以是
weldr组成员的用户身份登录。
流程
使用以下内容,创建一个 Tom's Obvious, Minimal Language (TOML)格式的纯文本文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将蓝图导入到 RHEL 镜像构建器服务器中:
composer-cli blueprints push blueprint-name.toml
# composer-cli blueprints push blueprint-name.tomlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出现有的蓝图,以检查创建的蓝图是否已成功导入且存在:
composer-cli blueprints show blueprint-name
# composer-cli blueprints show blueprint-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查蓝图中列出的组件和版本是否有效:
composer-cli blueprints depsolve blueprint-name
# composer-cli blueprints depsolve blueprint-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 构建自定义的 RHEL 镜像:
composer-cli compose start \ blueprint-name \ image-type \
# composer-cli compose start \ blueprint-name \ image-type \Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看镜像状态:
composer-cli compose status … UUID FINISHED date blueprint-name blueprint-version image-type …
# composer-cli compose status … $ UUID FINISHED date blueprint-name blueprint-version image-type …Copy to Clipboard Copied! Toggle word wrap Toggle overflow 下载镜像:
composer-cli compose image UUID
# composer-cli compose image UUIDCopy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL 镜像构建器将镜像下载到当前目录路径。UUID 号和镜像大小会同时显示:
UUID-image-name.type: size MB
$ UUID-image-name.type: size MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
- 使用您在蓝图中配置的用户名和密码登录到系统镜像。
检查是否启用了 FIPS 模式:
cat /proc/sys/crypto/fips_enabled 1
$ cat /proc/sys/crypto/fips_enabled 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. 为启用了 FIPS 的系统创建一个可引导磁盘镜像 复制链接链接已复制到粘贴板!
您可以在执行 Anaconda 安装时创建一个磁盘镜像并启用 FIPS 模式。在引导磁盘镜像时,您必须添加 fips=1 内核参数。
先决条件
- 您已在主机机器上安装了 Podman。
-
您已在主机机器上安装了
virt-install。 -
您有运行
bootc-image-builder工具的 root 访问权限,并在--privileged模式下运行容器,以构建镜像。
流程
创建一个
01-fips.toml来配置 FIPS 启用,例如:# Enable FIPS kargs = ["fips=1"]
# Enable FIPS kargs = ["fips=1"]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下说明创建一个 Containerfile,以启用
fips=1内核参数并调整加密策略:FROM registry.redhat.io/rhel10/rhel-bootc:latest # Enable fips=1 kernel argument: https://bootc-dev.github.io/bootc/building/kernel-arguments.html COPY 01-fips.toml /usr/lib/bootc/kargs.d/ # Install and enable the FIPS crypto policy RUN dnf install -y crypto-policies-scripts && update-crypto-policies --no-reload --set FIPS
FROM registry.redhat.io/rhel10/rhel-bootc:latest # Enable fips=1 kernel argument: https://bootc-dev.github.io/bootc/building/kernel-arguments.html COPY 01-fips.toml /usr/lib/bootc/kargs.d/ # Install and enable the FIPS crypto policy RUN dnf install -y crypto-policies-scripts && update-crypto-policies --no-reload --set FIPSCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用当前目录中的
Containerfile创建 bootc<image>兼容的基础磁盘镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在系统安装过程中启用 FIPS 模式:
引导 RHEL Anaconda 安装程序时,在安装屏幕上,按 TAB 键并添加
fips=1内核参数。安装后,系统会自动以 FIPS 模式启动。
验证
登录到系统后,检查是否启用了 FIPS 模式:
cat /proc/sys/crypto/fips_enabled 1 $ update-crypto-policies --show FIPS
$ cat /proc/sys/crypto/fips_enabled 1 $ update-crypto-policies --show FIPSCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.5. 使用与 FIPS 140-3 不兼容的加密的 RHEL 应用程序列表 复制链接链接已复制到粘贴板!
要传递所有相关加密认证,如 FIPS 140-3,请使用核心加密组件集中的库。除了 libgcrypt 外,这些库也遵循 RHEL 系统范围加密策略。
有关核心加密组件、如何选择它们、它们如何与操作系统进行集成、它们如何支持硬件安全模块和智能卡,以及加密认证如何应用于它们的信息,请查看 RHEL 核心加密组件 红帽知识库文章。
以下 RHEL 10 应用程序使用不符合 FIPS 140-3 的加密:
- Bacula
- 实施 CRAM-MD5 身份验证协议。
- Cyrus SASL
- 使用 SCRAM-SHA-1 身份验证方法。
- Dovecot
- 使用 SCRAM-SHA-1。
- Emacs
- 使用 SCRAM-SHA-1。
- FreeRADIUS
- 使用 MD5 和 SHA-1 进行身份验证协议。
- Ghostscript
- 自定义加密实现(MD5、RC4、SHA-2、AES)来加密和解密文档
- GnuPG
-
软件包使用未验证的
libgcrypt模块。 - GRUB2
-
支持需要 SHA-1 的传统固件协议,并包含
libgcrypt库。 - iPXE
- 实施 TLS 堆栈。
- Kerberos
- 保留对 SHA-1 的支持(与 Windows 互操作性)。
- Lasso
-
lasso_wsse_username_token_derive_key()KDF(key derivation function)使用 SHA-1。 - libgcrypt
- 模块已弃用。从 RHEL 10.0 开始,它不再被验证。
- MariaDB、MariaDB Connector
-
mysql_native_password身份验证插件使用 SHA-1。 - MySQL
-
mysql_native_password使用 SHA-1。 - OpenIPMI
- RAKP-HMAC-MD5 验证方法没有被 FIPS 批准使用,且不适用于 FIPS 模式。
- Ovmf(UEFI 固件)、Edk2、shim
- 完整加密堆栈(OpenSSL 库的一个嵌入式副本)。
- Perl
- 使用 HMAC、HMAC-SHA1、HMAC-MD5、SHA-1 和 SHA-224。
- Pidgin
- 实现 DES 和 RC4 密码。
- Poppler
- 如果原始 PDF 中存在签名、密码和基于不允许算法的加密(例如MD5、RC4和SHA-1),则可以保存带有它们的 PDF 。
- PostgreSQL
- 实现 Blowfish、DES 和 MD5。KDF 使用 SHA-1。
- QAT Engine
- 使用加密原语的硬件和软件实现的组合(RSA、EC、DH、AES 等)。
- Ruby
- 提供不安全的 MD5 和 SHA-1 库函数。
- Samba
- 保留对 RC4 和 DES 的支持(与 Windows 互操作性)。
- Sequoia
- 使用已弃用的 OpenSSL API,它无法在 FIPS 模式下工作。
- Syslinux
- 固件密码使用 SHA-1。
- SWTPM
- 在 OpenSSL 用法中明确禁用 FIPS 模式。
- Unbound
- DNS 规范要求 DNSSEC 解析器使用 DNSKEY 记录中的 SHA-1-based 算法进行验证。
- Valgrind
- AES、SHA 哈希。[1]
- zip
- 自定义加密实现(不安全 PKWARE 加密算法)使用密码加密和解密存档。
第 2 章 使用系统范围的加密策略 复制链接链接已复制到粘贴板!
系统范围的加密策略组件配置核心加密子系统,该子系统涵盖 TLS、IPsec、SSH、DNSSEC 和 Kerberos 协议。作为管理员,您可以选择一个为您的系统提供的加密策略。
2.1. 系统范围的加密策略 复制链接链接已复制到粘贴板!
设置系统范围的策略时,RHEL 中的应用程序会遵守它,并拒绝使用不符合该策略的算法和协议,除非您明确要求应用程序这样做。也就是说,在运行系统提供的配置时,策略适用于应用程序的默认行为,但在需要时您可以覆盖它。
RHEL 10 包含以下预定义的策略:
DEFAULT- 默认的系统范围加密策略级别为当前威胁模型提供了安全设置。它允许 TLS 1.2 和 1.3 协议,以及 IKEv2 和 SSH2 协议。如果 RSA 密钥和 Diffie-Hellman 参数至少是 2048 位,则可以接受它们。使用 RSA 密钥交换的 TLS 密码被拒绝。
LEGACY- 确保与 Red Hat Enterprise Linux 6 及更早版本的最大兼容性;由于攻击面增加而不太安全。CBC-mode 密码可以和 SSH 一起使用。它允许 TLS 1.2 和 1.3 协议,以及 IKEv2 和 SSH2 协议。如果 RSA 密钥和 Diffie-Hellman 参数至少是 2048 位,则可以接受它们。在 TLS 外部允许 SHA-1 签名。使用 RSA 密钥交换的密码被接受。
FUTURE更严格的前瞻性安全级别,旨在测试未来可能的策略。此策略不允许在 DNSSEC 中或作为 HMAC 使用 SHA-1。SHA2-224 和 SHA3-224 哈希被拒绝。禁用 128 位密码。CBC-mode 密码被禁用,除了 Kerberos 中。它允许 TLS 1.2 和 1.3 协议,以及 IKEv2 和 SSH2 协议。如果 RSA 密钥和 Diffie-Hellman 参数至少是 3072 位,则可以接受它们。如果您的系统在公共互联网上进行通信,您可能会遇到互操作性问题。
重要因为客户门户网站 API 中的证书使用的加密密钥不满足
FUTURE系统范围的加密策略的要求,所以redhat-support-tool程序目前无法使用这个策略级别。要临时解决这个问题,在连接到客户门户网站 API 时使用
DEFAULT加密策略。FIPS符合 FIPS 140 要求。FIPS 模式下的 Red Hat Enterprise Linux 系统使用此策略。
注意设置 FIPS 加密策略后,您的系统不符合
FIPS。使 RHEL 系统符合 FIPS 140 标准的唯一正确方法是在 FIPS 模式下安装它。RHEL 还提供
FIPS:OSPP系统范围的子策略,其中包含对通用标准(CC)认证所需的加密算法的进一步限制。设置此子策略后,系统的互操作性会降低。例如,您不能使用比 3072 位少的 RSA 和 DH 密钥、其他 SSH 算法和几个 TLS 组。设置FIPS:OSPP也会阻止连接到 Red Hat Content Delivery Network (CDN)结构。另外,您无法将活动目录(AD)集成到使用FIPS:OSPP的 IdM 部署中,使用FIPS:OSPP和 AD 域的 RHEL 主机之间的通信可能无法工作,或者某些 AD 帐户可能无法进行身份验证。注意
红帽不断调整所有策略级别,以便所有库都提供安全默认值,但使用 LEGACY 策略时除外。虽然 LEGACY 配置文件不提供安全默认值,但它不包括任何易被利用的算法。因此,在 Red Hat Enterprise Linux 生命周期内,任何所提供的策略中启用的算法或可接受的密钥大小可能会发生变化。
此变更反映了新的安全标准和新的安全研究。如果您必须确保在 Red Hat Enterprise Linux 的整个生命周期内与特定系统的互操作性,对于与该系统交互的组件,您应该选择不使用系统范围的加密策略,或使用自定义加密策略重新启用特定的算法。
只有在应用程序支持时,策略级别中描述为允许的具体算法和密码才可用:
LEGACY | DEFAULT | FIPS | FUTURE | |
|---|---|---|---|---|
| IKEv1 | 否 | 否 | 否 | 否 |
| 3DES | 否 | 否 | 否 | 否 |
| RC4 | 否 | 否 | 否 | 否 |
| DH | 最少 2048 位 | 最少 2048 位 | 最少 2048 位 | 最少 3072 位 |
| RSA | 最少 2048 位 | 最少 2048 位 | 最少 2048 位 | 最少 3072 位 |
| DSA | 否 | 否 | 否 | 否 |
| TLS v1.1 和更早版本 | 否 | 否 | 否 | 否 |
| TLS v1.2 及更新版本 | 是 | 是 | 是 | 是 |
| 数字签名和证书中的 SHA-1 | 是[a] | 否 | 否 | 否 |
| CBC 模式密码 | 是 | 否[b] | 否[c] | 否[d] |
| 密钥小于 256 位的对称密码 | 是 | 是 | 是 | 否 |
[a]
SHA-1 签名在 TLS 上下文中被禁用
[b]
SSH 禁用 CBC 密码
[c]
除了 Kerberos 外,所有协议都禁用了 CBC 密码
[d]
除了 Kerberos 外,所有协议都禁用了 CBC 密码
| ||||
您可以在你系统上的 crypto-policies (7) 手册页中找到有关加密策略和涵盖应用程序的更多详情。
2.2. 更改系统范围的加密策略 复制链接链接已复制到粘贴板!
您可以使用 update-crypto-policies 工具更改系统上的系统范围加密策略,并重启系统。您系统上的 update-crypto-policies (8) 手册页提供了所有选项、相应文件和每个应用程序详情的参考。
先决条件
- 您在系统上具有 root 权限。
流程
可选:显示当前的加密策略:
update-crypto-policies --show DEFAULT
$ update-crypto-policies --show DEFAULTCopy to Clipboard Copied! Toggle word wrap Toggle overflow 设置新的加密策略:
update-crypto-policies --set <POLICY> <POLICY>
# update-crypto-policies --set <POLICY> <POLICY>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<POLICY>替换为您要设置的策略或子策略,例如FUTURE、LEGACY或FIPS:OSPP。重启系统:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示当前加密策略:
update-crypto-policies --show <POLICY>
$ update-crypto-policies --show <POLICY>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. 将系统范围的加密策略切换到与早期版本兼容的模式 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 10 中的默认系统范围加密策略不允许使用旧的、不安全协议进行通信。对于需要与 Red Hat Enterprise Linux 6 或更早版本兼容的环境,可以使用不太安全的 LEGACY 策略。
切换到 LEGACY 策略会导致系统和应用程序的安全性较低。
先决条件
-
以
#命令提示符开头的命令需要sudo提供的管理特权或 root 用户访问权限。有关如何配置sudo访问权限的详情,请参考 使非特权用户能够运行某些命令。
流程
要将系统范围的加密策略切换到
LEGACY,请输入:update-crypto-policies --set LEGACY Setting system policy to LEGACY
# update-crypto-policies --set LEGACY Setting system policy to LEGACYCopy to Clipboard Copied! Toggle word wrap Toggle overflow 有关可用的加密策略的列表,请查看您系统上的
update-crypto-policies (8)手册页。要使您的加密设置对已经运行的服务和应用程序有效,请重启系统:
reboot
$ rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
重启后,验证当前策略是否设置为
LEGACY:update-crypto-policies --show LEGACY
$ update-crypto-policies --show LEGACYCopy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
-
有关定义自定义加密策略的信息,请参阅您系统上
update-crypto-policies (8)手册页中的自定义策略部分,以及crypto-policies (7)手册页中的加密策略定义格式部分。
2.4. 在 web 控制台中设置系统范围的加密策略 复制链接链接已复制到粘贴板!
您可以在 RHEL web 控制台界面中直接设置系统范围的加密策略和子策略之一。除了三个预定义的系统范围的加密策略外,您还可以通过图形界面应用 LEGACY 策略和 AD-SUPPORT 子策略的以下组合。LEGACY:AD-SUPPORT 策略是 LEGACY 策略,其具有较低的安全设置,提高了活动目录服务的互操作性。
先决条件
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
以
#命令提示符开头的命令需要sudo提供的管理特权或 root 用户访问权限。有关如何配置sudo访问权限的详情,请参考 使非特权用户能够运行某些命令。
流程
- 登录到 RHEL 10 web 控制台。
在 Overview 页面的 Configuration 卡中,点 Crypto 策略旁的当前策略值。
- 在 Change crypto policy 对话框窗口中,点您要在系统上开始使用的策略。
- 点按钮。
验证
重启后,重新登录到 web 控制台,并检查 Crypto policy 值是否与您选择的策略值对应。
或者,您可以输入
update-crypto-policies --show命令来在终端中显示当前系统范围的加密策略。
2.5. 将应用程序从下列系统范围的加密策略中排除 复制链接链接已复制到粘贴板!
您可以通过在应用程序中直接配置支持的密码套件和协议来自定义应用程序使用的加密设置。
您还可以从 /etc/crypto-policies/back-ends 目录中删除与应用程序相关的符号链接,并使用您自定义的加密设置来替换它。此配置可防止对使用排除后端的应用程序使用系统范围的加密策略。此外,红帽不支持此修改。
2.5.1. 选择不使用系统范围的加密策略的示例 复制链接链接已复制到粘贴板!
- curl
要指定
curl工具使用的密码,请使用--ciphers选项,并提供以冒号分隔的密码列表作为值。例如:curl <https://example.com> --ciphers '@SECLEVEL=0:DES-CBC3-SHA:RSA-DES-CBC3-SHA'
$ curl <https://example.com> --ciphers '@SECLEVEL=0:DES-CBC3-SHA:RSA-DES-CBC3-SHA'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅
curl(1)手册页。- Libreswan
- 如需更多信息,请参阅 保护网络 文档中的 在 Libreswan 中启用旧的密码和算法 部分。
- Mozilla Firefox
-
虽然您无法在 Mozilla Firefox Web 浏览器中选择不使用系统范围的加密策略,但您可以在 Firefox 的配置编辑器中进一步限制支持的密码和 TLS 版本。在地址栏中输入
about:config,并根据需要修改security.tls.version.min选项的值。将security.tls.version.min设置为1,允许将 TLS 1.0 作为最低要求,security.tls.version.min 2启用 TLS 1.1,如此等等。 - OpenSSH 服务器
要为您的 OpenSSH 服务器选择不使用系统范围的加密策略,请在位于
/etc/ssh/sshd_config.d/目录中的置入配置文件中指定加密策略。使用小于 50 的两位数前缀,以使其在字典顺序上位于50-redhat.conf文件和.conf后缀之前,如49-crypto-policy-override.conf。详情请查看
sshd_config(5)手册页。- OpenSSH 客户端
要为您的 OpenSSH 客户端选择不使用系统范围的加密策略,请执行以下任务之一:
-
对于给定的用户,使用
~/.ssh/config文件中特定于用户的配置覆盖全局ssh_config。 -
对于整个系统,在
/etc/ssh/ssh_config.d/目录中的置入配置文件中指定加密策略,具有小于 50 的两位数前缀,以便按字典顺序排列在50-redhat.conf文件之前,并具有.conf后缀,例如49-crypto-policy-override.conf。
详情请查看
ssh_config(5)手册页。-
对于给定的用户,使用
- wget
要自定义
wget网络下载器使用的加密设置,请使用--secure-protocol和--ciphers选项。例如:wget --secure-protocol=TLSv1_1 --ciphers="SECURE128" <https://example.com>
$ wget --secure-protocol=TLSv1_1 --ciphers="SECURE128" <https://example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅
wget(1)手册页中的 HTTPS(SSL/TLS)选项部分。
2.6. 使用子策略自定义系统范围的加密策略 复制链接链接已复制到粘贴板!
您可以调整系统上启用的加密算法或协议集合。您可以在现有系统范围的加密策略之上应用自定义子策略,或者从头开始定义此类策略。
范围策略的概念允许为不同的后端启用不同的算法集合。您可以将每个配置指令限制到特定的协议、库或服务。
另外,您可以在指令中使用通配符字符,例如,使用星号来指定多个值。有关完整的语法参考,请参阅您系统上 update-crypto-policies (8) 手册页中的 自定义策略 部分和 crypto-policies (7) 手册页中的 加密策略定义格式 部分。
-
/etc/crypto-policies/state/CURRENT.pol文件列出了通配符扩展后当前应用了系统范围加密策略中的所有设置。 -
要使您的加密策略更严格,请考虑使用
/usr/share/crypto-policies/policies/FUTURE.pol文件中列出的值。 -
您可以在
/usr/share/crypto-policies/policies/modules/目录中找到示例子策略。
流程
签出到
/etc/crypto-policies/policies/modules/目录:cd /etc/crypto-policies/policies/modules/
# cd /etc/crypto-policies/policies/modules/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为您的调整创建子策略,例如:
touch <MYCRYPTO-1>.pmod touch <SCOPES-AND-WILDCARDS>.pmod
# touch <MYCRYPTO-1>.pmod # touch <SCOPES-AND-WILDCARDS>.pmodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在策略模块的文件名中使用大写字母。
在您选择的文本编辑器中打开策略模块并插入修改系统范围加密策略的选项,例如:
vi <MYCRYPTO-1>.pmod
# vi <MYCRYPTO-1>.pmodCopy to Clipboard Copied! Toggle word wrap Toggle overflow min_rsa_size = 3072 hash = SHA2-384 SHA2-512 SHA3-384 SHA3-512
min_rsa_size = 3072 hash = SHA2-384 SHA2-512 SHA3-384 SHA3-512Copy to Clipboard Copied! Toggle word wrap Toggle overflow vi <SCOPES-AND-WILDCARDS>.pmod
# vi <SCOPES-AND-WILDCARDS>.pmodCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 将更改保存到模块文件中。
将您的策略调整应用到
DEFAULT系统范围加密策略级别:update-crypto-policies --set DEFAULT:<MYCRYPTO-1>:<SCOPES-AND-WILDCARDS>
# update-crypto-policies --set DEFAULT:<MYCRYPTO-1>:<SCOPES-AND-WILDCARDS>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要使您的加密设置对已经运行的服务和应用程序有效,请重启系统:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
/etc/crypto-policies/state/CURRENT.pol文件是否包含您的更改,例如:cat /etc/crypto-policies/state/CURRENT.pol | grep rsa_size min_rsa_size = 3072
$ cat /etc/crypto-policies/state/CURRENT.pol | grep rsa_size min_rsa_size = 3072Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7. 创建并设置自定义系统范围的加密策略 复制链接链接已复制到粘贴板!
对于特定场景,您可以通过创建并使用完整的策略文件来自定义系统范围的加密策略。
步骤
为自定义创建一个策略文件:
cd /etc/crypto-policies/policies/ touch <MYPOLICY>.pol
# cd /etc/crypto-policies/policies/ # touch <MYPOLICY>.polCopy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,从复制四个预定义策略级别中的一个开始:
cp /usr/share/crypto-policies/policies/DEFAULT.pol /etc/crypto-policies/policies/<MYPOLICY>.pol
# cp /usr/share/crypto-policies/policies/DEFAULT.pol /etc/crypto-policies/policies/<MYPOLICY>.polCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在您选择的文本编辑器中编辑带有自定义加密策略的文件以满足您的要求,例如:
vi /etc/crypto-policies/policies/<MYPOLICY>.pol
# vi /etc/crypto-policies/policies/<MYPOLICY>.polCopy to Clipboard Copied! Toggle word wrap Toggle overflow 有关完整的语法参考,请参阅您系统上
update-crypto-policies (8)手册页中的自定义策略部分和crypto-policies (7)手册页中的加密策略定义格式部分。将系统范围的加密策略切换到自定义级别:
update-crypto-policies --set <MYPOLICY>
# update-crypto-policies --set <MYPOLICY>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要使您的加密设置对已经运行的服务和应用程序有效,请重启系统:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8. 在系统范围内启用 post-quantum 算法 复制链接链接已复制到粘贴板!
您可以通过应用 TEST-PQ 子策略来在系统范围内启用 post-quantum 加密(PQC)。根据 FIPS 203 草案,使用 Module-Lattice Based Key-Encapsulation Mechanism (ML-KEM)标准的 post-quantum 密钥交换算法对于 OpenSSL、GnuTLS 和 NSS 中的 TLS 连接和 OpenSSH 中的 SSH 连接可用。
Red Hat Enterprise Linux 10 中的所有 PQC 算法都作为技术预览提供。当后量子密码学退出技术预览状态时,软件包和系统范围加密策略名称可能会改变。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
先决条件
-
crypto-policies-scripts软件包已安装在系统上。
-
以
#命令提示符开头的命令需要sudo提供的管理特权或 root 用户访问权限。有关如何配置sudo访问权限的详情,请参考 使非特权用户能够运行某些命令。
流程
安装
crypto-policies-pq-preview软件包:dnf install -y crypto-policies-pq-preview
# dnf install -y crypto-policies-pq-previewCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在当前系统范围的加密策略之上启用
TEST-PQ加密子策略,例如:update-crypto-policies --show DEFAULT update-crypto-policies --set DEFAULT:TEST-PQ
# update-crypto-policies --show DEFAULT # update-crypto-policies --set DEFAULT:TEST-PQCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要使您的加密设置对已经运行的服务和应用程序有效,请重启系统:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
/etc/crypto-policies/state/CURRENT.pol文件是否包含 PQC,例如:cat /etc/crypto-policies/state/CURRENT.pol | grep MLKEM512 group = MLKEM512 P256-MLKEM512 X25519-MLKEM512 MLKEM768 P384-MLKEM768 X448-MLKEM768 MLKEM768-X25519 X25519-MLKEM768 P256-MLKEM768 MLKEM1024 P521-MLKEM1024 P384-MLKEM1024 X25519 SECP256R1 X448 SECP521R1 SECP384R1 FFDHE-2048 FFDHE-3072 FFDHE-4096 FFDHE-6144 FFDHE-8192
$ cat /etc/crypto-policies/state/CURRENT.pol | grep MLKEM512 group = MLKEM512 P256-MLKEM512 X25519-MLKEM512 MLKEM768 P384-MLKEM768 X448-MLKEM768 MLKEM768-X25519 X25519-MLKEM768 P256-MLKEM768 MLKEM1024 P521-MLKEM1024 P384-MLKEM1024 X25519 SECP256R1 X448 SECP521R1 SECP384R1 FFDHE-2048 FFDHE-3072 FFDHE-4096 FFDHE-6144 FFDHE-8192Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.9. 使用 crypto_policies RHEL 系统角色增强 FUTURE 加密策略的安全性 复制链接链接已复制到粘贴板!
您可以使用 crypto_policies RHEL 系统角色在受管节点上配置 FUTURE 策略。例如,此策略帮助实现:
- 针对新出现的威胁的未来防护
- 预测计算能力的提升。
- 增强的安全性
- 更强大的加密标准需要更长的密钥长度和更安全的算法。
- 遵守高安全标准
- 例如,在医疗保健、电信和金融行业中,数据敏感度很高,并且强大的加密可用性至关重要。
通常,FUTURE 适合处理高度敏感数据的环境,为将来的法规做准备,或采用长期的安全策略。
传统系统和软件不必支持 FUTURE 策略实施的更现代化且更严格的算法和协议。例如,旧的系统可能不支持 TLS 1.3 或更大的密钥大小。这可能导致兼容性问题。
另外,使用强大的算法通常会增加计算工作负载,这可能会对您的系统性能造成负面影响。
先决条件
- 您已准备好控制节点和受管节点。
- 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
crypto_policies_policy: FUTURE-
在受管节点上配置所需的加密策略(
FUTURE)。它可以是基本策略,也可以是带有一些子策略的基本策略。指定的基本策略和子策略必须在受管节点上可用。默认值为null,这意味着配置没有更改,并且crypto_policiesRHEL 系统角色仅收集 Ansible 事实。 crypto_policies_reboot_ok: true-
加密策略更改后导致系统重启,以确保所有服务和应用程序都将读取新的配置文件。默认值为
false。
有关角色变量和加密配置选项的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md文件以及update-crypto-policies (8)和crypto-policies (7)手册页。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在控制节点上,创建另一个 playbook,例如
verify_playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
crypto_policies_active-
导出的 Ansible 事实包含当前活动的
crypto_policies_policy变量可接受的格式的策略名称。
验证 playbook 语法:
ansible-playbook --syntax-check ~/verify_playbook.yml
$ ansible-playbook --syntax-check ~/verify_playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行 playbook:
ansible-playbook ~/verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }$ ansible-playbook ~/verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }Copy to Clipboard Copied! Toggle word wrap Toggle overflow crypto_policies_active变量显示受管节点上活动的策略。
第 3 章 通过 PKCS#11 将应用程序配置为使用加密硬件 复制链接链接已复制到粘贴板!
分离有关专用加密设备的 secret 信息部分,如用于最终用户身份验证的智能卡和加密令牌,以及用于服务器应用程序的硬件安全模块(HSM),提供了额外的安全层。在 Red Hat Enterprise Linux 中,通过 PKCS #11 API 支持加密硬件在不同的应用程序中是一致的,而加密硬件上 secret 的隔离不是一项复杂的任务。
3.1. 通过 PKCS #11 的加密硬件支持 复制链接链接已复制到粘贴板!
公钥加密标准(PKCS)#11为保存加密信息并执行加密功能的加密设备定义一个应用程序编程接口(API)。
PKCS #11 引入了 加密令牌,它是一个以统一的方式向应用程序呈现每个硬件或软件设备的对象。因此,应用程序会查看智能卡等设备,这些设备通常由个人使用,硬件安全模块通常被计算机使用,作为 PKCS #11 加密令牌。
PKCS #11 令牌可以存储各种对象类型,包括证书、数据对象以及公有、私有或机密密钥。这些对象可通过 PKCS #11 统一资源标识符(URI)方案来唯一识别。
PKCS #11 URI 是一种标准方法,其根据对象属性来识别 PKCS #11 模块中的特定对象。这可让您以 URI 格式,使用同样的配置字符串来配置所有的库和应用程序。
RHEL 默认为智能卡提供 OpenSC PKCS #11 驱动程序。但是,硬件令牌和 HSM 可以有自己的 PKCS #11 模块,这些模块在系统中没有对应项。您可以使用 p11-kit 工具注册这样的 PKCS #11 模块,它作为系统中注册的智能卡驱动程序的包装器。
要使您自己的 PKCS #11 模块在系统上正常工作,请在 /etc/pkcs11/modules/ 目录中添加一个新的文本文件
您可以通过在 /etc/pkcs11/modules/ 目录中创建一个新的文本文件,来将自己的 PKCS #11 模块添加到系统。例如,p11-kit 中的 OpenSC 配置文件如下所示:
cat /usr/share/p11-kit/modules/opensc.module module: opensc-pkcs11.so
$ cat /usr/share/p11-kit/modules/opensc.module
module: opensc-pkcs11.so
3.2. 通过保存在智能卡上的 SSH 密钥进行身份验证 复制链接链接已复制到粘贴板!
您可以在智能卡上创建并存储 ECDSA 和 RSA 密钥,并通过 OpenSSH 客户端上的智能卡进行身份验证。智能卡验证替换了默认密码验证。
先决条件
-
在客户端中安装了
opensc软件包,pcscd服务正在运行。
流程
列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到
key.pub文件:ssh-keygen -D pkcs11: > keys.pub
$ ssh-keygen -D pkcs11: > keys.pubCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将公钥传送到远程服务器。使用
ssh-copy-id命令和上一步中创建的keys.pub文件:ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
$ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 ECDSA 密钥连接到
<ssh-server-example.com>。您可以只使用 URI 的子集,它唯一引用您的密钥,例如:ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow 因为 OpenSSH 使用
p11-kit-proxy包装器,且 OpenSC PKCS #11 模块已注册到p11-kit工具,因此您可以简化上一个命令:ssh -i "pkcs11:id=%01" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
$ ssh -i "pkcs11:id=%01" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您跳过 PKCS #11 URI 的
id=部分,则 OpenSSH 会加载代理模块中可用的所有密钥。这可减少输入所需的数量:ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
$ ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:您可以在
~/.ssh/config文件中使用同样的 URI 字符串来使配置持久:cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow ssh客户端工具现在自动使用此 URI 和智能卡中的密钥。
3.3. 配置应用程序以使用智能卡上的证书进行身份验证 复制链接链接已复制到粘贴板!
在应用程序中使用智能卡进行身份验证可能会提高安全性,并简化自动化。您可以使用以下方法将公钥加密标准(PKCS) #11 URIs 集成到应用程序中:
-
Firefoxweb 浏览器会自动加载p11-kit-proxyPKCS #11 模块。这意味着系统中的每个支持的智能卡都会被自动检测到。对于使用 TLS 客户端身份验证,不需要额外的设置,在服务器请求它们时会自动使用智能卡中的密钥和证书。 -
如果您的应用程序使用
GnuTLS或NSS库,则它已经支持 PKCS #11 URI。另外,依赖OpenSSL库的应用程序可以通过pkcs11-provider软件包安装的 PKCS #11 提供者访问加密硬件模块,包括智能卡。 -
需要使用智能卡上的私钥且不使用
NSS、GnuTLS或OpenSSL的应用程序可以直接使用p11-kitAPI 来使用加密硬件模块,包括智能卡,而不是使用特定 PKCS #11 模块的 PKCS #11 API。 使用
wget网络下载程序,您可以指定 PKCS #11 URI ,而不是本地存储的私钥和证书的路径。这可能会简化为需要安全存储私钥和证书的任务创建脚本。例如:wget --private-key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --certificate 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
$ wget --private-key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --certificate 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在使用
curl工具时,您也可以指定 PKCS #11 URI:curl --key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --cert 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
$ curl --key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --cert 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意由于 PIN 是一种安全措施,它控制对保存在智能卡中的密钥的访问,而配置文件中包含纯文本形式的 PIN,因此请考虑采取额外的保护来防止攻击者读取 PIN。例如,您可以使用
pin-source属性,并提供file:URI 来从文件读取 PIN。如需更多信息,请参阅 RFC 7512: PKCS #11 URI 模式查询属性语义。请注意,不支持将命令路径用作pin-source属性的值。
3.4. 在 Apache 中使用 HSM 保护私钥 复制链接链接已复制到粘贴板!
Apache HTTP 服务器可以使用存储在硬件安全模块(HSM)上的私钥,这有助于防止密钥泄漏和中间人攻击。请注意,对于繁忙的服务器,这通常需要高性能的 HSM 。
对于 HTTPS 协议形式的安全通信,Apache HTTP 服务器(httpd)使用 OpenSSL 库。OpenSSL 本身不支持 PKCS #11 。要使用 HSM,您必须安装 pkcs11-provider 软件包,该软件包提供对 PKCS #11 模块的访问。您可以使用 PKCS #11 URI 而不是常规文件名在 /etc/httpd/conf.d/ssl.conf 配置文件中指定服务器密钥和证书,例如:
SSLCertificateFile "pkcs11:id=%01;token=softhsm;type=cert" SSLCertificateKeyFile "pkcs11:id=%01;token=softhsm;type=private?pin-value=111111"
SSLCertificateFile "pkcs11:id=%01;token=softhsm;type=cert"
SSLCertificateKeyFile "pkcs11:id=%01;token=softhsm;type=private?pin-value=111111"
安装 httpd-manual 软件包以获取 Apache HTTP 服务器的完整文档,包括 TLS 配置。/etc/httpd/conf.d/ssl.conf 配置文件中的指令在 /usr/share/httpd/manual/mod_ssl.html 文件中进行了详细的描述。
第 4 章 使用 polkit 控制对智能卡的访问 复制链接链接已复制到粘贴板!
为了涵盖智能卡中内置的机制(如 PIN、PIN pad 和生物识别技术)无法阻止的可能的威胁,Red Hat Enterprise Linux 使用 polkit 框架来控制对智能卡的访问控制。
系统管理员配置 polkit 以适合特定的场景,如非特权或非本地用户或服务的智能卡访问。
4.1. 通过 polkit 的智能卡访问控制 复制链接链接已复制到粘贴板!
个人计算机/智能卡(PC/SC)协议指定将智能卡及其读卡器整合成计算系统的标准。在 RHEL 中,pcc-lite 软件包提供了中间件来访问使用 PC/SC API 的智能卡。这个软件包的一部分 pcscd (PC/SC 智能卡)守护进程确保系统可以使用 PC/SC 协议访问智能卡。
因为在智能卡内置的访问控制机制(如 PIN、PIN 平板 和生物识别技术)没有涵盖所有可能的威胁,所以 RHEL 使用 polkit 框架进行更强大的访问控制。polkit 授权管理器可以对特权操作授予访问权限。除了授予对磁盘的访问权限外,您还可以使用 polkit 来指定保护智能卡的策略。例如,您可以定义哪些用户可以使用智能卡执行哪些操作。
安装 pcsc-lite 软件包并启动 pcscd 守护进程后,系统会强制使用 /usr/share/polkit-1/actions/ 目录中定义的策略。默认的系统范围的策略位于 /usr/share/polkit-1/actions/org.debian.pcsc-lite.policy 文件中。polkit 策略文件使用 XML 格式,其语法在 polkit(8) 手册页中进行了描述。
polkitd 服务监控 /etc/polkit-1/rules.d/ 和 /usr/share/polkit-1/rules.d/ 这些目录中存储的规则文件的任何更改。该文件包含 JavaScript 格式的授权规则。系统管理员可以在这两个目录中添加自定义规则文件,并且 polkitd 根据其文件名按照字母顺序读取它们。如果两个文件具有相同的名称,则首先读取 /etc/polkit-1/rules.d/ 中的文件。
4.3. 向 PC/SC 显示关于 polkit 授权的更多详细信息 复制链接链接已复制到粘贴板!
在默认配置中,polkit 授权框架仅将有限的信息发送到 Journal 日志。您可以通过添加新的规则来扩展与 PC/SC 协议相关的 polkit 日志条目。
先决条件
-
您已在系统上安装了
pcsc-lite软件包。 -
pcscd守护进程正在运行。
步骤
在
/etc/polkit-1/rules.d/目录中创建一个新文件:touch /etc/polkit-1/rules.d/00-test.rules
# touch /etc/polkit-1/rules.d/00-test.rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在您选择的编辑器中编辑该文件,例如:
vi /etc/polkit-1/rules.d/00-test.rules
# vi /etc/polkit-1/rules.d/00-test.rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 插入以下行:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保存文件并退出编辑器。
重启
pcscd和polkit服务:systemctl restart pcscd.service pcscd.socket polkit.service
# systemctl restart pcscd.service pcscd.socket polkit.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
为
pcscd发出一个授权请求。例如,打开 Firefox Web 浏览器,或者使用opensc软件包提供的pkcs11-tool -L命令。 显示扩展的日志条目,例如:
journalctl -u polkit --since "1 hour ago" polkitd[1224]: <no filename>:4: action=[Action id='org.debian.pcsc-lite.access_pcsc'] polkitd[1224]: <no filename>:5: subject=[Subject pid=2020481 user=user' groups=user,wheel,mock,wireshark seat=null session=null local=true active=true]
# journalctl -u polkit --since "1 hour ago" polkitd[1224]: <no filename>:4: action=[Action id='org.debian.pcsc-lite.access_pcsc'] polkitd[1224]: <no filename>:5: subject=[Subject pid=2020481 user=user' groups=user,wheel,mock,wireshark seat=null session=null local=true active=true]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 5 章 扫描系统以检查配置是否合规 复制链接链接已复制到粘贴板!
合规审计是一个确定给定对象是否遵循合规策略中指定的所有规则的流程。合规策略由安全专业人员定义的,他们通常以检查清单的形式指定计算环境应使用的必要设置。
跨组织甚至同一组织内不同系统之间的合规政策可能有很大差异。这些政策之间的差异取决于每个系统的用途及其对组织的重要性。自定义软件设置和部署特征也需要自定义策略检查表。
5.1. RHEL 中的配置合规工具 复制链接链接已复制到粘贴板!
您可以使用以下配置合规工具在 Red Hat Enterprise Linux 中执行完全自动化的合规审计。这些工具基于安全内容自动化协议(SCAP)标准,专为自动定制合规策略而设计。
- OpenSCAP
带有
oscap命令行工具的OpenSCAP库旨在对本地系统执行配置和漏洞扫描,以验证配置合规内容,并根据这些扫描和评估生成报告和指南。重要在使用 OpenSCAP 时可能会遇到内存消耗问题,这可能会导致程序过早停止,并阻止生成任何结果文件。详情请查看 OpenSCAP 内存消耗问题 知识库文章。
- SCAP 安全指南(SSG)
-
scap-security-guide软件包为 Linux 系统提供安全策略的集合。该指南包括一个实用强化建议目录,在适用的情况下与政府的要求相关联。该项目弥补了一般性政策要求和具体实施指南间的差距。 - 脚本检查引擎(SCE)
-
通过 SCE(即 SCAP 协议的扩展),管理员可以使用脚本语言(如 Bash、Python 和 Ruby)编写其安全内容。SCE 扩展在
openscap-engine-sce软件包中提供。SCE 本身不是 SCAP 标准的一部分。
要在多个系统上远程执行自动合规审计,您可以使用 Red Hat Satellite 的 OpenSCAP 解决方案。
5.2. 配置合规性扫描 复制链接链接已复制到粘贴板!
5.2.1. RHEL 中的配置合规性 复制链接链接已复制到粘贴板!
您可以使用配置合规性扫描来遵循特定组织定义的基准。例如,如果您是支付处理商,您可能需要使您的系统与支付卡行业数据安全标准(PCI-DSS)保持一致。您还可以执行配置合规性扫描来强化您的系统安全。
红帽建议您遵循 SCAP 安全指南软件包中提供的安全内容自动化协议(SCAP)的内容,因为它符合红帽针对受影响组件的最佳实践。
SCAP 安全指南软件包提供了符合 SCAP 1.2 和 SCAP 1.3 标准的内容。openscap 扫描器实用程序与SCAP安全指南包中提供的SCAP 1.2和SCAP 1.3内容兼容。
执行配置合规性扫描不能保证系统是合规的。
SCAP 安全指南套件以数据流文档的形式为多个平台提供配置文件。数据流是包含定义、基准、配置文件和单个规则的文件。每条规则都规定了合规的适用性和要求。RHEL 提供多个配置文件来遵守安全策略。除了行业标准之外,红帽数据流还包含用于修复失败规则的信息。
合规性扫描资源的结构
配置文件是一组基于安全策略的规则,如 PCI-DSS 和健康保险可移植性和责任法案(HIPAA)。这可让您以自动化的方式审核系统,以符合安全标准。
您可以修改(定制)配置文件来自定义某些规则,例如密码长度。
有关配置文件定制的更多信息,请参阅 使用 autotailor 自定义安全配置文件。
5.2.2. OpenSCAP 扫描的可能结果 复制链接链接已复制到粘贴板!
根据应用到 OpenSCAP 扫描的数据流和配置文件,以及系统的各种属性,每个规则可能会产生一个特定的结果。以下是可能的结果,并有其含义的简要解释:
- Pass
- 扫描没有发现与此规则有任何冲突。
- Fail
- 扫描发现与此规则有冲突。
- Not checked
- OpenSCAP 对此规则不执行自动评估。手动检查您的系统是否符合此规则。
- Not applicable
- 此规则不适用于当前配置。
- Not selected
- 此规则不是配置文件的一部分。OpenSCAP 不评估此规则,也不会在结果中显示这些规则。
- Error
-
扫描遇到了错误。要获得更多信息,您可以输入带有
--verbose DEVEL选项的oscap命令。在 红帽客户门户网站 中提交一个支持问题单,或在 Red Hat Jira 的 RHEL 项目 中开一个问题单。 - Unknown
-
扫描遇到了意外情况。要获得更多信息,您可以输入带有
--verbose DEVEL选项的oscap命令。在 红帽客户门户网站 中提交一个支持问题单,或在 Red Hat Jira 的 RHEL 项目 中开一个问题单。
5.2.3. 查看配置文件是否符合配置合规 复制链接链接已复制到粘贴板!
在决定使用配置文件进行扫描或补救前,您可以使用 oscap info 子命令列出它们并检查其详细描述。
先决条件
-
openscap-scanner和scap-security-guide软件包已安装。
流程
列出 SCAP 安全指南项目所提供的带有安全合规配置文件的所有可用文件:
ls /usr/share/xml/scap/ssg/content/ ssg-rhel10-ds.xml
$ ls /usr/share/xml/scap/ssg/content/ ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
oscap info子命令显示有关所选数据流的详细信息。包含数据流的 XML 文件由其名称中的-ds字符串表示。在Profiles部分,您可以找到可用的配置文件及其 ID 列表:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从数据流文件中选择一个配置文件,并显示所选配置文件的更多详情。为此,可使用带有
--profile选项的oscap info,后跟上一命令输出中显示的 ID 的最后一部分。例如,HIPPA 配置文件的 ID 是xccdf_org.ssgproject.content_profile_hipaa,--profile选项的值是hipaa:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.2.4. 评估配置是否符合特定基准 复制链接链接已复制到粘贴板!
您可以确定您的系统或远程系统是否符合特定的基准,并使用 oscap 命令行工具将结果保存到报告中。
先决条件
-
openscap-scanner和scap-security-guide软件包已安装。 - 您知道系统应遵守的基准中的配置文件的 ID。要查找 ID,请参阅 查看配置合规性的配置文件 部分。
步骤
扫描本地系统是否符合所选的配置文件,并将扫描结果保存到一个文件中:
oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 替换:
-
使用
oscap保存扫描结果的文件名替换<scan_report.html>。 -
使用系统应该遵守的配置文件 ID,例如
hipaa,替换<profile_ID>。
-
使用
可选:扫描远程系统以确定是否符合所选的配置文件,并将扫描结果保存到一个文件中:
oscap-ssh <username>@<hostname> <port> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap-ssh <username>@<hostname> <port> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 替换:
-
使用远程系统的用户名和主机名替换
<username>@<hostname>。 -
使用您可以通过其访问远程系统的端口号替换
<port>。 -
使用
oscap保存扫描结果的文件名替换<scan_report.html>。 -
使用系统应该遵守的配置文件 ID,例如
hipaa,替换<profile_ID>。
-
使用远程系统的用户名和主机名替换
5.2.5. 使用特定基准评估容器或容器镜像的安全性合规 复制链接链接已复制到粘贴板!
您可以使用特定的安全基准,如支付卡行业数据安全标准(PCI-DSS)和健康保险可移植性和责任法案(HIPAA)评估容器或容器镜像的合规性。
先决条件
-
openscap-utils和scap-security-guide软件包已安装。 - 有对系统的 root 访问权限。
流程
查找容器或容器镜像的 ID:
-
要查找容器的 ID,请输入
podman ps -a命令。 -
要查找容器镜像的 ID,请输入
podman images命令。
-
要查找容器的 ID,请输入
评估容器或容器镜像是否符合配置文件,并将扫描结果保存到一个文件中:
oscap-podman <ID> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap-podman <ID> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 替换:
-
使用容器或容器镜像的 ID 替换
<ID> -
使用
oscap保存扫描结果的文件名替换<scan_report.html> -
使用系统应该遵守的配置文件 ID,例如
hipaa或pci-dss替换<profile_ID>
-
使用容器或容器镜像的 ID 替换
验证
在您选择的浏览器中检查结果,例如:
firefox <scan_report.html> &
$ firefox <scan_report.html> &Copy to Clipboard Copied! Toggle word wrap Toggle overflow
标记为 notapplicable 的规则仅适用于裸机和虚拟化系统,不适用于容器或容器镜像。
5.3. 配置合规补救 复制链接链接已复制到粘贴板!
要自动使您的系统与特定配置文件保持一致,您可以执行补救。您可以修复系统,使其与 SCAP 安全指南提供的任何配置文件保持一致。
5.3.1. 修复系统,使其与特定基准一致 复制链接链接已复制到粘贴板!
您可以修正 RHEL 系统,使其与特定基准一致。您可以修复系统,使其与 SCAP 安全指南提供的任何配置文件保持一致。
有关列出可用的配置文件的详情,请查看 查看配置文件的配置合规性 部分。
如果不小心使用,在启用了 Remediate 选项的情况下运行系统评估可能会导致系统无法正常工作。红帽不提供任何自动的方法来恢复由安全强制补救所做的更改。默认配置的 RHEL 系统支持自动安全补救功能。如果在安装后更改了您的系统,运行补救可能无法使其与所需安全配置兼容。
先决条件
-
scap-security-guide软件包已安装。
步骤
使用
oscap命令和--remediate选项修复系统:oscap xccdf eval --profile <profile_ID> --remediate /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --remediate /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用系统应该遵守的配置文件 ID,例如
hipaa替换<profile_ID>。- 重启您的系统。
验证
使用配置文件评估系统合规性,并将扫描结果保存到一个文件中:
oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 替换:
-
使用
oscap保存扫描结果的文件名替换<scan_report.html>。 -
使用系统应该遵守的配置文件 ID,例如
hipaa,替换<profile_ID>。
-
使用
5.3.2. 使用 SSG Ansible Playbook 修复系统,使其与特定的基准保持一致 复制链接链接已复制到粘贴板!
您可以使用 SCAP 安全指南项目中的 Ansible Playbook 文件修复您的系统,使其与特定的基准保持一致。您可以进行修复,以与 SCAP 安全指南提供的任何配置文件保持一致。
如果不小心使用,在启用了 Remediate 选项的情况下运行系统评估可能会导致系统无法正常工作。红帽不提供任何自动的方法来恢复由安全强制补救所做的更改。默认配置的 RHEL 系统支持自动安全补救功能。如果在安装后更改了您的系统,运行补救可能无法使其与所需安全配置兼容。
先决条件
-
scap-security-guide软件包已安装。 -
ansible-core软件包已安装。如需更多信息,请参阅 Ansible 安装指南。 -
rhc-worker-playbook软件包已安装。 - 您知道您要修复系统的配置文件的 ID。详情请参阅 查看配置文件的配置合规性。
流程
使用 Ansible 修复您的系统,使其与所选的配置文件保持一致:
ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local /usr/share/scap-security-guide/ansible/rhel10-playbook-<profile_ID>.yml
# ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local /usr/share/scap-security-guide/ansible/rhel10-playbook-<profile_ID>.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow ANSIBLE_COLLECTIONS_PATH环境变量对于运行 playbook 的命令是必需的。将
<profile_ID>替换为所选的配置文件的配置文件 ID。- 重新启动系统。
验证
使用所选配置集评估系统的合规性,并将扫描结果保存到一个文件中:
oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<scan_report.html>替换为oscap保存扫描结果的文件名。
5.3.3. 创建一个修复 Ansible Playbook,以使系统与特定的基准保持一致 复制链接链接已复制到粘贴板!
您可以创建一个 Ansible Playbook,它只包含使您的系统与特定基准保持一致所需的补救。此 playbook 很小,因为它没有涵盖已满足的要求。创建 playbook 不会以任何方式修改您的系统,您只需为后续应用程序准备一个文件。
先决条件
-
scap-security-guide软件包已安装。 -
ansible-core软件包已安装。如需更多信息,请参阅 Ansible 安装指南。 -
rhc-worker-playbook软件包已安装。 - 您知道您要修复系统的配置文件的 ID。详情请参阅 查看配置文件的配置合规性。
流程
扫描系统并保存结果:
oscap xccdf eval --profile <profile_ID> --results <profile_results.xml> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --results <profile_results.xml> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在带有结果的文件中找到结果 ID 的值:
oscap info <profile_results.xml>
# oscap info <profile_results.xml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据第 1 步中生成的文件生成一个 Ansible Playbook:
oscap xccdf generate fix --fix-type ansible --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject.content_profile_<profile_ID> --output <profile_remediations.yml> <profile_results.xml>
# oscap xccdf generate fix --fix-type ansible --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject.content_profile_<profile_ID> --output <profile_remediations.yml> <profile_results.xml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
检查生成的
<profile_remediations.yml>文件是否包含在第 1 步中执行的扫描中失败的规则的 Ansible 修复。 使用 Ansible 修复您的系统,使其与所选的配置文件保持一致:
ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local <profile_remediations.yml>`
# ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local <profile_remediations.yml>`Copy to Clipboard Copied! Toggle word wrap Toggle overflow ANSIBLE_COLLECTIONS_PATH环境变量对于运行 playbook 的命令是必需的。警告如果不小心使用,在启用了
Remediate选项的情况下运行系统评估可能会导致系统无法正常工作。红帽不提供任何自动的方法来恢复由安全强制补救所做的更改。默认配置的 RHEL 系统支持自动安全补救功能。如果在安装后更改了您的系统,运行修复可能无法使其遵守所需的安全配置文件。
验证
使用所选配置集评估系统的合规性,并将扫描结果保存到一个文件中:
oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<scan_report.html>替换为oscap保存扫描结果的文件名。
5.4. 使用 Kickstart 执行 RHEL 的强化安装 复制链接链接已复制到粘贴板!
如果您需要您的系统符合特定的安全配置文件,如 DISA STIG、CIS 或 ANSSI,您可以准备一个定义了强化配置的 Kickstart 文件,使用定制文件自定义配置,并启动强化系统的自动安装。
先决条件
-
openscap-scanner已安装在您的系统上。 scap-security-guide软件包已安装在您的系统上,软件包版本与您要安装的 RHEL 版本相对应。如需更多信息,请参阅 RHEL 中支持的 SCAP 安全指南的版本。使用不同的版本可能会导致冲突。注意如果您的系统的 RHEL 版本有与您要安装的版本相同,则您可以直接安装
scap-security-guide软件包。
流程
从数据流文件中找到安全配置文件的 ID:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:如果要使用 XCCDF 定制文件自定义强化,您可以使用
openscap-utils软件包提供的autotailor命令。如需更多信息,请参阅 使用 autotailor 自定义安全配置文件。 从 SCAP 源数据流生成 kickstart 文件:
oscap xccdf generate fix --profile <profile_ID> --output <kickstart_file>.cfg --fix-type kickstart /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap xccdf generate fix --profile <profile_ID> --output <kickstart_file>.cfg --fix-type kickstart /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用定制文件,请使用
--tailoring-file tailoring.xml选项和自定义配置文件 ID 将定制文件嵌入到生成的 kickstart 文件中,例如:oscap xccdf generate fix --tailoring-file tailoring.xml --profile <custom_profile_ID> --output <kickstart_file>.cfg --fix-type kickstart ./ssg-rhel10-ds.xml
$ oscap xccdf generate fix --tailoring-file tailoring.xml --profile <custom_profile_ID> --output <kickstart_file>.cfg --fix-type kickstart ./ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 进行检查,如果需要,手动修改生成的
<kickstart_file>.cfg,以适应您的部署需求。按照文件中的注释中的说明进行操作。注意有些更改可能会影响 kickstart 文件安装的系统的合规性。例如,一些安全策略需要定义的分区或特定的软件包和服务。
- 使用 kickstart 文件进行安装。要让安装程序使用 kickstart,可以通过 PXE 中提供的 Web 服务器,或嵌入到 ISO 镜像中来提供 kickstart。具体步骤请查看自动安装 RHEL 文档中的 完全和半自动化安装 RHEL 章节。
-
安装完成后,系统会自动重启。重启后,登录并查看保存在
/root目录中的安装 SCAP 报告。
验证
扫描系统的合规性,并将报告保存到 HTML 文件中以便查看:
使用原始配置文件:
oscap xccdf eval --report report.html --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --report report.html --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用定制配置文件:
oscap xccdf eval --report report.html --tailoring-file tailoring.xml --profile <custom_profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --report report.html --tailoring-file tailoring.xml --profile <custom_profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.5. 使用 autotailor 自定义安全配置文件 复制链接链接已复制到粘贴板!
您可以自定义安全配置文件,来更好地对其进行调整,以满足您的特定需求,例如,实施一个与官方配置文件不同的内部策略。在自定义配置文件时,您可以选择额外的规则,删除不同覆盖的规则,以及更改某些规则的参数,如最小密码长度。在自定义配置文件时,您无法定义新规则。
通过使用 autotailor 工具,您可以创建一个包含原始配置文件的所有修改的 XCCDF 定制文件。然后,当您根据 SCAP 配置集扫描、修复或安装系统时,您可以将此定制文件传递给 oscap 命令行工具。
先决条件
-
openscap-utils软件包已安装在您的系统上。 - 您知道您要自定义的基准中的配置文件的 ID。要查找 ID,请参阅 查看配置合规性的配置文件 部分。
流程
使用
autotailor命令为配置文件创建一个定制文件,例如:autotailor \ --select=<rule_ID_1> \ --select=<rule_ID_2> \ --unselect=<rule_ID_3> \ --var-value=<value_ID_1>=<value_1> \ --var-value=<value_ID_2>=<value_2> \ --output=<tailoring.xml> \ --tailored-profile-id=<custom_profile_ID> \ /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml <profile_ID>
$ autotailor \ --select=<rule_ID_1> \ --select=<rule_ID_2> \ --unselect=<rule_ID_3> \ --var-value=<value_ID_1>=<value_1> \ --var-value=<value_ID_2>=<value_2> \ --output=<tailoring.xml> \ --tailored-profile-id=<custom_profile_ID> \ /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml <profile_ID>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<customization_options>是配置文件的修改。使用以下选项之一:--select=<rule_ID>- 将现有规则添加到配置文件中。
--unselect=<rule_ID>- 从配置文件中删除规则。
--var-value=<value_ID>=<value>-
覆盖预设置的值。例如,要将
var_sshd_max_sessions设置为10,请使用--var-value=var_sshd_max_sessions=10。
-
<tailoring.xml>是autotailor保存定制的文件名。 -
<custom_profile_ID>是autotailor在其中保存自定义的配置文件 ID,如custom_cis。 -
<profile_ID>是系统应该遵守的配置文件 ID,例如cis。
注意对于所有配置文件、规则和变量 XCCDF ID,您可以使用完整的命名空间标识符或
autotailor自动使用命名空间前缀进行扩展的短 ID 。例如,cis等同于xccdf_org.ssgproject.content_profile_cis。您可以使用
--id-namespace选项覆盖默认命名空间org.ssgproject.content。可选:根据以 JSON Tailoring 格式定义的自定义创建一个定制文件:
autotailor --output=<tailoring.xml> --json-tailoring=<json_tailoring.json>
$ autotailor --output=<tailoring.xml> --json-tailoring=<json_tailoring.json>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 替换:
-
使用带有 JSON Tailoring 定义的文件名替换
<json_tailoring.json>。
注意您可以将
--json-tailoring与--select,--unselect和--var-value命令行自定义混在一起。在这种情况下,命令行自定义的优先级高于 JSON Tailoring。-
使用带有 JSON Tailoring 定义的文件名替换
5.6. RHEL 10 中支持的 SCAP 安全指南配置文件 复制链接链接已复制到粘贴板!
只使用 RHEL 的特定次要版本中提供的 SCAP 内容。这是因为,参与强化的组件有时会使用新功能进行更新。SCAP 内容更改以反映这些更新,但它并不总是与早期的版本兼容。
您可以使用 oscap info 命令获取系统上安装的 scap-security-guide RPM 版本的相关信息。如需更多信息,请参阅 查看配置文件的配置合规性。
| 配置文件名称 | 配置文件 ID | 策略版本 |
|---|---|---|
| French National Agency for the Security of Information Systems (ANSSI) BP-028 Enhanced Level |
| 2.0 |
| French National Agency for the Security of Information Systems (ANSSI) BP-028 High Level |
| 2.0 |
| French National Agency for the Security of Information Systems (ANSSI) BP-028 Intermediary Level |
| 2.0 |
| French National Agency for the Security of Information Systems (ANSSI) BP-028 Minimal Level |
| 2.0 |
| [DRAFT] CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server |
| DRAFT |
| [DRAFT] CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server |
| DRAFT |
| [DRAFT] CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Workstation |
| DRAFT |
| [DRAFT] CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Workstation |
| DRAFT |
| Australian Cyber Security Centre (ACSC) Essential Eight |
| 未版本化 |
| Health Insurance Portability and Accountability Act (HIPAA) |
| 未版本化 |
| Australian Cyber Security Centre (ACSC) ISM Official - Base |
| 未版本化 |
| Australian Cyber Security Centre (ACSC) ISM Official - Secret |
| 未版本化 |
| Australian Cyber Security Centre (ACSC) ISM Official - Top Secret |
| 未版本化 |
| PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 9 |
| 4.0 |
| The Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) for Red Hat Enterprise Linux 10 |
| vendor |
| The Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) with GUI for Red Hat Enterprise Linux 10 |
| vendor |
第 6 章 使用 Keylime 确保系统完整性 复制链接链接已复制到粘贴板!
借助 Keylime,您可以持续监控远程系统的完整性,并在引导时验证系统状态。您还可以将加密文件发送到被监控的系统,并指定监控系统失败时触发的自动化操作。
6.1. Keylime 的工作原理 复制链接链接已复制到粘贴板!
您可以配置 Keylime 代理来执行以下一个或多个操作:
- 运行时完整性监控
- Keylime 运行时完整性监控会持续监控在其上部署了代理的系统,并测量包含在 allowlist 中但不包含在 excludelist 中的文件的完整性。
- 测量的引导
- Keylime 测量的引导会验证引导时的系统状态。
Keylime 的信任概念基于受信任的平台模块 (TPM) 技术。TPM 是一个带有集成加密密钥的硬件、固件或虚拟组件。通过轮询 TPM 参考并比较对象的哈希,Keylime 提供远程系统的初始和运行时监控。
运行在虚拟机或使用虚拟 TPM 运行的 Keylime 取决于底层主机的完整性。在依赖虚拟环境中的 Keylime 测量前,请确保信任主机环境。
Keylime 由三个主要组件组成:
- 验证器
-
初始并持续验证运行代理的系统的完整性。您可以作为容器,或使用
keylime_serverRHEL 系统角色,从软件包部署验证器。 - 注册器
-
包含所有代理的数据库,它托管 TPM 供应商的公钥。您可以作为容器或使用
keylime_serverRHEL 系统角色,从软件包部署注册器。 - Agent
- 部署到由验证器测量的远程系统。
此外,Keylime 将 keylime_tenant 实用程序用于许多功能,包括在目标系统上调配代理。
图 6.1. 通过配置进行主精简组件之间的连接
Keylime 通过使用组件与租户之间交换的密钥和证书,确保监控系统的完整性。对于此链的安全基础,请使用您可以信任的证书颁发机构(CA)。
如果代理没有接收密钥和证书,它会生成一个密钥以及一个自签名证书,而无需 CA。
图 6.2. 关键精简组件证书和密钥之间的连接
6.2. 从软件包部署 Keylime 验证器 复制链接链接已复制到粘贴板!
验证器是 Keylime 中最重要的组件。它执行系统完整性的初始和定期检查,并支持使用代理安全地引导加密密钥。验证器对其控制接口使用双向 TLS 加密。
要维护信任链,请保持运行验证器的系统的安全,并在您的控制之下。
您可以根据您的要求,在单独的系统或作为 Keylime 注册器的同一系统上安装验证器。在单独的系统上运行验证器和注册器可提供更好的性能。
要将配置文件保留在置入目录中,请使用具有两位数字前缀的文件名,例如 /etc/keylime/verifier.conf.d/00-verifier-ip.conf。配置处理以字典顺序读取置入目录中的文件,并对每个选项设置为它读取的最后一个值。
先决条件
-
您在要安装 Keylime 组件的系统上有
root权限和网络连接。 - 您有来自您的证书颁发机构的有效密钥和证书。
可选:您可以访问 Keylime 从验证器保存数据的数据库。您可以使用以下数据库管理系统:
- SQLite (默认)
- PostgreSQL
- MySQL
- MariaDB
流程
安装 Keylime 验证器:
dnf install keylime-verifier
# dnf install keylime-verifierCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在
/etc/keylime/verifier.conf.d/目录中创建一个新的.conf文件来定义验证器的 IP 地址和端口,例如:/etc/keylime/verifier.conf.d/00-verifier-ip.conf,其内容如下:[verifier] ip = <verifier_IP_address>
[verifier] ip = <verifier_IP_address>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<verifier_IP_address>替换为验证器的 IP 地址。或者,使用ip = *或ip = 0.0.0.0将验证器绑定到所有可用 IP 地址。 -
另外,您还可以使用
port选项更改验证器的端口默认值8881。
-
将
可选:为代理列表配置验证器的数据库。默认配置使用验证器的
/var/lib/keylime/cv_data.sqlite/目录中的 SQLite 数据库。您可以通过在/etc/keylime/verifier.conf.d/目录中创建一个新的.conf文件来定义一个不同的数据库,例如:/etc/keylime/verifier.conf.d/00-db-url.conf,其内容如下:[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>替换为数据库的 URL,如postgresql://verifier:UQ?nRNY9g7GZzN7@198.51.100.1/verifierdb。确保您使用的凭证为 Keylime 提供了权限,来创建数据库结构。
将证书和密钥添加到验证器(verifier)中。您可以让 Keylime 生成它们,或使用现有的密钥和证书生成它们:
-
使用默认
tls_dir = generate选项,Keylime 在/var/lib/keylime/cv_ca/目录中为验证器、注册器和租户生成新证书。 要在配置中加载现有的密钥和证书,请在验证器配置中定义其位置。证书必须可以被运行 Keylime 服务的
keylime用户访问。在
/etc/keylime/verifier.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/verifier.conf.d/00-keys-and-certs.conf,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用绝对路径定义密钥和证书位置。或者,相对路径是从
tls_dir选项中定义的目录解析的。
-
使用默认
在防火墙中打开端口:
firewall-cmd --add-port 8881/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8881/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用其他端口,请将
8881替换为.conf文件中定义的端口号。启动验证器(verifier)服务:
systemctl enable --now keylime_verifier
# systemctl enable --now keylime_verifierCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在默认配置中,在启动
keylime_registrar服务前启动keylime_verifier,因为验证器会为其他 Keylime 组件创建 CA 和证书。使用自定义证书时不需要这个顺序。
验证
检查
keylime_verifier服务是否活跃且在运行:systemctl status keylime_verifier ● keylime_verifier.service - The Keylime verifier Loaded: loaded (/usr/lib/systemd/system/keylime_verifier.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:08 EST; 1min 45s ago# systemctl status keylime_verifier ● keylime_verifier.service - The Keylime verifier Loaded: loaded (/usr/lib/systemd/system/keylime_verifier.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:08 EST; 1min 45s agoCopy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
6.3. 将 Keylime 验证器部署为容器 复制链接链接已复制到粘贴板!
Keylime 验证器对系统完整性执行初始和定期检查,并支持使用代理安全地 bootstrap 加密密钥。您可以将 Keylime 验证器配置为容器,而不是 RPM 方法,而主机上无需有任何二进制文件或软件包。容器部署提供更好的隔离、模块化和 Keylime 组件的可重复性。
启动容器后,会使用默认的配置文件部署 Keylime 验证器。您可以使用一个或多个以下方法自定义配置:
- 将包含配置文件的目录挂载到容器上。
- 直接在容器上修改环境变量。修改环境变量会覆盖配置文件中的值。
先决条件
-
podman软件包及其依赖项已安装在系统上。 可选:您可以访问 Keylime 从验证器保存数据的数据库。您可以使用以下数据库管理系统:
- SQLite (默认)
- PostgreSQL
- MySQL
- MariaDB
- 您有来自您的证书颁发机构的有效密钥和证书。
流程
可选:安装
keylime-verifier软件包,以访问配置文件。您可以配置没有此软件包的容器,但这可能更容易修改软件包提供的配置文件。dnf install keylime-verifier
# dnf install keylime-verifierCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在
/etc/keylime/verifier.conf.d/目录中创建一个新的.conf文件,来将验证器绑定到所有可用 IP 地址上,例如:/etc/keylime/verifier.conf.d/00-verifier-ip.conf,其内容如下:[verifier] ip = *
[verifier] ip = *Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
另外,您还可以使用
port选项更改验证器的端口默认值8881。
-
另外,您还可以使用
可选:为代理列表配置验证器的数据库。默认配置使用验证器的
/var/lib/keylime/cv_data.sqlite/目录中的 SQLite 数据库。您可以通过在/etc/keylime/verifier.conf.d/目录中创建一个新的.conf文件来定义一个不同的数据库,例如:/etc/keylime/verifier.conf.d/00-db-url.conf,其内容如下:[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>替换为数据库的 URL,如postgresql://verifier:UQ?nRNY9g7GZzN7@198.51.100.1/verifierdb。确保您使用的凭证对 Keylime 有权限,以创建数据库结构。
将证书和密钥添加到验证器(verifier)中。您可以让 Keylime 生成它们,或使用现有的密钥和证书生成它们:
-
使用默认
tls_dir = generate选项,Keylime 在/var/lib/keylime/cv_ca/目录中为验证器、注册器和租户生成新证书。 要在配置中加载现有的密钥和证书,请在验证器配置中定义其位置。证书必须可以被运行 Keylime 进程的
keylime用户访问。在
/etc/keylime/verifier.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/verifier.conf.d/00-keys-and-certs.conf,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用绝对路径定义密钥和证书位置。或者,相对路径是从
tls_dir选项中定义的目录解析的。
-
使用默认
在防火墙中打开端口:
firewall-cmd --add-port 8881/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8881/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用其他端口,请将
8881替换为.conf文件中定义的端口号。运行容器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
-p选项在主机和容器上打开默认端口8881。 -v选项为目录创建到容器的绑定挂载。-
使用
Z选项,Podman 使用私有未共享标签标记内容。这意味着只有当前容器可以使用私有卷。
-
使用
-
-d选项在后台运行分离的容器。 -
选项
-e KEYLIME_VERIFIER_SERVER_KEY_PASSWORD=<passphrase1>定义服务器密钥密码短语。 -
选项
-e KEYLIME_VERIFIER_CLIENT_KEY_PASSWORD=<passphrase2>定义客户端密钥密码短语。 -
您可以使用选项
-e KEYLIME_VERIFIER_<ENVIRONMENT_VARIABLE>=<value>,使用环境变量覆盖配置选项。要修改附加选项,请为每个环境变量单独插入-e选项。有关环境变量及其默认值的完整列表,请参阅 Keylime 环境变量。
-
验证
检查容器是否正在运行:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80b6b9dbf57c registry.access.redhat.com/rhel9/keylime-verifier:latest keylime_verifier 14 seconds ago Up 14 seconds 0.0.0.0:8881->8881/tcp keylime-verifier
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80b6b9dbf57c registry.access.redhat.com/rhel9/keylime-verifier:latest keylime_verifier 14 seconds ago Up 14 seconds 0.0.0.0:8881->8881/tcp keylime-verifierCopy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
6.4. 从软件包部署 Keylime 注册器 复制链接链接已复制到粘贴板!
注册器是包含所有代理的数据库的 Keylime 组件,它托管 TPM 供应商的公钥。在注册器的 HTTPS 服务接受可信平台模块(TPM)公钥后,它提供了一个接口来获取这些公钥以进行检查配额。
要维护信任链,请保持运行注册器的系统的安全,并在您的控制之下。
您可以根据您的要求,在单独的系统或作为 Keylime 按整齐的同一系统上安装注册器。在单独的系统上运行验证器和注册器可提供更好的性能。
要将配置文件保留在置入目录中,请使用具有两位数字前缀的文件名,例如 /etc/keylime/registrar.conf.d/00-registrar-ip.conf。配置处理以字典顺序读取置入目录中的文件,并对每个选项设置为它读取的最后一个值。
先决条件
- 您有访问安装和运行 Keylime 验证器的系统的网络权限。如需更多信息,请参阅
-
您在要安装 Keylime 组件的系统上有
root权限和网络连接。 您可以访问 Keylime 保存来自注册中心的数据的数据库。您可以使用以下数据库管理系统:
- SQLite (默认)
- PostgreSQL
- MySQL
- MariaDB
- 您有来自您的证书颁发机构的有效密钥和证书。
流程
安装 Keylime 注册器:
dnf install keylime-registrar
# dnf install keylime-registrarCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在
/etc/keylime/registrar.conf.d/目录中创建一个新的.conf文件来定义注册中心的 IP 地址和端口,例如:/etc/keylime/registrar.conf.d/00-registrar-ip.conf,其内容如下:[registrar] ip = <registrar_IP_address>
[registrar] ip = <registrar_IP_address>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<registrar_IP_address>替换为注册中心的 IP 地址。或者,使用ip = *或ip = 0.0.0.0将注册器绑定到所有可用 IP 地址。 -
可选,使用
port选项更改 Keylime 代理连接的端口。默认值为8890。 -
可选,使用
tls_port选项更改 Keylime 验证器和租户连接的 TLS 端口。默认值为8891。
-
将
可选:为代理列表配置注册器的数据库。默认配置使用注册器的
/var/lib/keylime/reg_data.sqlite目录中的 SQLite 数据库。您可以在/etc/keylime/registrar.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/registrar.conf.d/00-db-url.conf,其内容如下:[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>替换为数据库的 URL,如postgresql://registrar:EKYX-bqY2?#raXm@198.51.100.1/registrardb。确保您使用的凭证对 Keylime 有权限,以创建数据库结构。
在注册器中添加证书和密钥:
-
您可以使用默认配置,并将密钥和证书加载到
/var/lib/keylime/reg_ca/目录中。 或者,您可以在配置中定义密钥和证书的位置。在
/etc/keylime/registrar.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/registrar.conf.d/00-keys-and-certs.conf,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用绝对路径定义密钥和证书位置。或者,您可以在
tls_dir选项中定义目录,并使用相对于该目录的路径。
-
您可以使用默认配置,并将密钥和证书加载到
在防火墙中打开端口:
firewall-cmd --add-port 8890/tcp --add-port 8891/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8890/tcp --add-port 8891/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用其他端口,请将
8890或8891替换为.conf文件中定义的端口号。启动
keylime_registrar服务:systemctl enable --now keylime_registrar
# systemctl enable --now keylime_registrarCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在默认配置中,在启动
keylime_registrar服务前启动keylime_verifier,因为验证器会为其他 Keylime 组件创建 CA 和证书。使用自定义证书时不需要这个顺序。
验证
检查
keylime_registrar服务是否活跃且在运行:systemctl status keylime_registrar ● keylime_registrar.service - The Keylime registrar service Loaded: loaded (/usr/lib/systemd/system/keylime_registrar.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:17 EST; 1min 42s ago ...# systemctl status keylime_registrar ● keylime_registrar.service - The Keylime registrar service Loaded: loaded (/usr/lib/systemd/system/keylime_registrar.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:17 EST; 1min 42s ago ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
6.5. 将 Keylime 注册器部署为容器 复制链接链接已复制到粘贴板!
注册器是包含一个所有代理的数据库的 Keylime 组件,它托管可信平台模块(TPM)提供商的公钥。在注册器的 HTTPS 服务接受 TPM 公钥后,它提供一个接口来获取这些公钥,以检查引用。您可以将 Keylime 注册器配置为一个容器,而不是 RPM 方法,在主机上无需任何二进制文件或软件包。容器部署提供更好的隔离、模块化和 Keylime 组件的可重复性。
启动容器后,会使用默认配置文件部署 Keylime 注册器。您可以使用一个或多个以下方法自定义配置:
- 将包含配置文件的目录挂载到容器上。这在所有 RHEL 9 版本中提供。
- 直接在容器上修改环境变量。这在 RHEL 9.3 及更新版本中提供。修改环境变量会覆盖配置文件中的值。
先决条件
-
podman软件包及其依赖项已安装在系统上。 可选:您可以访问 Keylime 从注册器保存数据的数据库。您可以使用以下数据库管理系统:
- SQLite (默认)
- PostgreSQL
- MySQL
- MariaDB
- 您有来自您的证书颁发机构的有效密钥和证书。
流程
可选:安装
keylime-registrar软件包,以访问配置文件。您可以配置没有此软件包的容器,但这可能更容易修改软件包提供的配置文件。dnf install keylime-registrar
# dnf install keylime-registrarCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在
/etc/keylime/registrar.conf.d/目录中创建一个新的.conf文件,来将注册器绑定到所有可用的 IP 地址,例如/etc/keylime/registrar.conf.d/00-registrar-ip.conf,其内容如下:[registrar] ip = *
[registrar] ip = *Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选,使用
port选项更改 Keylime 代理连接的端口。默认值为8890。 -
可选,使用
tls_port选项更改 Keylime 租户连接的 TLS 端口。默认值为8891。
-
可选,使用
可选:为代理列表配置注册器的数据库。默认配置使用注册器的
/var/lib/keylime/reg_data.sqlite目录中的 SQLite 数据库。您可以在/etc/keylime/registrar.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/registrar.conf.d/00-db-url.conf,其内容如下:[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>替换为数据库的 URL,如postgresql://registrar:EKYX-bqY2?#raXm@198.51.100.1/registrardb。确保您使用的凭证对 Keylime 有权限,以创建数据库结构。
在注册器中添加证书和密钥:
-
您可以使用默认配置,并将密钥和证书加载到
/var/lib/keylime/reg_ca/目录中。 或者,您可以在配置中定义密钥和证书的位置。在
/etc/keylime/registrar.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/registrar.conf.d/00-keys-and-certs.conf,其内容如下:[registrar] tls_dir = /var/lib/keylime/reg_ca server_key = </path/to/server_key> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>']
[registrar] tls_dir = /var/lib/keylime/reg_ca server_key = </path/to/server_key> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>']Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用绝对路径定义密钥和证书位置。或者,您可以在
tls_dir选项中定义目录,并使用相对于该目录的路径。
-
您可以使用默认配置,并将密钥和证书加载到
在防火墙中打开端口:
firewall-cmd --add-port 8890/tcp --add-port 8891/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8890/tcp --add-port 8891/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用其他端口,请将
8890或8891替换为.conf文件中定义的端口号。运行容器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
-p选项打开主机和容器上的默认端口8890和8881。 -v选项为目录创建到容器的绑定挂载。-
使用
Z选项,Podman 使用私有未共享标签标记内容。这意味着只有当前容器可以使用私有卷。
-
使用
-
-d选项在后台运行分离的容器。 -
选项
-e KEYLIME_VERIFIER_SERVER_KEY_PASSWORD=<passphrase1>定义服务器密钥密码短语。 -
您可以使用选项
-e KEYLIME_REGISTRAR__<ENVIRONMENT_VARIABLE>=<value>,使用环境变量覆盖配置选项。要修改附加选项,请为每个环境变量单独插入-e选项。有关环境变量及其默认值的完整列表,请参阅 第 6.12 节 “Keylime 环境变量”。
-
验证
检查容器是否正在运行:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07d4b4bff1b6 localhost/keylime-registrar:latest keylime_registrar 12 seconds ago Up 12 seconds 0.0.0.0:8881->8881/tcp, 0.0.0.0:8891->8891/tcp keylime-registrar
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07d4b4bff1b6 localhost/keylime-registrar:latest keylime_registrar 12 seconds ago Up 12 seconds 0.0.0.0:8881->8881/tcp, 0.0.0.0:8891->8891/tcp keylime-registrarCopy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
6.6. 使用 RHEL 系统角色部署 Keylime 服务器 复制链接链接已复制到粘贴板!
您可以使用 keylime_server RHEL 系统角色设置验证器和注册器,它们是 Keylime 服务器组件。keylime_server 角色在每个节点上安装和配置 verifier 和 registrar 组件。
在 Ansible 控制节点上执行此步骤。
有关 Keylime 的更多信息,请参阅 Keylime 是如何工作的。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建定义所需角色的 playbook:
创建新 YAML 文件,并在文本编辑器中打开,例如:
vi keylime-playbook.yml
# vi keylime-playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 插入以下内容:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在 keylime_server RHEL 系统角色的变量 中找到更多有关变量的信息。
运行 playbook:
ansible-playbook <keylime-playbook.yml>
$ ansible-playbook <keylime-playbook.yml>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
keylime_verifier服务是否活跃并在受管主机上运行:systemctl status keylime_verifier ● keylime_verifier.service - The Keylime verifier Loaded: loaded (/usr/lib/systemd/system/keylime_verifier.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:08 EST; 1min 45s ago# systemctl status keylime_verifier ● keylime_verifier.service - The Keylime verifier Loaded: loaded (/usr/lib/systemd/system/keylime_verifier.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:08 EST; 1min 45s agoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
keylime_registrar服务是否活跃且在运行:systemctl status keylime_registrar ● keylime_registrar.service - The Keylime registrar service Loaded: loaded (/usr/lib/systemd/system/keylime_registrar.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:17 EST; 1min 42s ago ...# systemctl status keylime_registrar ● keylime_registrar.service - The Keylime registrar service Loaded: loaded (/usr/lib/systemd/system/keylime_registrar.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:17 EST; 1min 42s ago ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
6.7. keylime_server RHEL 系统角色的变量 复制链接链接已复制到粘贴板!
当使用 keylime_server RHEL 系统角色设置 Keylime 服务器时,您可以为注册器和验证器自定义以下变量。
用于配置 Keylime 验证器的 keylime_server RHEL 系统角色变量的列表:
keylime_server_verifier_ip- 定义 verifier 的 IP 地址。
keylime_server_verifier_tls_dir-
指定存储密钥和证书的目录。如果设置为 default,verifier 将使用
/var/lib/keylime/cv_ca目录。 keylime_server_verifier_server_key_passphrase- 指定解密服务器私钥的密码短语。如果值为空,则私钥没有加密。
keylime_server_verifier_server_cert: 指定 Keylime 注册器服务器证书文件。
keylime_server_verifier_trusted_client_ca-
定义可信客户端 CA 证书的列表。您必须将文件存储在
keylime_server_verifier_tls_dir选项中设置的目录中。 keylime_server_verifier_client_key- 定义包含 Keylime verifier 私钥的文件。
keylime_server_verifier_client_key_passphrase- 定义解密客户端私钥文件的密码短语。如果值为空,则私钥没有加密。
keylime_server_verifier_client_cert- 定义 Keylime verifier 客户端证书文件。
keylime_server_verifier_trusted_server_ca-
定义可信服务器 CA 证书的列表。您必须将文件存储在
keylime_server_verifier_tls_dir选项中设置的目录中。
用于设置 keylime_server RHEL 系统角色的注册器变量的列表:
keylime_server_registrar_ip- 定义 registrar 的 IP 地址。
keylime_server_registrar_tls_dir-
指定存储 registrar 密钥和证书的目录。如果将其设置为 default,registrar 将使用
/var/lib/keylime/reg_ca目录。 keylime_server_registrar_server_key- 定义 Keylime registrar 私有服务器密钥文件。
keylime_server_registrar_server_key_passphrase- 指定解密 registrar 的服务器私钥的密码短语。如果值为空,则私钥没有加密。
keylime_server_registrar_server_cert- 指定 Keylime registrar 服务器证书文件。
keylime_server_registrar_trusted_client_ca-
定义可信客户端 CA 证书的列表。您必须将文件存储在
keylime_server_registrar_tls_dir选项中设置的目录中。
6.8. 从软件包部署 Keylime 租户 复制链接链接已复制到粘贴板!
Keylime 对许多功能使用 keylime_tenant 工具,包括在目标系统上置备代理。您可以在任何系统上安装 keylime_tenant,包括运行其他 Keylime 组件的系统,或者根据要求在单独的系统上安装。
先决条件
-
您在要安装 Keylime 组件的系统上有
root权限和网络连接。 您对配置了其他 Keylime 组件的系统有网络访问权限:
- 验证器
- 如需更多信息,请参阅 第 6.2 节 “从软件包部署 Keylime 验证器”。
- 注册器
- 如需更多信息,请参阅 第 6.4 节 “从软件包部署 Keylime 注册器”。
流程
安装 Keylime 租户:
dnf install keylime-tenant
# dnf install keylime-tenantCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过编辑
/etc/keylime/tenant.conf.d/00-verifier-ip.conf文件将租户的连接定义到 Keylime 验证器的连接:[tenant] verifier_ip = <verifier_ip>
[tenant] verifier_ip = <verifier_ip>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<verifier_ip>替换为验证器系统的 IP 地址。 -
如果验证器使用与默认值
8881不同的端口,请添加verifier_port = <verifier_port>设置。
-
将
通过编辑
/etc/keylime/tenant.conf.d/00-registrar-ip.conf文件将租户的连接定义到 Keylime 注册器的连接:[tenant] registrar_ip = <registrar_ip>
[tenant] registrar_ip = <registrar_ip>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<registrar_ip>替换为注册器系统的 IP 地址。 -
如果注册器使用与默认值
8891不同的端口,请添加registrar_port = <registrar_port>设置。
-
将
在租户中添加证书和密钥:
-
您可以使用默认配置,并将密钥和证书加载到
/var/lib/keylime/cv_ca目录。 或者,您可以在配置中定义密钥和证书的位置。在
/etc/keylime/tenant.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/tenant.conf.d/00-keys-and-certs.conf,其内容如下:Copy to Clipboard Copied! Toggle word wrap Toggle overflow trusted_server_ca参数接受到验证器和注册器服务器 CA 证书的路径。您可以提供多个以逗号分隔的路径,例如,验证器和注册器使用不同的 CA。注意使用绝对路径定义密钥和证书位置。或者,您可以在
tls_dir选项中定义目录,并使用相对于该目录的路径。
-
您可以使用默认配置,并将密钥和证书加载到
-
可选:如果无法使用
/var/lib/keylime/tpm_cert_store目录中的证书验证可信平台模块(TPM)签署密钥(EK),请将证书添加到那个目录中。这在使用具有模拟 TPM 的虚拟机时会出现这种情况。
验证
检查 verifier 的状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果正确设置了,且没有配置代理,验证器会响应它无法识别的默认代理 UUID。
检查 registrar 的状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果正确设置了,且没有配置代理,注册器会响应它无法识别的默认代理 UUID。
后续步骤
6.9. 从软件包部署 Keylime 代理 复制链接链接已复制到粘贴板!
Keylime 代理是部署到被 Keylime 监控的所有系统的组件。
默认情况下,Keylime 代理将其所有数据保存在被监控系统的 /var/lib/keylime/ 目录中。
要将配置文件保留在置入目录中,请使用具有两位数字前缀的文件名,例如 /etc/keylime/agent.conf.d/00-registrar-ip.conf。配置处理以字典顺序读取置入目录中的文件,并对每个选项设置为它读取的最后一个值。
先决条件
-
您有对被监控系统的
root权限。 -
监控的系统有一个受信任的平台模块(TPM)。要验证,请输入
tpm2_pcrread命令。如果输出返回多个哈希,则代表 TPM 可用。 您对配置了其他 Keylime 组件的系统有网络访问权限:
- 验证器
- 如需更多信息,请参阅 从软件包部署 Keylime 验证器。
- 注册器
- 如需更多信息,请参阅 从软件包部署 Keylime 注册器。
- 租户
- 如需更多信息,请参阅 从软件包部署 Keylime 租户。
- 在监控的系统上启用了完整性测量架构(IMA)。如需更多信息,请参阅 启用完整性测量架构和扩展验证模块。
流程
安装 Keylime 代理:
dnf install keylime-agent
# dnf install keylime-agentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令会安装
keylime-agent-rust软件包。在配置文件中定义代理的 IP 地址和端口。在
/etc/keylime/agent.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/agent.conf.d/00-agent-ip.conf,其内容如下:[agent] ip = '<agent_ip>'
[agent] ip = '<agent_ip>'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意Keylime 代理配置使用 TOML 格式,它与用于其他组件配置的 INI 格式不同。因此,使用有效 TOML 语法输入值,例如,在带单引号的路径以及带方括号的多个路径的数组。
-
将
<agent_IP_address>替换为代理的 IP 地址。或者,使用ip = '*'或ip = '0.0.0.0'将代理绑定到所有可用 IP 地址。 -
另外,您还可以使用
port = '<agent_port>'选项更改代理端口的默认值9002。
-
将
在配置文件中定义注册的 IP 地址和端口。在
/etc/keylime/agent.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/agent.conf.d/00-registrar-ip.conf,其内容如下:[agent] registrar_ip = '<registrar_IP_address>'
[agent] registrar_ip = '<registrar_IP_address>'Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<registrar_IP_address>替换为注册中心的 IP 地址。 -
另外,您还可以使用
registrar_port = '<registrar_port>'选项更改注册器端口的默认值8890。
-
将
可选:定义代理的通用唯一标识符(UUID)。如果没有定义,则使用默认 UUID。在
/etc/keylime/agent.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/agent.conf.d/00-agent-uuid.conf,其内容如下:[agent] uuid = '<agent_UUID>'
[agent] uuid = '<agent_UUID>'Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<agent_UUID>替换为代理的 UUID,如d432fbb3-d2f1-4a97-9ef7-abcdef012345。您可以使用uuidgen工具生成 UUID。
-
将
可选:为代理加载现有密钥和证书。如果代理没有接收
server_key和server_cert,它会生成自己的密钥和自签名证书。在配置中定义密钥和证书的位置。在
/etc/keylime/agent.conf.d/目录中创建一个新的.conf文件,例如:/etc/keylime/agent.conf.d/00-keys-and-certs.conf,其内容如下:[agent] server_key = '</path/to/server_key>' server_key_password = '<passphrase1>' server_cert = '</path/to/server_cert>' trusted_client_ca = '[</path/to/ca/cert3>, </path/to/ca/cert4>]'
[agent] server_key = '</path/to/server_key>' server_key_password = '<passphrase1>' server_cert = '</path/to/server_cert>' trusted_client_ca = '[</path/to/ca/cert3>, </path/to/ca/cert4>]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用绝对路径定义密钥和证书位置。Keylime 代理不接受相对路径。
在防火墙中打开端口:
firewall-cmd --add-port 9002/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 9002/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用不同的端口,请将
9002替换为.conf文件中定义的端口号。启用并启动
keylime_agent服务:systemctl enable --now keylime_agent
# systemctl enable --now keylime_agentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:从配置了 Keylime 租户的系统验证代理是否已正确配置,并可连接到注册器。
keylime_tenant -c regstatus --uuid <agent_uuid> Reading configuration from ['/etc/keylime/logging.conf'] ... ==\n-----END CERTIFICATE-----\n", "ip": "127.0.0.1", "port": 9002, "regcount": 1, "operational_state": "Registered"}}}
# keylime_tenant -c regstatus --uuid <agent_uuid> Reading configuration from ['/etc/keylime/logging.conf'] ... ==\n-----END CERTIFICATE-----\n", "ip": "127.0.0.1", "port": 9002, "regcount": 1, "operational_state": "Registered"}}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<agent_uuid>替换为代理的 UUID。如果正确配置了注册器和代理,输出会显示代理的 IP 地址和端口,后跟
"operational_state": "Registered"。
通过在
/etc/ima/ima-policy文件中输入以下内容来创建新的 IMA 策略:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此策略针对已执行的应用程序的运行时监控。您可以根据您的场景调整此策略。您可以在
statfs (2)手册页中找到 MAGIC 常量。更新内核参数:
grubby --update-kernel DEFAULT --args 'ima_appraise=fix ima_canonical_fmt ima_policy=tcb ima_template=ima-ng'
# grubby --update-kernel DEFAULT --args 'ima_appraise=fix ima_canonical_fmt ima_policy=tcb ima_template=ima-ng'Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重启系统以应用新的 IMA 策略。
验证
验证代理是否正在运行:
systemctl status keylime_agent ● keylime_agent.service - The Keylime compute agent Loaded: loaded (/usr/lib/systemd/system/keylime_agent.service; enabled; preset: disabled) Active: active (running) since ...# systemctl status keylime_agent ● keylime_agent.service - The Keylime compute agent Loaded: loaded (/usr/lib/systemd/system/keylime_agent.service; enabled; preset: disabled) Active: active (running) since ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
在您要监控的所有系统上配置了代理后,您可以部署 Keylime 来执行以下一个或多个功能:
6.10. 为运行时监控配置 Keylime 复制链接链接已复制到粘贴板!
要验证被监控系统状态是否正确,Keylime 代理必须运行在监控的系统上。
因为 Keylime 运行时监控使用完整性测量架构(IMA)来测量大量文件,所以可能会对系统性能产生重大影响。
在置备代理时,您还可以定义 Keylime 发送到被监控系统的文件。Keylime 对发送到代理的文件进行加密,只有在代理系统符合 TPM 策略并使用 IMA allowlist 时才解密。
您可以通过配置 Keylime excludelist 使 Keylime 忽略对特定文件或特定目录中文件的更改。排除的文件仍可由 IMA 进行测量。
allowlist 和 excludelist 合并到 Keylime 运行时策略中。
先决条件
您有对配置了 Keylime 组件的系统的网络访问权限:
- 验证器
- 如需更多信息,请参阅 从软件包部署 Keylime 验证器。
- 注册器
- 如需更多信息,请参阅 从软件包部署 Keylime 注册器。
- 租户
- 如需更多信息,请参阅 从软件包部署 Keylime 租户。
- Agent
- 如需更多信息,请参阅 从软件包部署 Keylime 代理。
流程
在配置并运行了 Keylime 代理的被监控系统上,安装
python3-keylime软件包,其包含keylime-policy工具:dnf -y install python3-keylime
# dnf -y install python3-keylimeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从代理系统的当前状态创建一个运行时策略:
keylime-policy create runtime --ima-measurement --rootfs '/' --ramdisk-dir '/boot/' --output <policy.json>
# keylime-policy create runtime --ima-measurement --rootfs '/' --ramdisk-dir '/boot/' --output <policy.json>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这个命令中,
-
将
<policy.json>替换为运行时策略的文件名。 以下目录会自动从测量中排除:
-
/sys -
/run -
/proc -
/lost+found -
/dev -
/media -
/snap -
/mnt -
/var -
/tmp
-
-
另外,您可以通过添加
--excludelist <excludelist.txt>选项,从测量中排除其他具体的路径。excludelist 接受 Python 正则表达式,每行一个正则表达式。有关特殊字符的完整列表,请参阅 docs.python.org 中的正则表达式操作。
-
将
将生成的运行时策略复制到配置了
keylime_tenant工具的系统中,例如:scp <policy.json> root@<tenant.ip>:/root/<policy.json>
# scp <policy.json> root@<tenant.ip>:/root/<policy.json>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在配置了 Keylime 租户的系统上,使用
keylime_tenant工具置备代理:keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --runtime-policy <policy.json> --cert default
# keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --runtime-policy <policy.json> --cert defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<agent_ip>替换为代理的 IP 地址。 -
将
<agent_uuid>替换为代理的 UUID。 -
将
<policy.json>替换为 Keylime 运行时策略文件的路径。 使用
--cert选项时,租户通过使用指定目录或默认的/var/lib/keylime/ca/目录中的 CA 证书和密钥为代理生成和签名证书。如果目录不包含 CA 证书和密钥,则租户将根据/etc/keylime/ca.conf文件中的配置自动生成它们,并将其保存到指定的目录中。然后,租户将这些密钥和证书发送给代理。在生成 CA 证书或签名代理证书时,可能会提示您输入访问 CA 私钥的密码:
Please enter the password to decrypt your keystore:注意Keylime 对发送到代理的文件进行加密,只有在代理系统符合 TPM 策略和 IMA allowlist 时才解密该文件。默认情况下,Keylime 解压缩发送的
.zip文件。
例如,使用以下命令,
keylime_tenant在127.0.0.1处添加一个新的 UUID 为d432fbb3-d2f1-4a97-9ef7-75bd81c00000的 Keylime 代理,并加载运行时策略policy.json。它还在默认目录中生成一个证书,并将证书文件发送给代理。只有满足/etc/keylime/verifier.conf中的 TPM 策略才对文件进行解密:keylime_tenant --command add --targethost 127.0.0.1 --uuid d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --runtime-policy policy.json --cert default
# keylime_tenant --command add --targethost 127.0.0.1 --uuid d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --runtime-policy policy.json --cert defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可以使用
# keylime_tenant --command delete --uuid <agent_uuid>命令停止 Keylime 监控节点。您可以使用
keylime_tenant --command update命令修改已注册的代理的配置。-
将
验证
- 可选:重启被监控的系统,以验证设置是否持久。
验证代理是否成功:
keylime_tenant --command cvstatus --uuid <agent_uuid> ... {"<agent_uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...# keylime_tenant --command cvstatus --uuid <agent_uuid> ... {"<agent_uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<agent_uuid>替换为代理的 UUID。如果
operational_state的值为Get Quote,并且attestation_count为非零,则此代理的证明成功。如果
operational_state的值为Invalid Quote或Failed,则验证失败,命令会显示类似如下的输出:{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果验证失败,请在验证器日志中显示更多详细信息:
journalctl --unit keylime_verifier keylime.tpm - INFO - Checking IMA measurement list... keylime.ima - WARNING - File not found in allowlist: /root/bad-script.sh keylime.ima - ERROR - IMA ERRORS: template-hash 0 fnf 1 hash 0 good 781 keylime.cloudverifier - WARNING - agent D432FBB3-D2F1-4A97-9EF7-75BD81C00000 failed, stopping polling
# journalctl --unit keylime_verifier keylime.tpm - INFO - Checking IMA measurement list... keylime.ima - WARNING - File not found in allowlist: /root/bad-script.sh keylime.ima - ERROR - IMA ERRORS: template-hash 0 fnf 1 hash 0 good 781 keylime.cloudverifier - WARNING - agent D432FBB3-D2F1-4A97-9EF7-75BD81C00000 failed, stopping pollingCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.11. 为测量的引导证明配置 Keylime 复制链接链接已复制到粘贴板!
当您为测量的引导验证配置 Keylime 时,Keylime 会检查测量系统上的引导过程是否与您定义的状态相符。
先决条件
您有对配置了 Keylime 组件的系统的网络访问权限:
- 验证器
- 如需更多信息,请参阅 从软件包部署 Keylime 验证器。
- 注册器
- 如需更多信息,请参阅 从软件包部署 Keylime 注册器。
- 租户
- 如需更多信息,请参阅 从软件包部署 Keylime 租户。
- Agent
- 如需更多信息,请参阅 从软件包部署 Keylime 代理。
- 在代理系统上启用了统一可扩展固件接口(UEFI)。
流程
在配置并运行了 Keylime 代理的被监控系统上,安装
python3-keylime软件包,其包含keylime-policy工具:dnf -y install python3-keylime
# dnf -y install python3-keylimeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在被监控的系统上,使用
keylime-policy工具从测量的系统的当前状态的引导日志生成一个策略:keylime-policy create measured-boot --eventlog-file /sys/kernel/security/tpm0/binary_bios_measurements --output <./measured_boot_reference_state.json>
# keylime-policy create measured-boot --eventlog-file /sys/kernel/security/tpm0/binary_bios_measurements --output <./measured_boot_reference_state.json>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<./measured_boot_reference_state.json>替换为keylime-policy保存生成的策略的路径。 如果您的 UEFI 系统没有启用安全引导,请传递
--without-secureboot参数。重要使用
keylime-policy生成的策略是基于系统的当前状态,且非常严格。任何系统修改,包括内核更新和系统更新都会更改引导过程,系统就会失败。
-
将
将生成的策略复制到配置了
keylime_tenant工具的系统上,例如:scp root@<agent_ip>:<./measured_boot_reference_state.json> <./measured_boot_reference_state.json>
# scp root@<agent_ip>:<./measured_boot_reference_state.json> <./measured_boot_reference_state.json>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在配置了 Keylime 租户的系统上,使用
keylime_tenant工具置备代理:keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --mb_refstate <./measured_boot_reference_state.json> --cert default
# keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --mb_refstate <./measured_boot_reference_state.json> --cert defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<agent_ip>替换为代理的 IP 地址。 -
将
<agent_uuid>替换为代理的 UUID。 -
将
<./measured_boot_reference_state.json>替换为计算引导策略的路径。
如果您将测量的引导与运行时监控相结合,请在输入
keylime_tenant --command add命令时提供这两个用例中的所有选项。注意您可以使用
# keylime_tenant --command delete --targethost <agent_ip> --uuid <agent_uuid>命令停止 Keylime 监控节点。您可以使用
keylime_tenant --command update命令修改已注册的代理的配置。-
将
验证
重启被监控的系统,并验证代理是否成功:
keylime_tenant --command cvstatus --uuid <agent_uuid> ... {"<agent_uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...# keylime_tenant --command cvstatus --uuid <agent_uuid> ... {"<agent_uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<agent_uuid>替换为代理的 UUID。如果
operational_state的值为Get Quote,并且attestation_count为非零,则此代理的证明成功。如果
operational_state的值为Invalid Quote或Failed,则验证失败,命令会显示类似如下的输出:{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果验证失败,请在验证器日志中显示更多详细信息:
journalctl -u keylime_verifier {"d432fbb3-d2f1-4a97-9ef7-75bd81c00000": {"operational_state": "Tenant Quote Failed", ... "last_event_id": "measured_boot.invalid_pcr_0", "attestation_count": 0, "last_received_quote": 1684487093, "last_successful_attestation": 0}}# journalctl -u keylime_verifier {"d432fbb3-d2f1-4a97-9ef7-75bd81c00000": {"operational_state": "Tenant Quote Failed", ... "last_event_id": "measured_boot.invalid_pcr_0", "attestation_count": 0, "last_received_quote": 1684487093, "last_successful_attestation": 0}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.12. Keylime 环境变量 复制链接链接已复制到粘贴板!
您可以设置 Keylime 环境变量来覆盖配置文件中的值,例如,当使用 -e 选项,使用 podman run 命令启动容器时。
环境变量使用以下语法:
KEYLIME_<SECTION>_<ENVIRONMENT_VARIABLE>=<value>
KEYLIME_<SECTION>_<ENVIRONMENT_VARIABLE>=<value>
其中:
-
<SECTION>是 Keylime 配置文件部分。 -
<ENVIRONMENT_VARIABLE>是环境变量。 -
<value>是您要设置环境变量的值。
例如,-e KEYLIME_VERIFIER_MAX_RETRIES=6 将 [verifier] 部分中的 max_retries 配置选项设置为 6。
验证器配置
| 配置选项 | 环境变量 | 默认值 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
注册器配置
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
租户配置
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CA 配置
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
代理配置
| 配置选项 | 环境变量 | 默认值 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
日志记录配置
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 配置选项 | 环境变量 | 默认值 |
|
|
| |
|
|
|
|
|
|
|
|
第 7 章 使用 AIDE 检查完整性 复制链接链接已复制到粘贴板!
高级入侵检测环境(AIDE)是一个在系统上创建文件数据库的工具,然后使用该数据库确保文件的完整性,并检测系统入侵。
7.1. 安装 AIDE 复制链接链接已复制到粘贴板!
要使用 AIDE 启动文件完整性检查,您必须安装相应的软件包并启动 AIDE 数据库。
先决条件
-
AppStream存储库已启用。
流程
安装
aide软件包:dnf install aide
# dnf install aideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 生成一个初始数据库:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:在默认配置中,
aide --init命令只检查/etc/aide.conf文件中定义的一组目录和文件。要在 AIDE 数据库中包含其他目录或文件,并更改其监视的参数,请相应地编辑/etc/aide.conf。 要开始使用数据库,请从初始数据库文件名中删除
.new子字符串:mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gzCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
可选:要更改 AIDE 数据库的位置,请编辑
/etc/aide.conf文件,并修改DBDIR值。要获得额外的安全性,请将数据库、配置和/usr/sbin/aide二进制文件存储在安全的位置,如只读介质。
7.2. 使用 AIDE 执行完整性检查 复制链接链接已复制到粘贴板!
您可以使用 crond 服务来定期使用 AIDE 调度进行常规的文件完整性检查。
先决条件
- AIDE 已正确安装,其数据库已初始化。请参阅 安装 AIDE
流程
启动手动检查:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 至少,将系统配置为每周运行 AIDE。最好每天运行 AIDE。例如,要使用
cron命令计划在每日 04:05 a.m. 执行 AIDE,请在/etc/crontab文件中添加以下行:05 4 * * * root /usr/sbin/aide --check
05 4 * * * root /usr/sbin/aide --checkCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3. 更新 AIDE 数据库 复制链接链接已复制到粘贴板!
验证系统的更改后,如软件包更新或配置文件调整,也会更新您的基准 AIDE 数据库。
先决条件
- AIDE 已正确安装,其数据库已初始化。请参阅 安装 AIDE
步骤
更新您的基准 AIDE 数据库:
aide --update
# aide --updateCopy to Clipboard Copied! Toggle word wrap Toggle overflow aide --update命令创建/var/lib/aide/aide.db.new.gz数据库文件。-
若要开始使用更新的数据库进行完整性检查,请从文件名中删除
.new子字符串。
7.4. 文件完整性工具:AIDE 和 IMA 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux 提供多个用于检查和维护系统上文件和目录完整性的工具。下表可帮助您决定哪个工具更适合您的场景。
| 问题 | 高级入侵检测环境(AIDE) | 完整性测量架构 (IMA) |
|---|---|---|
| 什么 | AIDE 是一个在系统上创建文件和目录数据库的工具。此数据库用于检查文件完整性及检测入侵检测。 | IMA 通过检查与之前存储的扩展属性相比的文件度量(哈希值)来检查文件是否被修改了。 |
| 如何 | AIDE 使用规则来比较文件和目录的完整性状态。 | IMA 使用文件哈希值来检测入侵。 |
| 为什么 | 检测 - AIDE 通过验证规则来检测文件是否被修改。 | 检测和防止 - IMA 通过替换文件的扩展属性来检测和防止攻击。 |
| 使用 | 当文件或目录被修改了,AIDE 会检测到威胁。 | 当有人试图更改整个文件时,IMA 会检测到威胁。 |
| 扩展 | AIDE 检查本地系统上文件和目录的完整性。 | IMA 确保本地和远程系统的安全性。 |
7.5. 使用 aide RHEL 系统角色配置文件完整性检查 复制链接链接已复制到粘贴板!
您可以使用 aide RHEL 系统角色在多个系统中一致地配置高级入侵检测环境(AIDE)。角色在所有受管节点上自动安装 aide 软件包,并根据您的配置,它可以执行以下操作:
- 初始化 AIDE 数据库,并将其保存在控制节点上
- 在受管节点上运行 AIDE 完整性检查
- 更新 AIDE 数据库,并将其保存在控制节点上
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
aide_db_fetch_dir: files-
指定 Ansible 控制节点(ACN)上的目录,以保存从远程节点获取的 AIDE 数据库。使用默认
files值,角色会将数据库保存在与 playbook 相同的目录中。要在其他地方保存数据库文件,请指定不同的路径。 aide_check: false- 在远程节点上运行完整性检查。
aide_update: false- 更新 AIDE 数据库,并将其保存在控制节点上。
aide_cron_check: true-
配置一个定期
cron作业,其在受管节点上激活 AIDE 完整性检查。 aide_cron_interval: 0 12 * * *以格式
<minute> <hour> <day_of_month> <month> <day of week>为cron作业设置间隔。值0 12 * * *将其设置为每天中午运行。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.aide/README.md文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 8 章 管理 sudo 访问 复制链接链接已复制到粘贴板!
系统管理员可以授予 sudo 访问权限,以允许非 root 用户执行通常为 root 用户保留的管理命令。因此,非 root 用户可以执行此类命令,而无需登录到 root 用户帐户。
8.1. sudoers 中的用户授权 复制链接链接已复制到粘贴板!
/etc/sudoers 文件指定哪些用户可以使用 sudo 命令来执行其他命令。规则可应用到单个用户和用户组。您还可以使用别名轻松地为主机组、命令,甚至用户定义规则。默认别名定义在 /etc/sudoers 文件的第一部分中。
当用户为没有授权的用户输入带有 sudo 的命令时,系统会将包含字符串 <username> : user NOT in sudoers 的消息记录到日志中。
默认的 /etc/sudoers 文件提供授权信息和示例。您可以通过取消相应行的注释来激活特定的示例规则。带有用户授权的部分标有以下介绍:
## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems).
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
您可以使用以下格式创建新的 sudoers 授权并修改现有授权:
<username> <hostname.example.com>=(<run_as_user>:<run_as_group>) <path/to/command>
<username> <hostname.example.com>=(<run_as_user>:<run_as_group>) <path/to/command>
其中:
-
<username>是输入命令的用户,如user1。如果该值以%开头,它定义一个组,例如%group1。 -
<hostname.example.com>是应用规则的主机的名称。 -
(<run_as_user>:<run_as_group>)部分 定义以其身份执行命令的用户或组。如果省略这个部分,<username>可以以 root 身份执行命令。 -
<path/to/command>是命令的完整的绝对路径。您还可以通过在命令路径后面添加这些选项,将用户限制为仅使用特定的选项和参数执行命令。如果没有指定任何选项,用户可以使用带有所有选项的命令。
您可以通过将任何这些变量替换为 ALL,来将规则应用到所有用户、主机或命令。
使用过于宽松的规则(如 ALL=(ALL) ALL ),所有用户都可以在所有主机上以所有用户的身份运行所有命令。这带来了严重的安全风险。
您可以使用 ! 操作符来指定参数的反。例如,!root 指定除 root 以外的所有用户。请注意,允许特定的用户、组和命令比禁止特定的用户、组和命令更安全。这是因为允许规则还阻止新的未授权的用户或组。
避免对命令使用负规则,因为用户可以通过使用 alias 命令重命名命令来克服此类规则。
系统会从头到尾读取 /etc/sudoers 文件。因此,如果文件中包含用户的多个条目,则按顺序应用条目。如果值冲突,系统将使用最后匹配的项,即使它不是最具体的匹配。
要在系统更新期间保留规则,并更轻松地修复错误,请在 /etc/sudoers.d/ 目录中创建新文件来输入新规则,而不是直接在 /etc/sudoers 文件中输入规则。当系统在 /etc/sudoers 文件中达到以下行时,会读取 /etc/sudoers.d 目录中的文件:
#includedir /etc/sudoers.d
#includedir /etc/sudoers.d
请注意,此行开头的数字符号(#)是语法的一部分,并不意味着该行是一个注释行。该目录中文件的名称不能包含句点,也不能以波形符(~)结尾。
8.2. 为用户授予 sudo 访问权限 复制链接链接已复制到粘贴板!
系统管理员可以通过授予它们 sudo 访问权限来允许非 root 用户执行管理命令。sudo 命令为用户提供了管理访问权限,而无需使用 root 用户的密码。
当用户需要执行管理命令时,您可以在使用 sudo 命令前执行该命令。如果用户有命令的授权,则可以执行命令,就像他们是 root 一样。
请注意以下限制:
-
只有
/etc/sudoers配置文件中列出的用户才能使用sudo命令。 -
命令在用户的 shell 下执行,而不是在 root shell 下执行。但是,有一些例外情况,如向任何用户授予完整的
sudo权限时。在这种情况下,用户可以切换到 root shell ,并在 root shell 中运行命令。例如: -
sudo -i -
sudo su -
先决条件
- 有对系统的 root 访问权限。
流程
以 root 身份,打开
/etc/sudoers文件。visudo
# visudoCopy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/sudoers文件定义sudo命令应用的策略。在
/etc/sudoers文件中,找到为wheel管理组中用户授予sudo访问权限的行。## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALLCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
确保以
%wheel开头的行没有用数字符号(#)注释掉。 - 保存所有更改并退出编辑器。
将您要授予
sudo访问权限的用户添加到wheel管理组中。usermod --append -G wheel <username>
# usermod --append -G wheel <username>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<username>替换为用户的名称。
验证
验证用户是否在
wheel管理组中:id <username> uid=5000(<username>) gid=5000(<username>) groups=5000(<username>),10(wheel)
# id <username> uid=5000(<username>) gid=5000(<username>) groups=5000(<username>),10(wheel)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3. 使非特权用户运行某些命令 复制链接链接已复制到粘贴板!
作为管理员,您可以通过在 /etc/sudoers.d/ 目录中配置策略来允许非特权用户在特定工作站上输入某些命令。这比给用户授予全部 sudo 访问权限或授予某用户 root 密码更加安全,理由如下:
- 对特权操作的更精细控制。您可以允许用户对特定主机执行某些操作,而不是向他们提供完全的管理权限。
-
更好的日志记录.当用户通过
sudo执行操作时,将使用其用户名,而不仅仅是 root 记录操作。 -
透明控制。当用户每次试图使用
sudo特权时,您可以为用户设置电子邮件通知。
先决条件
- 有对系统的 root 访问权限。
流程
以 root 用户身份,在
/etc/下创建一个新的sudoers.d/目录:mkdir -p /etc/sudoers.d/
# mkdir -p /etc/sudoers.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
/etc/sudoers.d/目录中创建一个新文件:visudo -f /etc/sudoers.d/<filename>
# visudo -f /etc/sudoers.d/<filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 文件会自动打开。
将以下行添加到
/etc/sudoers.d/<filename>文件中:<username> <hostname.example.com> = (<run_as_user>:<run_as_group>) <path/to/command>
<username> <hostname.example.com> = (<run_as_user>:<run_as_group>) <path/to/command>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
<username>替换为用户的名称。 -
将
<hostname.example.com>替换为主机的 URL。 -
将
(<run_as_user>:<run_as_group>)替换为可以以其身份执行命令的用户或组。如果省略这个部分,<username>可以以 root 身份执行命令。 -
将
<path/to/command>替换为命令的完整的绝对路径。您还可以通过在命令路径后面添加这些选项,将用户限制为仅使用特定的选项和参数执行命令。如果没有指定任何选项,用户可以使用带有所有选项的命令。 要在一行上允许同一主机上的两个和多个命令,您可以用逗号后跟一个空格把它们分开来列出它们。
例如,要允许
user1在host1.example.com上执行dnf和reboot命令,请输入user1 host1.example.com = /bin/dnf, /sbin/reboot。
-
将
可选:要在用户每次尝试使用
sudo特权时收到电子邮件通知,请在文件中添加以下行:Defaults mail_always Defaults mailto="<email@example.com>"
Defaults mail_always Defaults mailto="<email@example.com>"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存更改,退出编辑器。
验证
要验证用户是否可以使用
sudo特权运行命令,请切换帐户:su <username> -
# su <username> -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以用户身份,输入带有
sudo的命令:sudo <command> [sudo] password for <username>:
$ sudo <command> [sudo] password for <username>:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入用户的
sudo密码。如果正确配置了特权,系统会显示命令和选项的列表。例如,使用
dnf命令,它显示以下输出:… usage: dnf [options] COMMAND …
… usage: dnf [options] COMMAND …Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果系统返回错误信息
<username> is not in the sudoers file。这个事件会被报告,the file for<username>in/etc/sudoers.d/does not exist。如果系统返回错误消息
<username> is not allowed to run sudo on <host.example.com>,则配置没有正确完成。确保您已以 root 身份登录,并且配置被正确执行。如果系统返回错误消息
Sorry, user <username> is not allowed to execute '<path/to/command>' as root on <host.example.com>.,则命令没有在用户的规则中正确定义。
8.4. 使用 RHEL 系统角色应用自定义 sudoers 配置 复制链接链接已复制到粘贴板!
您可以使用 sudo RHEL 系统角色在受管节点上应用自定义 sudoers 配置。这样,您可以定义哪些用户可以在哪些主机上运行哪些命令,从而获得更好的配置效率和更精细的控制。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow playbook 中指定的设置包括:
users- 规则适用的用户的列表。
hosts-
规则适用的主机的列表。对于所有主机,您可以使用
ALL。 commands-
规则适用的命令的列表。对于所有命令,您可以使用
ALL。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.sudo/README.md文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在受管节点上,验证 playbook 是否应用了新规则。
cat /etc/sudoers | tail -n1 <user_name> <host_name>= <path_to_command_binary>
# cat /etc/sudoers | tail -n1 <user_name> <host_name>= <path_to_command_binary>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 9 章 使用基于策略的解密配置加密卷的自动解锁 复制链接链接已复制到粘贴板!
基于策略的解密(PBD)是技术的一种集合,可在物理和虚拟上解锁加密的根和硬盘的辅助卷。PBD 使用各种解锁方法,如用户密码、受信任的平台模块(TPM)设备、连接到系统的 PKCS #11 设备,如智能卡或特殊的网络服务器。
PBD 允许将不同的解锁方法合并成一个策略,从而可以以不同的方式解锁同一个卷。当前 Red Hat Enterprise Linux 中 PBD 的实现包括 Clevis 框架和名为 pins 的插件。每个 pin 都提供单独的解锁功能。目前,可提供以下 pins :
tang- 允许使用网络服务器解锁卷。
tpm2- 允许使用 TPM2 策略解锁卷。
pkcs11- 允许使用 PKCS #11 URI 解锁卷。
sss- 允许使用 Shamir 的 Secret 共享(SSS)加密方案部署高可用性系统。
9.1. 网络绑定磁盘加密 复制链接链接已复制到粘贴板!
网络绑定加密 (NBDE) 是基于策略的解密 (PBD) 的子类别,允许将加密的卷绑定到特殊的网络服务器。NBDE 的当前实现包括 Tang 服务器的 Clevis pin 和 Tang 服务器本身。
在 RHEL 中,NBDE 通过以下组件和技术实现:
图 9.1. 使用 LUKS1 加密的卷时的 NBDE 方案。luksmeta 软件包不用于 LUKS2 卷。
Tang 是一个将数据绑定到网络存在的服务器。当系统绑定到某个安全网络时,它会使包含数据的系统变得可用。Tang 是无状态的,不需要 TLS 或身份验证。与基于 escrow 的解决方案不同,服务器存储所有加密密钥并了解以前使用的每个密钥,Tang 从不与任何客户端密钥进行交互,因此不会从客户端获得任何识别信息。
Clevis 是一个自动化解密的可插拔框架。在 NBDE 中,Clevis 提供 LUKS 卷的自动解锁。clevis 软件包提供了该功能的客户端。
Clevis pin 是 Clevis 框架的一个插件。其中一个 pin 是实现与 NBDE 服务器 - Tang 交互的插件。
Clevis 和 Tang 是通用的客户端和服务器组件,提供网络绑定加密。在 RHEL 中,它们与 LUKS 一起使用,以加密和解密 root 和非 root 存储卷,以完成网络绑定磁盘加密。
客户端和服务器端组件都使用 José 库来执行加密和解密操作。
当您开始调配 NBDE 时,Tang 服务器的 Clevis pin 将获得 Tang 服务器发布的非对称密钥的列表。或者,由于密钥是非对称的,因此 Tang 的公钥列表可以分发到带外,以便客户端能够在不访问 Tang 服务器的情况下进行操作。此模式称为 脱机调配。
Tang 的 Clevis pin 使用其中一个公钥来生成唯一的强加密的加密密钥。使用此密钥加密数据后,密钥将被丢弃。Clevis 客户端应将此调配操作生成的状态存储在方便的位置。这种加密数据的过程就是 调配步骤。
LUKS 版本 2(LUKS2)是 RHEL 中的默认磁盘加密格式,因此 NBDE 的调配状态作为令牌存储在 LUKS2 标头中。luksmeta 软件包对 NBDE 的调配状态的利用仅用于使用 LUKS1 加密的卷。
Tang 的 Clevis pin 支持 LUKS1 和 LUKS2,不需要规范。Clevis 可以加密纯文本文件,但您必须使用 cryptsetup 工具来加密块设备。
当客户端准备好访问其数据时,它会加载再调配步骤中生成的元数据,并响应恢复加密密钥。此过程是 恢复步骤。
在 NBDE 中,Clevis 使用 pin 绑定一个 LUKS 卷,以便可以自动解锁它。成功完成绑定流程后,可以使用提供的 Dracut 解锁程序解锁磁盘。
如果将 kdump 内核崩溃转储机制设置为将系统内存的内容保存到 LUKS 加密的设备中,则会在第二次内核引导时提示您输入密码。
9.2. 部署 SELinux 处于 enforcing 模式的 Tang 服务器 复制链接链接已复制到粘贴板!
您可以使用 Tang 服务器在启用了 Clevis 的客户端上自动解锁 LUKS 加密的卷。在最简单的场景中,您可以通过安装 tang 软件包,并输入 systemctl enable tangd.socket --now 命令将 Tang 服务器部署在端口 80 上。以下示例流程演示了将运行在自定义端口上的 Tang 服务器部署为 SELinux enforcing 模式下受限制的服务。
先决条件
-
policycoreutils-python-utils包及其依赖项已经安装。 -
firewalld服务正在运行。
步骤
要安装
tang软件包及其依赖项,请以root用户身份输入以下命令:dnf install tang
# dnf install tangCopy to Clipboard Copied! Toggle word wrap Toggle overflow 选择一个未被占用的端口,例如 7500/tcp,并允许
tangd服务绑定到该端口:semanage port -a -t tangd_port_t -p tcp 7500
# semanage port -a -t tangd_port_t -p tcp 7500Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,一个端口一次只能由一个服务使用,因此尝试使用已占用的端口会出现
ValueError: Port already defined错误消息。在防火墙中打开端口:
firewall-cmd --add-port=7500/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port=7500/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用
tangd服务:systemctl enable tangd.socket
# systemctl enable tangd.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建覆盖文件:
systemctl edit tangd.socket
# systemctl edit tangd.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下编辑器屏幕中,其打开了位于
/etc/systemd/system/tangd.socket.d/目录中的一个空override.conf文件,通过添加以下行将 Tang 服务器的默认端口从 80 改为之前选择的端口号:[Socket] ListenStream= ListenStream=7500
[Socket] ListenStream= ListenStream=7500Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在以
# Anything between here和# Lines below this开头的行之间插入之前的代码片段,否则系统会丢弃您的更改。-
保存更改并退出编辑器。在默认的
vi编辑器中,您可以通过按 Esc 切换到命令模式,输入:wq并按 Enter 来实现。 重新载入更改的配置:
systemctl daemon-reload
# systemctl daemon-reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查您的配置是否正常工作:
systemctl show tangd.socket -p Listen Listen=[::]:7500 (Stream)
# systemctl show tangd.socket -p Listen Listen=[::]:7500 (Stream)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
tangd服务:systemctl restart tangd.socket
# systemctl restart tangd.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 由于
tangd使用了systemd套接字激活机制,因此服务器会在第一次连接进来时就立即启动。在第一次启动时会自动生成一组新的加密密钥。要执行手动生成密钥等加密操作,请使用jose工具。
验证
在您的 NBDE 客户端上,使用以下命令验证您的 Tang 服务器是否正常工作。命令必须返回与您为加密和解密传递的相同的消息:
echo test | clevis encrypt tang '{"url":"<tang.server.example.com:7500>"}' -y | clevis decrypt test# echo test | clevis encrypt tang '{"url":"<tang.server.example.com:7500>"}' -y | clevis decrypt testCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3. 轮转 Tang 服务器密钥并更新客户端上的绑定 复制链接链接已复制到粘贴板!
为安全起见,轮转 Tang 服务器密钥,并定期更新客户端上的现有绑定。轮转它们的确切间隔取决于您的应用程序、密钥大小以及机构策略。
或者,您可以使用 nbde_server RHEL 系统角色来轮转 Tang 密钥。如需更多信息,请参阅 使用 nbde_server 系统角色来设置多个 Tang 服务器。
先决条件
- Tang 服务器在运行。
-
clevis和clevis-luks软件包已安装在您的客户端上。
步骤
重命名
/var/db/tang密钥数据库目录中的所有密钥,使其前面有一个.,将它们隐藏起来,以防被看到。请注意,以下示例中的文件名与 Tang 服务器的密钥数据库目录中的独特文件名不同:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查是否重命名了,是否隐藏了 Tang 服务器中的所有密钥:
ls -l total 0
# ls -l total 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
/usr/libexec/tangd-keygen命令,在Tang 服务器上的/var/db/tang中生成新的密钥:/usr/libexec/tangd-keygen /var/db/tang ls /var/db/tang 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk zyLuX6hijUy_PSeUEFDi7hi38.jwk
# /usr/libexec/tangd-keygen /var/db/tang # ls /var/db/tang 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk zyLuX6hijUy_PSeUEFDi7hi38.jwkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查您的 Tang 服务器是否可以显示新密钥对的签名密钥,例如:
tang-show-keys 7500 3ZWS6-cDrCG61UPJS2BMmPU4I54
# tang-show-keys 7500 3ZWS6-cDrCG61UPJS2BMmPU4I54Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 NBDE 客户端上,使用
clevis luks report命令检查 Tang 服务器显示的密钥是否保持不变。您可以使用clevis luks list命令识别带有相关绑定的插槽,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要为新密钥重新生成 LUKS 元数据,在上一个命令提示时按
y,或使用clevis luks regen命令:clevis luks regen -d /dev/sda2 -s 1
# clevis luks regen -d /dev/sda2 -s 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当您确定所有旧客户端都使用新密钥时,您可以从 Tang 服务器中删除旧密钥,例如:
cd /var/db/tang rm .*.jwk
# cd /var/db/tang # rm .*.jwkCopy to Clipboard Copied! Toggle word wrap Toggle overflow
在客户端仍在使用旧密钥时删除旧密钥可能会导致数据丢失。如果您意外删除了这些密钥,请在客户端上使用 clevis luks regen 命令,并手动提供您的 LUKS 密码。
9.4. 在 web 控制台中使用 Tang 密钥配置自动解锁 复制链接链接已复制到粘贴板!
您可以使用 Tang 服务器提供的密钥配置自动解锁 LUKS 加密的存储设备。
先决条件
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
-
cockpit-storaged和clevis-luks软件包已安装在您的系统上。 -
cockpit.socket服务运行在9090端口。 - Tang 服务器可用。详情请参阅 使用 SELinux enforcing 模式部署 Tang 服务器。
-
您有
root权限或使用sudo输入管理命令的权限。
流程
- 登录到 RHEL 10 web 控制台。
- 切换到管理访问,提供您的凭证,然后单击 。在 Storage 表中,点包含您计划添加的加密卷的磁盘,来自动解锁。
在以下带有所选磁盘详情的页面中,点 Keys 部分中的 来添加一个 Tang 密钥:
选择
Tang keyserver作为Key source,提供 Tang 服务器的地址,以及解锁 LUKS 加密设备的密码。点击 确认:
以下对话框窗口提供了 命令,可用于验证密钥哈希是否匹配。
在 Tang 服务器上的终端中,使用
tang-show-keys命令来显示密钥哈希以进行比较。在本例中,Tang 服务器运行在端口 7500 上:tang-show-keys 7500 x100_1k6GPiDOaMlL3WbpCjHOy9ul1bSfdhI3M08wO0
# tang-show-keys 7500 x100_1k6GPiDOaMlL3WbpCjHOy9ul1bSfdhI3M08wO0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当 web 控制台中的密钥哈希与之前列出的命令的输出中的密钥哈希相同时,请点击 :
选择加密的根文件系统和 Tang 服务器后,您可以跳过将 rd.neednet=1 参数添加到内核命令行,安装 clevis-dracut 软件包,并重新生成初始 RAM 磁盘(initrd)。对于非 root 文件系统,web 控制台现在启用 remote-cryptsetup.target 和 clevis-luks-akspass.path systemd 单元,安装 clevis-systemd 软件包,并将 _netdev 参数添加到 fstab 和 crypttab 配置文件中。
验证
检查新添加的 Tang 密钥现在是否在 Keys 部分使用
Keyserver类型列出:
验证绑定可用于早期引导,例如:
lsinitrd | grep clevis-luks lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
# lsinitrd | grep clevis-luks lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.5. 基本的 NBDE 和 TPM2 加密客户端操作 复制链接链接已复制到粘贴板!
Clevis 框架可以加密纯文本文件,并解密 JSON Web 加密(JWE)格式的密文和 LUKS 加密的块设备。Clevis 客户端可以使用 Tang 网络服务器或受信任的平台模块 2.0(TPM 2.0)芯片进行加密操作。
以下命令通过包含纯文本文件的示例演示了 Clevis 提供的基本功能。您还可以使用它们来对 NBDE 或 Clevis+TPM 部署进行故障排除。
绑定到 Tang 服务器的加密客户端
要检查 Clevis 加密客户端是否绑定到 Tang 服务器,请使用
clevis encrypt tang子命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更改上例中的
http://tang.srv:portURL,使其与安装了tang的服务器的 URL 匹配。secret.jwe输出文件包含您的加密密码文本,格式为 JWE。这个密码文本是从input-plain.txt输入文件中读取的。另外,如果您的配置需要与 Tang 服务器进行非互动通信而无需 SSH 访问,您可以下载公告并将其保存到文件中:
curl -sfg http://tang.srv:port/adv -o adv.jws
$ curl -sfg http://tang.srv:port/adv -o adv.jwsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
adv.jws文件中的公告用于任何以下任务,如文件或消息的加密:echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'$ echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要解密数据,请使用
clevis decrypt命令,并提供密码文本(JWE):clevis decrypt < secret.jwe > output-plain.txt
$ clevis decrypt < secret.jwe > output-plain.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 TPM 2.0 加密客户端
要使用 TPM 2.0 芯片进行加密,请使用
clevis encrypt tpm2子命令,唯一的参数是 JSON 配置对象:clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe$ clevis encrypt tpm2 '{}' < input-plain.txt > secret.jweCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要选择不同的层次结构、哈希和密钥算法,请指定配置属性,例如:
clevis encrypt tpm2 '{"hash":"sha256","key":"rsa"}' < input-plain.txt > secret.jwe$ clevis encrypt tpm2 '{"hash":"sha256","key":"rsa"}' < input-plain.txt > secret.jweCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要解密数据,请提供 JSON Web 加密(JWE)格式的密码文本:
clevis decrypt < secret.jwe > output-plain.txt
$ clevis decrypt < secret.jwe > output-plain.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow
pin 还支持将数据封装到平台配置寄存器(PCR)状态。这样,只有 PCR 哈希值与密封时使用的策略匹配,数据才能被解封。
例如,对于 SHA-256 块要将数据密封到索引为 0 和 7 的 PCR:
clevis encrypt tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,7"}' < input-plain.txt > secret.jwe
$ clevis encrypt tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,7"}' < input-plain.txt > secret.jwe
PCR 中的哈希值可以重写,您无法再解锁加密的卷。因此,添加一个强大的密码短语,以便您手动解锁加密的卷,即使 PCR 中的值发生了变化。
如果在升级 shim-x64 软件包后,系统无法自动解锁加密的卷,请按照红帽知识库解决方案 重启后,Clevis TPM2 不再解密 LUKS 设备 中的步骤操作。
9.6. 为自动解锁 LUKS 加密的卷配置 NBDE 客户端 复制链接链接已复制到粘贴板!
使用 Clevis 框架,您可以在所选的 Tang 服务器可用时配置客户端来自动解锁 LUKS 加密卷。这创建一个 NBDE (网络绑定磁盘加密)部署。
先决条件
- Tang 服务器正在运行且可用。
步骤
要自动解锁现有的 LUKS 加密卷,请安装
clevis-luks子软件包:dnf install clevis-luks
# dnf install clevis-luksCopy to Clipboard Copied! Toggle word wrap Toggle overflow 识别 PBD 的 LUKS 加密卷。在以下示例中,块设备是指 /dev/sda2 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
clevis luks bind命令将卷绑定到 Tang 服务器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令执行四个步骤:
- 使用与 LUKS 主密钥相同的无序状态测量法创建新的密钥。
- 使用 Clevis 加密新密钥.
- 将 Clevis JWE 对象存储在 LUKS2 标头令牌中,或者使用 LUKSMeta(如果使用非默认的 LUKS1 标头)。
- 启用与 LUKS 一起使用的新密钥。
注意绑定流程假设标头至少包含一个空闲的 LUKS 密码插槽。
clevis luks bind命令占用了其中一个插槽。现在,您可以使用现有密码和 Clevis 策略解锁卷。
要使早期的引导系统处理磁盘绑定,请在已安装的系统上使用
dracut工具。在 RHEL 中,Clevis 生成一个没有特定于主机配置选项的通用initrd(初始 RAM 磁盘),没有向内核命令行自动添加rd.neednet=1等参数。如果您的配置依赖于在早期引导期间需要网络的 Tang pin ,请在检测到 Tang 绑定时使用--hostonly-cmdline参数和dracutaddrd.neednet=1:安装
clevis-dracut软件包:dnf install clevis-dracut
# dnf install clevis-dracutCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新生成初始 RAM 磁盘:
dracut -fv --regenerate-all --hostonly-cmdline
# dracut -fv --regenerate-all --hostonly-cmdlineCopy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,在
/etc/dracut.conf.d/目录中创建一个 .conf 文件,并将hostonly_cmdline=yes选项添加到该文件中。然后,您可以使用没有-hostonly-cmdline的dracut,例如:echo "hostonly_cmdline=yes" > /etc/dracut.conf.d/clevis.conf dracut -fv --regenerate-all
# echo "hostonly_cmdline=yes" > /etc/dracut.conf.d/clevis.conf # dracut -fv --regenerate-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以通过使用安装了 Clevis 的系统上的
grubby工具,确保在早期引导时 Tang pin 的网络可用:grubby --update-kernel=ALL --args="rd.neednet=1"
# grubby --update-kernel=ALL --args="rd.neednet=1"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证 Clevis JWE 对象是否已成功放在 LUKS 标头中,使用
clevis luks list命令:clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv:port"}'# clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv:port"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查绑定是否对早期引导可用,例如:
lsinitrd | grep clevis-luks lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
# lsinitrd | grep clevis-luks lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.7. 配置具有静态 IP 配置的 NBDE 客户端 复制链接链接已复制到粘贴板!
要将 NBDE 用于具有静态 IP 配置(没有 DHCP)的客户端,您必须手动将网络配置传递给 dracut 工具。
先决条件
- Tang 服务器正在运行且可用。
NBDE 客户端被配置为自动解锁 Tang 服务器加密的卷。
详情请参阅 为自动解锁 LUKS 加密的卷配置 NBDE 客户端。
步骤
您可以将静态网络配置提供为
dracut命令中kernel-cmdline选项的值,例如:dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none nameserver=192.0.2.100"
# dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none nameserver=192.0.2.100"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,在
/etc/dracut.conf.d/目录中创建一个带有静态网络信息的 .conf 文件,然后重新生成初始 RAM 磁盘镜像:cat /etc/dracut.conf.d/static_ip.conf kernel_cmdline="ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none nameserver=192.0.2.100" dracut -fv --regenerate-all
# cat /etc/dracut.conf.d/static_ip.conf kernel_cmdline="ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none nameserver=192.0.2.100" # dracut -fv --regenerate-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.8. 使用 TPM 2.0 策略配置 LUKS 加密的卷的手动注册 复制链接链接已复制到粘贴板!
您可以使用受信任的平台模块 2.0 (TPM 2.0)策略配置 LUKS 加密卷的解锁。您系统上的 clevis-encrypt-tpm2 (1) 手册页提供了可用参数的完整参考。
先决条件
- 一个可访问的 TPM 2.0 兼容设备。
- 具有 64 位 Intel 或 64 位 AMD 架构的系统。
流程
安装
clevis-luks子软件包:dnf install clevis-luks
# dnf install clevis-luksCopy to Clipboard Copied! Toggle word wrap Toggle overflow 识别 PBD 的 LUKS 加密卷。在以下示例中,块设备是指 /dev/sda2 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
clevis luks bind命令将卷绑定到 TPM 2.0 设备,例如:clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa"}' … Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:# clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa"}' … Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令执行四个步骤:
- 使用与 LUKS 主密钥相同的无序状态测量法创建新的密钥。
- 使用 Clevis 加密新密钥.
- 将 Clevis JWE 对象存储在 LUKS2 标头令牌中,或者使用 LUKSMeta(如果使用非默认的 LUKS1 标头)。
启用与 LUKS 一起使用的新密钥。
注意绑定过程假定至少有一个可用的 LUKS 密码插槽。
clevis luks bind命令占用了其中一个插槽。或者,如果您要将数据封装为特定的平台配置寄存器(PCR)状态,请将
pcr_bank和pcr_ids值添加到clevis luks bind命令中,例如:clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa","pcr_bank":"sha256","pcr_ids":"0,1"}'# clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa","pcr_bank":"sha256","pcr_ids":"0,1"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要由于只有 PCR 哈希值与密封时使用的策略匹配,并且可以重写哈希时,数据才会被解封,因此添加一个强大的密码短语,以便您可以在 PCR 中的值变化时手动解锁加密的卷。
如果在升级
shim-x64软件包后,系统无法自动解锁加密的卷,请按照红帽知识库解决方案 重启后,Clevis TPM2 不再解密 LUKS 设备 中的步骤操作。
- 现在可以使用您的现有密码和 Clevis 策略来解锁卷。
要启用早期引导系统来处理磁盘绑定,请在已安装的系统上使用
dracut工具:dnf install clevis-dracut dracut -fv --regenerate-all
# dnf install clevis-dracut # dracut -fv --regenerate-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证 Clevis JWE 对象是否已成功放入 LUKS 标头中,请使用
clevis luks list命令:clevis luks list -d /dev/sda2 1: tpm2 '{"hash":"sha256","key":"rsa"}'# clevis luks list -d /dev/sda2 1: tpm2 '{"hash":"sha256","key":"rsa"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.9. 使用 PKCS #11 pin 配置 LUKS 加密卷的解锁 复制链接链接已复制到粘贴板!
您可以使用与 PKCS #11 兼容的设备(可以是智能卡或硬件安全模块(HSM))配置 LUKS 加密卷的解锁。
使用 Clevis PKCS #11 pin 自动解锁加密卷也需要更改 /etc/crypttab 文件,该文件配置 systemd 管理器,以使用 AF_UNIX 套接字,来等待用于解锁卷的密钥短语,而不是通过控制台提示用户。
Clevis PKCS #11 单元文件在 /run/systemd/clevis-pkcs11.sock 文件中配置套接字,以发送和接收有关磁盘解锁的信息。对于通过 Clevis PKCS #11 pin 解锁的磁盘,您必须将套接字文件配置为一个密钥文件。
先决条件
- PKCS #11 设备已配置并可访问。
-
clevis-pin-pkcs11软件包已安装。 -
至少有一个用于
clevis luks bind命令的空闲 LUKS 密码插槽。
流程
识别 PBD 的 LUKS 加密卷。在以下示例中,块设备是指 /dev/sda2 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 识别您要用来解锁卷的 PKCS #11 设备的 URI,例如:
pkcs11-tool -L | grep uri uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29
$ pkcs11-tool -L | grep uri uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
clevis luks bind命令将卷绑定到一个 PKCS #11 设备,例如:clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public"}' … Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:# clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public"}' … Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令执行以下步骤:
- 使用与 LUKS 主密钥相同的无序状态测量法创建新的密钥。
- 使用 Clevis 加密新密钥.
- 将 Clevis JWE 对象存储在 LUKS2 标头令牌中,或者使用 LUKSMeta(如果使用非默认的 LUKS1 标头)。
- 启用与 LUKS 一起使用的新密钥。
可选:如果您的场景需要指定要使用的模块,请添加 module-path URI 参数:
clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2";model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public}'# clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2";model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用
clevis-luks-pkcs11-askpass.socket单元:systemctl enable --now clevis-luks-pkcs11-askpass.socket
# systemctl enable --now clevis-luks-pkcs11-askpass.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在文本编辑器中打开
/etc/crypttab文件,并识别包含您要通过 PKCS #11 pin 解锁的 LUKS 加密卷的行,例如:luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 - -
luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 - -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
/run/systemd/clevis-pkcs11.sock文件路径和keyfile-timeout选项替换破折号:luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 /run/systemd/clevis-pkcs11.sock keyfile-timeout=30s
luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 /run/systemd/clevis-pkcs11.sock keyfile-timeout=30sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当发生解锁错误并且系统需要通过控制台手动输入密码时,
keyfile-timeout选项提供一种回退机制。- 保存更改,退出编辑器。
要使早期引导系统处理磁盘绑定(这是解锁 root 文件系统所需的),请在已安装的系统上使用
dracut工具:dracut -fv --regenerate-all
# dracut -fv --regenerate-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新启动系统。
在以下引导过程中,系统会提示输入 PKCS #11 设备 PIN,并仅在输入正确的 PIN 时解密相应的配置的加密磁盘。
验证
您可以使用以下命令加密和解密文本信息,而不是手动测试引导过程:
echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=<PIN>"}' | clevis decrypt# echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=<PIN>"}' | clevis decryptCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<PIN>替换为 PIN 值。您必须输入这个 PIN 值,以解密消息。要验证 Clevis JWE 对象是否被成功放在 LUKS 标头中,请使用
clevis luks list命令,例如:clevis luks list -d /dev/sda2 1: pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II; serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key? module-path=/usr/lib64/libykcs11.so.2"}'# clevis luks list -d /dev/sda2 1: pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II; serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key? module-path=/usr/lib64/libykcs11.so.2"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.10. 手动从 LUKS 加密卷中删除 Clevis pin 复制链接链接已复制到粘贴板!
您可以手动删除 clevis luks bind 命令创建的元数据,并擦除包含 Clevis 添加的密码短语的密钥插槽。
从 LUKS 加密卷中删除 Clevis pin 的建议方法是通过 clevis luks unbind 命令。使用 clevis luks unbind 的删除过程只包含一个步骤,适用于 LUKS1 和 LUKS2 卷。以下示例命令删除绑定步骤创建的元数据,并擦除了 /dev/sda2 设备上的密钥插槽 1 :
clevis luks unbind -d /dev/sda2 -s 1
# clevis luks unbind -d /dev/sda2 -s 1
先决条件
- 具有 Clevis 绑定的 LUKS 加密卷。
步骤
检查卷(如
/dev/sda2)是使用哪个 LUKS 版本加密的,并标识绑定到 Clevis 的插槽和令牌:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,Clevis 令牌标识为
0,关联的密钥插槽是1。如果是 LUKS2 加密,请删除令牌:
cryptsetup token remove --token-id 0 /dev/sda2
# cryptsetup token remove --token-id 0 /dev/sda2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的设备是由 LUKS1 加密的,其在
cryptsetup luksDump命令的输出中标识为Version: 1字符串,请使用luksmeta wipe命令执行这个额外步骤:luksmeta wipe -d /dev/sda2 -s 1
# luksmeta wipe -d /dev/sda2 -s 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 擦除包含 Clevis 密码短语的密钥插槽:
cryptsetup luksKillSlot /dev/sda2 1
# cryptsetup luksKillSlot /dev/sda2 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.11. 使用 Kickstart 配置 LUKS 加密的卷的自动注册 复制链接链接已复制到粘贴板!
您可以配置一个使用 Clevis 注册 LUKS 加密卷的自动安装过程。
流程
指示 Kickstart 对磁盘进行分区,以便使用临时密码为所有挂载点(除
/boot)启用了 LUKS 加密。注册过程的这一步中的密码是临时密码。part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass
part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppassCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,兼容 OSPP 的系统需要更复杂的配置,例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在
%packages部分中列出它们来安装相关的 Clevis 软件包:%packages clevis-dracut clevis-luks clevis-systemd %end
%packages clevis-dracut clevis-luks clevis-systemd %endCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 可选:要确保您可以根据需要手动解锁加密的卷,请在删除临时密码短语前 向卷添加一个强密码短语 。
在
%post部分中调用clevis luks bind来执行绑定。之后,删除临时密码:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的配置依赖于在早期引导过程中需要网络的 Tang pin,或者您使用带有静态 IP 配置的 NBDE 客户端,则您必须修改
dracut命令,如 配置带有静态 IP 配置的 NBDE 客户端 中所述。警告cryptsetup luksRemoveKey命令可以防止对应用该命令的 LUKS2 设备进行任何进一步的管理。您只能对 LUKS1 设备使用dmsetup命令恢复删除的主密钥。详情请查看您系统上的dmsetup (8)手册页。
在使用 TPM 2.0 策略而不是 Tang 服务器时,您可以使用类似的流程。
9.12. 配置 LUKS 加密的可移动存储设备的自动解锁 复制链接链接已复制到粘贴板!
您可以设置 LUKS 加密的 USB 存储设备的自动解锁过程。
步骤
要自动解锁 LUKS 加密的可移动存储设备,如 USB 驱动器,请安装
clevis-udisks2软件包:dnf install clevis-udisks2
# dnf install clevis-udisks2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启系统,然后使用
clevis luks bind命令执行绑定步骤,如 为自动解锁 LUKS 加密卷配置 NBDE 客户端 中所述,例如:clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'# clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 现在,可以在 GNOME 桌面会话中自动解锁 LUKS 加密的可移动设备。绑定到 Clevis 策略的设备也可以通过
clevis luks unlock命令解锁:clevis luks unlock -d /dev/sdb1
# clevis luks unlock -d /dev/sdb1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在使用 TPM 2.0 策略而不是 Tang 服务器时,您可以使用类似的流程。
9.13. 部署高可用性 NBDE 系统 复制链接链接已复制到粘贴板!
Tang 提供两种构建高可用性部署的方法:
- 客户端冗余(推荐)
-
客户端应配置成能够绑定到多个 Tang 服务器。在此设置中,每个 Tang 服务器都有自己的密钥,客户端可以通过联系这些服务器的子集来进行解密。Clevis 已通过其
sss插件支持此工作流。红帽建议对高可用性部署使用这个方法。 - 密钥共享
-
出于冗余的目的,可以部署多个 Tang 实例。要设置第二个或后续的实例,请安装
tang软件包,并使用rsync,通过SSH将密钥目录复制到新主机上。请注意,红帽不推荐此方法,因为共享密钥会增加密钥的风险,需要额外的自动化基础设施。
使用 Shamir 的 Secret 共享的高可用性 NBDE
Shamir 的 Secret 共享(SSS)是一种加密方案,可将Secret 分成多个独特的部分。要重建 secret,需要几个部分。数字称为阈值,SSS 也被称为阈值方案。
Clevis 提供 SSS 的实施。它创建一个密钥,并将其分为若干个片。每片都使用另一个 pin 进行加密,甚至包括递归 SSS。另外,您可以定义阈值 t。如果 NBDE 部署至少解密了 t 片,那么它将恢复加密密钥,并且解密过程会成功。当 Clevis 检测到比阈值中指定的部分少时,它会打印错误消息。
示例 1:带有两个 Tang 服务器的冗余
当两个 Tang 服务器中至少有一个可用时,以下命令会解密 LUKS 加密设备:
clevis luks bind -d /dev/sda1 sss '{"t":1,"pins":{"tang":[{"url":"http://tang1.srv"},{"url":"http://tang2.srv"}]}}'
# clevis luks bind -d /dev/sda1 sss '{"t":1,"pins":{"tang":[{"url":"http://tang1.srv"},{"url":"http://tang2.srv"}]}}'
上一命令使用以下配置方案:
在此配置中,SSS 阈值 t 设置为 1,如果列出的两个 tang 服务器中至少有一台可用,则 clevis luks bind 命令可以成功重建 secret。
示例 2:Tang 服务器和 TPM 设备上共享的 secret
当 tang 服务器和 tpm2 设备都可用时,以下命令可成功解密 LUKS 加密设备:
clevis luks bind -d /dev/sda1 sss '{"t":2,"pins":{"tang":[{"url":"http://tang1.srv"}], "tpm2": {"pcr_ids":"0,7"}}}'
# clevis luks bind -d /dev/sda1 sss '{"t":2,"pins":{"tang":[{"url":"http://tang1.srv"}], "tpm2": {"pcr_ids":"0,7"}}}'
现在 SSS 阀值 't' 设置为 '2' 的配置方案是:
9.14. NBDE 网络中虚拟机的部署 复制链接链接已复制到粘贴板!
clevis luks bind 命令不会改变 LUKS 主密钥。这意味着,如果您创建了一个在虚拟机或云环境中使用的 LUKS 加密镜像,则所有运行此镜像的实例都会共享一个主密钥。这极其不安全,应始终避免。
这不是 Clevis 的一个限制,而是 LUKS 的设计原则。如果您的场景需要在云中有加密的根卷,请也对云中 Red Hat Enterprise Linux 的每个实例执行安装过程(通常使用 Kickstart)。如果没有共享 LUKS 主密钥,就无法共享镜像。
要在虚拟化环境中部署自动解锁,请将 lorax 或 virt-install 等系统与 Kickstart 文件一起使用(请参阅 使用 Kickstart 配置 LUKS 加密卷的自动注册)或其他自动调配工具,以确保每个加密的虚拟机都有一个唯一的主密钥。
9.15. 使用 NBDE 为云环境构建可自动注册的虚拟机镜像 复制链接链接已复制到粘贴板!
在云环境中部署可自动注册的加密镜像会带来一系列独特的挑战。与其他虚拟化环境一样,建议减少从一个镜像启动的实例数量,以避免共享 LUKS 主密钥。
因此,最佳实践是创建自定义映像,这些映像不在任何公共存储库中共享,为部署有限数量的实例提供了基础。要创建的实例的确切数量应当由部署的安全策略定义,并且基于与 LUKS 主密钥攻击向量相关联的风险容忍度。
要构建启用 LUKS 的自动化部署,应当使用 Lorax 或 virt-install 等系统以及一个 Kickstart 文件,来确保镜像构建过程中主密钥的唯一性。
云环境支持我们在这里考虑的两种 Tang 服务器部署选项。首先,Tang 服务器可以在云环境本身中部署。其次,Tang 服务器可以部署在云外的独立的基础架构上,并且这两个基础架构之间有 VPN 连接。
在云中原生部署 Tang 可以轻松部署。但是,考虑到它与其他系统的密文数据持久性层共享基础设施,因此 Tang 服务器的私钥和 Clevis 元数据可以存储在同一个物理磁盘上。对这个物理磁盘的访问允许密文数据的完全泄露。
始终在存储数据的地方和运行 Tang 的系统之间保持物理隔离。在云和 Tang 服务器之间的这种隔离可确保 Tang 服务器的私钥不会被意外与 Clevis 元数据组合。如果云基础设施面临风险,它还提供了对 Tang 服务器的本地控制。
9.16. 将 Tang 部署为容器 复制链接链接已复制到粘贴板!
tang 容器镜像为在 OpenShift Container Platform(OCP)集群中或独立的虚拟机中运行的 Clevis 客户端提供 Tang-server 解密功能。
先决条件
-
podman软件包及其依赖项已安装在系统上。 -
你可以使用
podman login registry.redhat.io命令登录到registry.redhat.io容器目录。如需更多信息,请参阅 红帽容器注册表身份验证。 - Clevis 客户端安装在包含 LUKS 加密卷的系统上,您希望使用 Tang 服务器自动解锁这些卷。
步骤
从
registry.redhat.io注册中心中拉取tang容器镜像:podman pull registry.redhat.io/rhel10/tang
# podman pull registry.redhat.io/rhel10/tangCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行容器,指定其端口,并指定到 Tang 密钥的路径。前面的示例运行
tang容器,指定端口 7500,并指示到/var/db/tang目录的 Tang 密钥的路径:podman run -d -p 7500:7500 -v tang-keys:/var/db/tang --name tang registry.redhat.io/rhel10/tang
# podman run -d -p 7500:7500 -v tang-keys:/var/db/tang --name tang registry.redhat.io/rhel10/tangCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,Tang 默认使用端口 80,但这可能与其他服务冲突,如 Apache HTTP 服务器。
可选:为了提高安全性,请定期轮转 Tang 密钥。您可以使用
tangd-rotate-keys脚本,例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在包含 LUKS 加密卷的系统上,通过 Tang 服务器自动解锁,检查 Clevis 客户端是否可以使用 Tang 加密和解密纯文本消息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 localhost URL 上的 Tang 服务器可用并通过端口 7500 进行通信时,上一示例命令在其输出的末尾显示
test字符串。
9.17. 使用 RHEL 系统角色配置 NBDE 复制链接链接已复制到粘贴板!
您可以使用 nbde_client 和 nbde_server RHEL 系统角色,通过使用 Clevis 和 Tang 来自动部署基于策略的解密(PBD)解决方案。rhel-system-roles 包中包含了这些系统角色、相关的例子以及参考文档。
9.17.1. 使用 nbde_server RHEL 系统角色设置多个 Tang 服务器 复制链接链接已复制到粘贴板!
通过使用 nbde_server 系统角色,您可以部署和管理 Tang 服务器,来作为自动磁盘加密解决方案的一部分。此角色支持以下功能:
- 轮转 Tang 密钥
- 部署和备份 Tang 密钥
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此示例 playbook 确保部署 Tang 服务器和密钥轮转。
示例 playbook 中指定的设置包括如下:
nbde_server_manage_firewall: true-
使用
firewall系统角色管理nbde_server角色使用的端口。 nbde_server_manage_selinux: true使用
selinux系统角色管理nbde_server角色使用的端口。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.nbde_server/README.md文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在您的 NBDE 客户端上,使用以下命令验证您的 Tang 服务器是否正常工作。命令必须返回与您为加密和解密传递的相同的消息:
ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt' test# ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt' testCopy to Clipboard Copied! Toggle word wrap Toggle overflow
9.17.2. 使用 nbde_client RHEL 系统角色设置带有 DHCP 的 Clevis 客户端 复制链接链接已复制到粘贴板!
nbde_client 系统角色使您能够以自动化的方式部署多个Clevis客户端。
此角色支持将 LUKS 加密卷绑定到一个或多个网络绑定的(NBDE)服务器 - Tang 服务器。您可以使用密码短语保留现有的卷加密,或者将其删除。删除密码短语后,您只能使用 NBDE 解锁卷。当卷最初是使用在置备系统后会删除的临时密钥或密码进行加密时,这非常有用,
如果您同时提供密语和密钥文件,角色将使用您首先提供的那一个。如果找不到任何有效密语或密码,它将尝试从现有的绑定中检索密码短语。
基于策略的解密(PBD)将绑定定义为设备到插槽的映射。这意味着对同一个设备你可以有多个绑定。默认插槽是插槽 1。
nbde_client 系统角色只支持 Tang 绑定。因此,您无法将其用于 TPM2 绑定。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 已使用 LUKS 加密的卷。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个示例 playbook 配置 Clevis 客户端,以便在两个 Tang 服务器中至少有一个可用时自动解锁两个 LUKS 加密的卷。
示例 playbook 中指定的设置包括如下:
state: present-
state的值表示运行 playbook 后的配置。使用present值来创建新绑定或更新现有绑定。与clevis luks bind命令不同,您可以使用state: present来覆盖其设备插槽中的现有绑定。absent的值会删除指定的绑定。 nbde_client_early_boot: truenbde_client角色确保 Tang pin 的网络默认在早期引导过程中可用。如果您需要禁用此功能,请在 playbook 中添加nbde_client_early_boot: false变量。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md文件。
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在 NBDE 客户端上,检查应被您的 Tang 服务器自动解锁的加密卷是否在其 LUKS pin 中包含相应的信息:
ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root' 1: tang '{"url":"<http://server1.example.com/>"}' 2: tang '{"url":"<http://server2.example.com/>"}'# ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root' 1: tang '{"url":"<http://server1.example.com/>"}' 2: tang '{"url":"<http://server2.example.com/>"}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果不使用
nbde_client_early_boot: false变量,请验证绑定是否可用于早期引导,例如:ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks' lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
# ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks' lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.17.3. 使用 nbde_client RHEL 系统角色设置静态 IP Clevis 客户端 复制链接链接已复制到粘贴板!
nbde_client RHEL 系统角色只支持具有动态主机配置协议(DHCP)的场景。在具有静态 IP 配置的 NBDE 客户端上,您必须将网络配置作为内核引导参数传递。
通常,管理员希望重复使用 playbook,且不会为 Ansible 在早期引导过程中为其分配静态 IP 地址的每个主机维护单独的 playbook。在这种情况下,您可以在 playbook 中使用变量,并在外部文件中提供设置。因此,您只需要一个 playbook 和一个带有设置的文件。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。 - 已使用 LUKS 加密的卷。
流程
创建一个带有主机的网络设置的文件,如
static-ip-settings-clients.yml,并添加您要动态分配给主机的值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此 playbook 为
~/static-ip-settings-clients.yml文件中列出的每个主机动态读取某些值。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 10 章 使用 fapolicyd 阻止和允许应用程序 复制链接链接已复制到粘贴板!
根据规则集设置和强制实施允许或拒绝应用程序执行的策略,可有效防止执行未知的和具有潜在恶意的软件。
10.1. fapolicyd 简介 复制链接链接已复制到粘贴板!
fapolicyd 软件框架根据用户定义的策略来控制应用程序的执行。这是防止在系统上运行不受信任的和可能具有恶意的应用程序的最有效的方法之一。
fapolicyd 框架提供以下组件。
-
fapolicyd服务 -
fapolicyd命令行工具 -
fapolicydRPM 插件 -
fapolicyd规则语言 -
fagenrules脚本
管理员可以为任何应用程序定义 allow 和 deny 执行规则,并根据路径、哈希、MIME 类型或信任进行审计。
fapolicyd 框架引入了信任的概念。在被系统软件包管理器正确安装后,应用程序是可信的,因此它会在系统 RPM 数据库中注册。fapolicyd 守护进程使用 RPM 数据库作为受信任的二进制文件和脚本的列表。fapolicyd RPM 插件注册由 {PackageManagerName} 软件包管理器或 RPM 软件包管理器处理的任何系统更新。插件会通知 fapolicyd 守护进程有关此数据库中的更改。添加应用程序的其他方法需要创建自定义规则,并重新启动 fapolicyd 服务。
fapolicyd 服务配置位于 /etc/fapolicyd/ 目录中,结构如下。
-
/etc/fapolicyd/fapolicyd.trust文件包含一个可信文件的列表。您还可以在/etc/fapolicyd/trust.d/目录中使用多个信任文件。 -
包含
allow和deny执行规则的文件的/etc/fapolicyd/rules.d/目录。fagenrules脚本将这些组件规则文件合并到/etc/fapolicyd/compiled.rules文件中。 -
fapolicyd.conf文件包含守护进程的配置选项。此文件主要用于性能调优目的。
/etc/fapolicyd/rules.d/ 中的规则被组织在几个文件中,每个文件自代表不同的策略目标。对应文件名开头的数字决定了 /etc/fapolicyd/compiled.rules 中的顺序:
- 10
- 语言规则.
- 20
- Dracut 相关的规则。
- 21
- 更新程序的规则。
- 30
- 模式。
- 40
- ELF 规则。
- 41
- 共享对象规则。
- 42
- 可信 ELF 规则。
- 70
- 可信语言规则。
- 72
- shell 规则.
- 90
- 拒绝执行规则。
- 95
- 允许打开的规则。
您可以使用以下一种方法进行 fapolicyd 完整性检查:
- 文件大小检查
- SHA-256 哈希的比较
- 完整性映射架构(IMA)子系统
默认情况下,fapolicyd 不进行完整性检查。根据文件大小进行完整性检查很快,但攻击者可以替换文件的内容并保留其字节大小。计算和检查 SHA-256 校验和更安全,但这会影响系统性能。fapolicyd.conf 中的 integrity = ima 选项需要在包含可执行文件的所有文件系统上支持文件扩展属性(也称为 xattr)。
10.2. 部署 fapolicyd 复制链接链接已复制到粘贴板!
在部署 fapolicyd 应用程序允许列表框架时,您可以首先在 permissive 模式下尝试配置,或者直接在默认配置中启用服务。
流程
安装
fapolicyd软件包:dnf install fapolicyd
# dnf install fapolicydCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:要先尝试配置,请将模式改为 permissive。
在您选择的文本编辑器中打开
/etc/fapolicyd/fapolicyd.conf文件,例如:vi /etc/fapolicyd/fapolicyd.conf
# vi /etc/fapolicyd/fapolicyd.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
permissive选项的值从0改为1,保存文件,并退出编辑器:permissive = 1
permissive = 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以在启动服务前使用
fapolicyd --debug-deny --permissive命令调试配置。如需更多信息,请参阅 故障排除与 fapolicyd 相关的问题 部分。
启用并启动
fapolicyd服务:systemctl enable --now fapolicyd
# systemctl enable --now fapolicydCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您通过
/etc/fapolicyd/fapolicyd.conf启用了 permissive 模式:设置 Audit 服务,以记录
fapolicyd事件:auditctl -w /etc/fapolicyd/ -p wa -k fapolicyd_changes service try-restart auditd
# auditctl -w /etc/fapolicyd/ -p wa -k fapolicyd_changes # service try-restart auditdCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用您的应用程序。
检查 Audit 日志中是否有
fanotify拒绝,例如:ausearch -ts recent -m fanotify
# ausearch -ts recent -m fanotifyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 调试后,通过将相应的值改回
permissive = 0来禁用 permissive 模式,然后重启服务:systemctl restart fapolicyd
# systemctl restart fapolicydCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
fapolicyd服务是否正常运行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以没有 root 权限的用户身份登录,检查
fapolicyd是否正常工作,例如:cp /bin/ls /tmp /tmp/ls bash: /tmp/ls: Operation not permitted
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permittedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.3. 使用其它信任源将文件标记为可信 复制链接链接已复制到粘贴板!
fapolicyd 框架信任 RPM 数据库中包含的文件。您可以通过在 /etc/fapolicyd/fapolicyd.trust 纯文本文件或 /etc/fapolicyd/trust.d/ 目录下添加相应的条目来将额外文件标记为信任的文件,这支持将信任的文件列表分割成多个文件。您可以直接使用文本编辑器或通过 fapolicyd-cli 命令来修改 fapolicyd.trust 或 /etc/fapolicyd/trust.d 中的文件。
由于性能的原因,使用 fapolicyd.trust 或 trust.d/ 将文件标记为信任的比编写自定义的 fapolicyd 规则要好些。
先决条件
-
fapolicyd框架部署在您的系统上。
流程
将自定义二进制文件复制到所需的目录中,例如:
cp /bin/ls /tmp /tmp/ls bash: /tmp/ls: Operation not permitted
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permittedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将自定义二进制文件标记为信任的,并将相应的条目添加到
/etc/fapolicyd/trust.d/中的myapp文件中:fapolicyd-cli --file add /tmp/ls --trust-file myapp
# fapolicyd-cli --file add /tmp/ls --trust-file myappCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
如果您跳过
--trust-file选项,则之前的命令会将相应的行添加到/etc/fapolicyd/fapolicyd.trust。 -
要将目录中所有现有的文件标记为信任的,请将目录路径提供为
--file选项的参数,例如:fapolicyd-cli --file add /tmp/my_bin_dir/ --trust-file myapp。
-
如果您跳过
更新
fapolicyd数据库:fapolicyd-cli --update
# fapolicyd-cli --updateCopy to Clipboard Copied! Toggle word wrap Toggle overflow
更改信任的文件或目录的内容会改变其校验和,因此 fapolicyd 不再将它们视为信任的。
要使新内容再次被信任,请使用 fapolicyd-cli --file update 命令刷新文件信任数据库。如果没有提供任何参数,则整个数据库都会刷新。或者,您可以指定特定文件或目录的路径。然后,使用 fapolicyd-cli --update 更新数据库。
验证
检查您的自定义二进制文件现在是否可以执行,例如:
/tmp/ls ls
$ /tmp/ls lsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.4. 为 fapolicyd 添加自定义 allow 和 deny 规则 复制链接链接已复制到粘贴板!
fapolicyd 包中的默认规则集不影响系统功能。对于自定义场景,如将二进制文件和脚本存储在非标准目录中,或者在没有 dnf 或 rpm 安装程序的情况下添加应用程序,您必须将额外文件标记为可信或添加新的自定义规则。
对于基本场景,首选 使用其他信任源将文件标记为可信。在更高级的场景中,如仅允许为特定用户和组标识符来执行一个自定义二进制文件,请将新的自定义规则添加到 /etc/fapolicyd/rules.d/ 目录中。
以下步骤演示了如何添加新的规则以允许自定义二进制文件。
先决条件
-
fapolicyd框架部署在您的系统上。
流程
将自定义二进制文件复制到所需的目录中,例如:
cp /bin/ls /tmp /tmp/ls bash: /tmp/ls: Operation not permitted
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permittedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止
fapolicyd服务:systemctl stop fapolicyd
# systemctl stop fapolicydCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 debug 模式来识别相应的规则。因为
fapolicyd --debug命令的输出很冗长,所以您只能按 Ctrl+C 或终止相应的进程来停止它,并将错误输出重定向到文件中。在这种情况下,您可以使用--debug-deny选项而不是--debug来限制输出只访问拒绝:fapolicyd --debug-deny 2> fapolicy.output & [1] 51341
# fapolicyd --debug-deny 2> fapolicy.output & [1] 51341Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以在另一个终端中运行
fapolicyddebug 模式。重复
fapolicyd拒绝的命令:/tmp/ls bash: /tmp/ls: Operation not permitted
$ /tmp/ls bash: /tmp/ls: Operation not permittedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在前台恢复并按 Ctrl+C 来停止 debug 模式:
fg fapolicyd --debug 2> fapolicy.output ^C ...
# fg fapolicyd --debug 2> fapolicy.output ^C ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,杀掉
fapolicyddebug 模式的进程:kill 51341
# kill 51341Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查找拒绝执行应用程序的规则:
cat fapolicy.output | grep 'deny_audit' ... rule=13 dec=deny_audit perm=execute auid=0 pid=6855 exe=/usr/bin/bash : path=/tmp/ls ftype=application/x-executable trust=0
# cat fapolicy.output | grep 'deny_audit' ... rule=13 dec=deny_audit perm=execute auid=0 pid=6855 exe=/usr/bin/bash : path=/tmp/ls ftype=application/x-executable trust=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 找到包含阻止自定义二进制文件执行的规则的文件。在这种情况下,
deny_audit perm=execute规则属于90-deny-execute.rules文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将一个新的
allow规则添加到规则文件 之前 的文件中,该文件包含了拒绝执行/etc/fapolicyd/rules.d/目录中自定义二进制文件的规则:touch /etc/fapolicyd/rules.d/80-myapps.rules vi /etc/fapolicyd/rules.d/80-myapps.rules
# touch /etc/fapolicyd/rules.d/80-myapps.rules # vi /etc/fapolicyd/rules.d/80-myapps.rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将以下规则插入到
80-myapps.rules文件中:allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0
allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,您可以通过将以下规则添加到
/etc/fapolicyd/rules.d/中的规则文件中,来允许执行/tmp目录中所有的二进制文件:allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ trust=0
allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ trust=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要要使规则对指定目录下的所有目录递归有效,请将斜杠添加到规则中
dir=参数值的末尾(上例中的/tmp/)。要防止自定义二进制文件内容的更改,请使用 SHA-256 校验和定义所需的规则:
sha256sum /tmp/ls 780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836 ls
$ sha256sum /tmp/ls 780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836 lsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将规则改为以下定义:
allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836
allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查编译的列表是否与
/etc/fapolicyd/rules.d/中设置的规则不同,并更新列表,该列表存储在/etc/fapolicyd/compiled.rules文件中:fagenrules --check /usr/sbin/fagenrules: Rules have changed and should be updated fagenrules --load
# fagenrules --check /usr/sbin/fagenrules: Rules have changed and should be updated # fagenrules --loadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查您的自定义规则是否在阻止执行的规则之前的
fapolicyd规则列表中:fapolicyd-cli --list ... 13. allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0 14. deny_audit perm=execute all : all ...
# fapolicyd-cli --list ... 13. allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0 14. deny_audit perm=execute all : all ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
fapolicyd服务:systemctl start fapolicyd
# systemctl start fapolicydCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查您的自定义二进制文件现在是否可以执行,例如:
/tmp/ls ls
$ /tmp/ls lsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5. 启用 fapolicyd 完整性检查 复制链接链接已复制到粘贴板!
默认情况下,fapolicyd 不执行完整性检查。您可以配置 fapolicyd,来通过比较文件大小或 SHA-256 哈希执行完整性检查。您还可以使用完整性度量架构(IMA)子系统来设置完整性检查。
先决条件
-
fapolicyd框架部署在您的系统上。
流程
在您选择的文本编辑器中打开
/etc/fapolicyd/fapolicyd.conf文件,例如:vi /etc/fapolicyd/fapolicyd.conf
# vi /etc/fapolicyd/fapolicyd.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
integrity选项的值从none改为sha256,保存文件并退出编辑器:integrity = sha256
integrity = sha256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
fapolicyd服务:systemctl restart fapolicyd
# systemctl restart fapolicydCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
备份用于验证的文件:
cp /bin/more /bin/more.bak
# cp /bin/more /bin/more.bakCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更改
/bin/more二进制文件的内容:cat /bin/less > /bin/more
# cat /bin/less > /bin/moreCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以普通用户身份使用更改的二进制文件:
su example.user /bin/more /etc/redhat-release bash: /bin/more: Operation not permitted
# su example.user $ /bin/more /etc/redhat-release bash: /bin/more: Operation not permittedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 恢复更改:
mv -f /bin/more.bak /bin/more
# mv -f /bin/more.bak /bin/moreCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.7. 使用 fapolicyd RHEL 系统角色防止用户执行不可靠的代码 复制链接链接已复制到粘贴板!
您可以使用 fapolicyd RHEL 系统角色自动化 fapolicyd 服务的安装和配置。使用此角色,您可以远程配置服务,以允许用户只执行可信的应用程序,例如 RPM 数据库和允许列表中列出的应用程序。另外,服务也可以在执行允许的应用程序之前执行完整性检查。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
fapolicyd_setup_permissive: <true|false>-
启用或禁用向内核发送策略决策以强制执行。出于调试和测试目的,将此变量设置为
false。 fapolicyd_setup_integrity: <type_type>定义完整性检查方法。您可以设置以下值之一:
-
none(默认):禁用完整性检查。 -
size:服务仅比较允许的应用程序的文件大小。 -
ima: 服务检查内核完整性测量架构(IMA)存储在文件的扩展属性中的 SHA-256 哈希。此外,服务也执行大小检查。请注意,该角色不会配置 IMA 内核子系统。要使用这个选项,您必须手动配置 IMA 子系统。 -
sha256:该服务比较允许的应用程序的 SHA-256 哈希。
-
fapolicyd_setup_trust: <trust_backends>-
定义信任后端的列表。如果您包含了
file后端,请在fapolicyd_add_trusted_file列表中指定允许的可执行文件。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.fapolicyd.README.md文件。验证 playbook 语法:
ansible-playbook ~/playbook.yml --syntax-check
$ ansible-playbook ~/playbook.yml --syntax-checkCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
以用户身份执行不在允许列表中的二进制应用程序:
ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>' bash: line 1: /bin/not_authorized_application: Operation not permitted non-zero return code
$ ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>' bash: line 1: /bin/not_authorized_application: Operation not permitted non-zero return codeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 11 章 保护系统免受入侵 USB 设备的攻击 复制链接链接已复制到粘贴板!
USB 设备可能会加载间谍软件、恶意软件或特洛伊木马,这可能会窃取你的数据或破坏你的系统。作为 Red Hat Enterprise Linux 管理员,您可以使用USBGuard 来防止此类 USB 攻击。
11.1. USBGuard 复制链接链接已复制到粘贴板!
借助 USBGuard 软件框架,您可以根据内核中的 USB 设备授权功能,使用允许和禁止设备的基本列表来防止系统免受入侵 USB 设备的攻击。
USBGuard 框架提供以下组件:
- 带有用于动态交互和策略实施的进程间通信(IPC)接口的系统服务组件
-
与正在运行的
usbguard系统服务交互的命令行接口 - 编写 USB 设备授权策略的规则语言
- 用于与共享库中实施的系统服务组件交互的 C++ API
usbguard系统服务配置文件(/etc/usbguard/usbguard-daemon.conf)包括授权用户和组使用 IPC 接口的选项。
系统服务提供 USBGuard 公共 IPC 接口。在 Red Hat Enterprise Linux 中,默认对此接口的访问仅限于 root 用户。
考虑设置 IPCAccessControlFiles 选项(推荐)或 IPCAllowedUsers 和 IPCAllowedGroups 选项,来限制对 IPC 接口的访问。
确保您没有将访问控制列表(ACL)保持为未配置状态,因为这会将 IPC 接口公开给所有本地用户,并允许他们操作 USB 设备的授权状态,并修改 USBGuard 策略。
11.2. 安装 USBGuard 复制链接链接已复制到粘贴板!
使用这个流程安装并启动 USBGuard 框架。
流程
安装
usbguard软件包:dnf install usbguard
# dnf install usbguardCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建初始规则集:
usbguard generate-policy > /etc/usbguard/rules.conf
# usbguard generate-policy > /etc/usbguard/rules.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
usbguard守护进程,并确保它会在引导时自动启动:systemctl enable --now usbguard
# systemctl enable --now usbguardCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
usbguard服务是否正在运行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出 USBGuard 识别的 USB 设备:
usbguard list-devices 4: allow id 1d6b:0002 serial "0000:02:00.0" name "xHCI Host Controller" hash...
# usbguard list-devices 4: allow id 1d6b:0002 serial "0000:02:00.0" name "xHCI Host Controller" hash...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.3. 使用 CLI 阻止和授权 USB 设备 复制链接链接已复制到粘贴板!
您可以在终端中使用 usbguard 命令,将 USBGuard 设置为允许、阻止或拒绝特定的 USB 设备。只要 USBGuard 正在运行,此设置就会保持不变。USBGuard 使用术语 block 和 reject,其含义如下:
block- 现在不要与此设备进行交互。
reject- 忽略此设备,就好像它不存在一样。
先决条件
-
usbguard服务已安装并运行。
流程
通过列出 USBGuard 认可的设备来确定 USB 设备的 ID:
usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
# usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50Copy to Clipboard Copied! Toggle word wrap Toggle overflow 授权设备与系统进行交互:
usbguard allow-device <ID>
# usbguard allow-device <ID>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 取消授权并删除设备:
usbguard reject-device <ID>
# usbguard reject-device <ID>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 取消授权并保留设备:
usbguard block-device <ID>
# usbguard block-device <ID>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.4. 永久阻止和授权 USB 设备 复制链接链接已复制到粘贴板!
您可以使用 -p 选项永久阻止和授权一个 USB 设备。这会在当前策略中添加一个特定于设备的规则,并在重启后保持不变。USBGuard 使用术语 block 和 reject,其含义如下:
block- 现在不要与此设备进行交互。
reject- 忽略此设备,就好像它不存在一样。
先决条件
-
usbguard服务已安装并运行。
流程
配置 SELinux,以允许
usbguard守护进程编写规则。显示与
usbguard相关的semanage布尔值。semanage boolean -l | grep usbguard usbguard_daemon_write_conf (off , off) Allow usbguard to daemon write conf usbguard_daemon_write_rules (on , on) Allow usbguard to daemon write rules
# semanage boolean -l | grep usbguard usbguard_daemon_write_conf (off , off) Allow usbguard to daemon write conf usbguard_daemon_write_rules (on , on) Allow usbguard to daemon write rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
usbguard_daemon_write_rules布尔值已关闭,请打开它。semanage boolean -m --on usbguard_daemon_write_rules
# semanage boolean -m --on usbguard_daemon_write_rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
通过列出 USBGuard 认可的设备来确定 USB 设备的 ID:
usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
# usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50Copy to Clipboard Copied! Toggle word wrap Toggle overflow 永久授权设备与系统进行交互:
usbguard allow-device <ID> -p
# usbguard allow-device <ID> -pCopy to Clipboard Copied! Toggle word wrap Toggle overflow 永久取消授权并删除设备:
usbguard reject-device <ID> -p
# usbguard reject-device <ID> -pCopy to Clipboard Copied! Toggle word wrap Toggle overflow 永久取消授权并保留设备:
usbguard block-device <ID> -p
# usbguard block-device <ID> -pCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查 USBGuard 规则是否包含您所做的更改。
usbguard list-rules
# usbguard list-rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
11.5. 为 USB 设备创建自定义策略 复制链接链接已复制到粘贴板!
以下流程包含了为 USB 设备创建反映您场景需求的规则集的步骤。
先决条件
-
usbguard服务已安装并运行。 -
/etc/usbguard/rules.conf文件包含了由usbguard generate-policy命令生成的初始规则集。
流程
创建一个策略,其授权当前连接的 USB 设备,并将生成的规则保存到
rules.conf文件中:usbguard generate-policy --no-hashes > ./rules.conf
# usbguard generate-policy --no-hashes > ./rules.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow --no-hashes选项不会为设备生成哈希属性。在配置设置中避免哈希属性,因为它们可能不是永久的。在
rules.conf文件中,使用文本编辑器根据需要添加、删除或编辑规则。例如,以下规则只允许带有一个大容量存储接口的设备与系统进行交互:allow with-interface equals { 08:*:* }allow with-interface equals { 08:*:* }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关详细的规则语言描述和更多示例,请参阅
usbguard-rules.conf(5)手册页。安装更新的策略:
install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
usbguard守护进程以应用您的更改:systemctl restart usbguard
# systemctl restart usbguardCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查您的自定义规则是否在活动的策略中,例如:
usbguard list-rules ... 4: allow with-interface 08:*:* ...
# usbguard list-rules ... 4: allow with-interface 08:*:* ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.6. 为 USB 设备创建结构化自定义策略 复制链接链接已复制到粘贴板!
您可以在 /etc/usbguard/rules.d/ 目录中的多个 .conf 文件中组织自定义 USBGuard 策略。然后 usbguard-daemon 将主 rules.conf 文件与目录中的 .conf 文件按字母顺序组合在一起。
先决条件
-
usbguard服务已安装并运行。
流程
创建一个授权当前连接的 USB 设备的策略,并将生成的规则保存到一个新的
.conf文件中,例如<policy.conf>。usbguard generate-policy --no-hashes > ./<policy.conf>
# usbguard generate-policy --no-hashes > ./<policy.conf>Copy to Clipboard Copied! Toggle word wrap Toggle overflow --no-hashes选项不会为设备生成哈希属性。在配置设置中避免哈希属性,因为它们可能不是永久的。使用您选择的文本编辑器打开
<policy.conf>文件,并选择具有您要记录的规则的行,例如:... allow id 04f2:0833 serial "" name "USB Keyboard" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...... allow id 04f2:0833 serial "" name "USB Keyboard" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将所选行复制到单独的
.conf文件中。注意文件名开头的两位数字指定守护进程读取配置文件的顺序。
例如,要将键盘的规则复制到一个新的
.conf文件中:grep "USB Keyboard" ./<policy.conf> > ./<10keyboards.conf>
# grep "USB Keyboard" ./<policy.conf> > ./<10keyboards.conf>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将新策略安装到
/etc/usbguard/rules.d/目录中。install -m 0600 -o root -g root <10keyboards.conf> /etc/usbguard/rules.d/<10keyboards.conf>
# install -m 0600 -o root -g root <10keyboards.conf> /etc/usbguard/rules.d/<10keyboards.conf>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将其余行移到主
rules.conf文件中。grep -v "USB Keyboard" ./policy.conf > ./rules.conf
# grep -v "USB Keyboard" ./policy.conf > ./rules.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装其余的规则。
install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新启动
usbguard守护进程,以应用您的更改。systemctl restart usbguard
# systemctl restart usbguardCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示所有活动的 USBGuard 规则。
usbguard list-rules ... 15: allow id 04f2:0833 serial "" name "USB Keyboard" hash "kxM/iddRe/WSCocgiuQlVs6Dn0VEza7KiHoDeTz0fyg=" parent-hash "2i6ZBJfTl5BakXF7Gba84/Cp1gslnNc1DM6vWQpie3s=" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...# usbguard list-rules ... 15: allow id 04f2:0833 serial "" name "USB Keyboard" hash "kxM/iddRe/WSCocgiuQlVs6Dn0VEza7KiHoDeTz0fyg=" parent-hash "2i6ZBJfTl5BakXF7Gba84/Cp1gslnNc1DM6vWQpie3s=" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示
/etc/usbguard/rules.d/目录中的rules.conf文件以及所有.conf文件的内容。cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.conf
# cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证活动的规则是否包含文件中的所有规则,并且顺序正确。
11.7. 授权用户和组使用 USBGuard IPC 接口 复制链接链接已复制到粘贴板!
默认情况下,只有 root 用户可以使用 USBGuard 公共 IPC 接口。除了 root 用户外,您可以授权一个特定的用户或组来使用这个接口。您可以通过编辑 /etc/usbguard/usbguard-daemon.conf 文件或使用 usbguard add-user 子命令来实现这一点。
先决条件
-
usbguard服务已安装并运行。 -
/etc/usbguard/rules.conf文件包含了由usbguard generate-policy命令生成的初始规则集。
流程
使用您要添加的规则编辑
/etc/usbguard/usbguard-daemon.conf文件。例如,要允许wheel组中的所有用户使用 IPC 接口,请添加此行:IPCAllowGroups=wheel
IPCAllowGroups=wheelCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用
usbguard命令添加用户或组。例如,以下命令使用户可以完全访问Devices和Exceptions部分,并可以列出和修改当前策略:usbguard add-user <user_name> --devices ALL --policy modify,list --exceptions ALL
# usbguard add-user <user_name> --devices ALL --policy modify,list --exceptions ALLCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<user_name>替换为应该接收这些权限的用户名。您可以使用
usbguard remove-user <user_name>命令删除为用户授予的权限。重启
usbguard守护进程以应用您的更改:systemctl restart usbguard
# systemctl restart usbguardCopy to Clipboard Copied! Toggle word wrap Toggle overflow
11.8. 将 USBguard 授权事件记录到 Linux 审计日志中 复制链接链接已复制到粘贴板!
默认情况下,usbguard 守护进程将事件记录到 /var/log/usbguard/usbguard-audit.log 文件中。您可以将 USBguard 授权事件的日志集成到标准的 Linux 审计日志中。
先决条件
-
usbguard服务已安装并运行。 -
auditd服务正在运行。
流程
在
/etc/usbguard/usbguard-daemon.conf文件中,将AuditBackend选项从FileAudit改为LinuxAudit:AuditBackend=LinuxAudit
AuditBackend=LinuxAuditCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重启
usbguard守护进程以应用配置更改:systemctl restart usbguard
# systemctl restart usbguardCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
查询 USB 授权事件的
audit守护进程日志,例如:ausearch -ts recent -m USER_DEVICE
# ausearch -ts recent -m USER_DEVICECopy to Clipboard Copied! Toggle word wrap Toggle overflow