使用 Keylime 保护 SLE Micro
- 解释
Keylime 是基于 TPM 的远程引导证明和运行时完整性测量服务。
- 原因
本文介绍如何在 SLE Micro 上配置和运行 Keylime。
- 工作量
读完本文大约需要 25 分钟。
- 目标
您将详细了解 Keylime - 它的工作原理,应如何配置它以及它是如何运行的。
- 要求
正在运行的 SLE Micro 实例
1 使用 Keylime 进行远程证明 #
随着保护设备免遭未经授权的更改的需求日益增长,远程证明 (RA) 这一安全机制的应用范围也不断扩大。借助 RA,主机(客户端)可以对其引导链状态以及远程主机(验证者)上运行的软件进行身份验证。RA 通常会与公钥加密(使用 TPM2)结合使用,这样发送的信息便只能被请求证明的服务读取,同时又可验证数据的有效性。
SLE Micro 上的远程证明通过 Keylime 实现。
1.1 术语 #
远程证明技术使用了以下术语:
- 认证密钥 (AK)
一种数据签名密钥,可证明数据来自真实的 TPM 且未被篡改。
- 用于测量的核心信任根
计算自己的哈希以及引导过程中下一步的哈希,是测量链的发起端。
- 背书密钥 (EK)
在生产 TPM 时永久嵌入其中的加密密钥。TPM 中存储的该密钥的公共部分和证书用于识别真实 TPM。
- 身份管理体系结构 (IMA)
提供相应方法来检测恶意更改文件行为的内核完整性子系统。
- 测量引导
引导序列中的每个组件在委派下一个组件执行之前用于计算下一个组件哈希的方法。该哈希会扩展 TPM 的一个或多个 PCR。系统会创建相应事件,以记录有关进行测量的位置以及测量的内容等信息。这类事件会随扩展的 PCR 值一起收集在事件日志中,并且可能会与代表健康状况良好的系统的预期值进行比较。
- 平台配置寄存器 (PCR)
TPM 中用于存储引导层哈希等数据的内存位置。只能通过不可逆的操作
extend
来更新 PCR。在 TPM 上可以使用quote
命令来获得当前 PCR 值的签名列表,在证明过程中,第三方可以对此引用进行验证。- 安全引导
引导过程中的每一步都会在启动下一步前检查加密签名,以确定该步骤是否可执行。
- 可信平台模块 (TPM)
系统中作为硬件存在或在固件中实施以充当信任根的一个独立安全加密处理器。TPM 提供了 PCR 来存储各个引导层的哈希。典型的 TPM 会提供多项功能,例如随机数字生成器、计数器或本地时钟。此外,它还存储了 24 个 PCR,并按每个支持的加密哈希函数(SHA1、SHA256、SHA384 或 SHA512)的内存库分组。
注意默认情况下,TPM 处于禁用状态。因此不会进行测量引导。要启用远程证明,请在 EFI/BIOS 菜单中启用 TPM。
- 安全有效负载
一种用于向健康状况良好的代理传递加密数据的机制。有效负载用于提供密钥、口令、证书、配置或进而可被代理使用的脚本。
1.2 Keylime 是什么? #
Keylime 是一款远程证明解决方案,可用于将 TPM 作为测量的信任根来监控远程节点的健康状况。利用 Keylime,您可以执行多种任务,例如:
验证测量引导期间扩展的 PCR。
创建分析并建立事件日志的断言。
建立远程系统中任意 PCR 的值的断言。
监控打开的文件或所执行文件的有效性。
通过安全有效负载向经过验证的节点传递加密数据。
执行在计算机未通过所认证的测量结果时触发的自定义脚本。
1.3 体系结构 #
Keylime 由代理、验证者、注册者和命令行工具 (tenant) 组成。代理位于需要接受认证的系统上。验证者和注册者位于执行代理注册和证明的远程系统上。请注意,SLE Micro 上仅可使用代理角色。有关每个组件的详细信息,请参见以下几节。
1.3.1 Keylime 代理 #
代理是在需要接受认证的系统上运行的服务。代理会向验证者发送事件日志、IMA 哈希以及关于测量引导的信息,并使用本地 TPM 作为数据有效性的证明者。
新代理启动时需要先在注册者中注册自己。为此,代理需要使用 TLS 证书来建立连接。TLS 证书由注册者生成,但用户需要手动将其安装到代理中。注册之后,代理会将其认证密钥和背书密钥的公共部分发送给注册者。注册者会在称为“身份凭证激活”的过程中向代理返回一个质询,该质询会验证代理的 TPM。当代理在注册者中注册后即可登记进行认证。
1.3.2 Keylime 注册者 #
注册者用于注册应接受认证的代理。注册者会收集代理的认证密钥,背书密钥的公共部分以及背书密钥证书,并会验证代理认证密钥是否属于背书密钥。
1.3.3 Keylime 验证者 #
验证者会对代理执行实际的证明,并会持续从代理那里提取所需证明数据(包括 PCR 值、IMA 日志和 UEFI 事件日志等)。
2 使用 Podman 运行 Keylime 工作负载 #
Keylime 是一种远程证明解决方案,可用于监控远程节点的健康状况。验证者和注册者是远程系统上的 Keylime 的重要组成部分,用于执行 Keylime 代理的注册和证明。
本文中介绍的容器提供了作为 Keylime 项目一部分的控制平面服务:验证者、注册者和 tenant 命令行工具 (CLI)。
在开始安装和注册代理之前,请按照下面所述的过程在远程主机上准备验证者和注册者。
找到 Keylime 工作负载映像。
#
podman search keylime [...] registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane从注册表中提取映像。
#
podman pull\ registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest创建
keylime-control-plane
卷以持久存放数据库以及证明过程中所需的证书。#
podman container runlabel install \ registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest启动容器及相关服务。
#
podman container runlabel run \ registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest系统即会创建
keylime-control-plane
容器。该容器中包含已配置且正在运行的注册者和验证者服务。容器会使用默认值在内部向主机公开端口 8881、8890 和 8891。请验证防火墙配置,以允许访问这些端口并允许容器之间进行通讯,因为 tenant CLI 需要如此。
如果您需要停止 Keylime 服务,请运行以下命令:
#
podman kill keylime-control-plane-container
2.1 监控 Keylime 服务 #
要获取主机上运行的容器的状态,请运行以下命令:
#
podman ps
要查看 Keylime 服务的日志,请运行以下命令:
#
podman logs keylime-control-plane-container
2.2 执行 tenant CLI #
tenant CLI 工具包含在容器中,如果主机防火墙未影响 Keylime 服务公开的端口,您可以使用相同的映像执行该工具,例如:
#
podman run --rm \ -v keylime-control-plane-volume:/var/lib/keylime/ \ keylime-control-plane:latest \ keylime_tenant -v 10.88.0.1 -r 10.88.0.1 --cert default -c reglist
2.3 提取 Keylime 证书 #
Keylime 容器首次执行时,其服务会创建多个代理所需的证书。您需要从容器中提取证书,并将其复制到代理的 /var/lib/keylime/cv_ca/
目录。
#
podman cp \ keylime-control-plane-container:/var/lib/keylime/cv_ca/cacert.crt .
#
scp cacert.crt AGENT_HOST:/var/lib/keylime/cv_ca/
有关安装代理的详细信息,请参见第 3 节 “安装 Keylime 代理”。
3 安装 Keylime 代理 #
Keylime 是一种远程证明解决方案,可用于监控远程节点的健康状况。Keylime 代理是在需要证明的系统上运行的服务,会将事件日志、IMA 哈希和有关测量引导的信息发送给验证者。
SLE Micro 默认未安装 Keylime 代理,您需要手动安装。要安装代理,请执行以下操作:
按如下所示安装 rust-keylime 软件包:
#
transactional-update pkg in rust-keylime然后重引导系统。
调整代理的默认配置。
创建一个目录,在
/etc/keylime/agent.conf.d/
中存储用于保存您的更改的新配置文件。默认配置文件存储在/usr/etc/keylime/agent.conf
中,但我们不建议编辑此文件,因为将来进行系统更新时会覆盖该文件。#
mkdir -p /etc/keylime/agent.conf.d创建新文件
/etc/keylime/agent.conf.d/agent.conf
:#
cat << EOF > /etc/keylime/agent.conf.d/agent.conf [agent] uuid = "d111ec46-34d8-41af-ad56-d560bc97b2e8"1 registrar_ip = "<REMOTE_IP>"2 revocation_notification_ip = "<REMOTE_IP>"3 EOF将
/etc/keylime/
目录的拥有者更改为keylime:tss
:#
chown -R keylime:tss /etc/keylime更改对
/etc/keylime/
目录的权限:#
chmod -R 600 /etc/keylime
将 CA 生成的证书复制到代理节点。在代理节点上执行以下操作:
准备用于存储证书的目录:
#
mkdir -p /var/lib/keylime/cv_ca将证书复制到代理上:
#
scpCERT_SERVER_ADDRESS:/var/lib/keylime/cv_ca/cacert.crt /var/lib/keylime/cv_ca将证书的拥有者更改为
keylime:tss
:#
chown -R keylime:tss /var/lib/keylime/cv_ca
启动并启用
keylime_agent.service
:#
systemctl enable --now keylime_agent.service
4 注册 Keylime 代理 #
Keylime 是一种远程证明解决方案,可用于监控远程节点的健康状况。Keylime 代理是在需要证明的系统上运行的服务,会将事件日志、IMA 哈希和有关测量引导的信息发送给验证者。
您可以使用 CLI tenant 或者编辑验证者的配置来注册新代理。在验证者主机上使用 tenant 运行以下命令:
#
keylime_tenant -v 127.0.0.1 \
-tAGENT \1
-u UUID \2
--cert default \
-c add
[--include PATH_TO_ZIP_FILE]3
AGENT 是要注册的代理的 IP 地址。 | |
UUID 是代理的唯一标识符。 | |
|
您可以在验证者主机上使用 reglist
命令列出已注册的代理,如下所示:
#
keylime_tenant -v 127.0.0.1 \
--cert default \
-c reglist
要去除注册的代理,请使用 -t
和 -u
选项指定代理并运行 -c
delete
命令,如下所示:
#
keylime_tenant -v 127.0.0.1 \
-tAGENT \
-u UUID \
-c delete
5 Keylime 安全有效负载 #
Keylime 是一种远程证明解决方案,可用于监控远程节点的健康状况。
5.1 什么是安全有效负载? #
使用 Keylime 安全有效负载,您可以向健康状况良好的代理传递加密数据。有效负载用于提供密钥、口令、证书、配置或 Keylime 代理在后面的阶段中使用的脚本。
5.2 安全有效负载的工作原理 #
安全有效负载通过 zip
文件传递给代理,该文件必须包含名为 autorun.sh
的外壳脚本。仅当代理正确注册并验证后,该脚本才会执行。要传递 zip
文件,需使用 keylime_tenant
命令的 --include
选项。
例如,下面的 autorun.sh
脚本会创建一个目录结构并将 SSH 密钥复制到其中。相关的 zip
存档必须包含这些 SSH 密钥。
>
cat autorun.sh
#!/bin/bash
mkdir -p /root/.ssh/
cp id_rsa* /root/.ssh/
chmod 600 /root/.ssh/id_rsa*
cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
6 为 Keylime 启用 IMA 跟踪 #
Keylime 是一种远程证明解决方案,可用于监控远程节点的健康状况。完整性管理体系结构 (IMA) 是一个内核完整性子系统,提供了检测恶意更改文件的行为的方法。
使用 IMA 时,内核会计算被访问文件的哈希。然后,该哈希会用于扩展 TPM 中的 PCR 10,还会记录被访问文件的列表。验证者可以向代理请求 PCR 10 的签名引用,以获取所有被访问文件的日志(包括文件哈希)。然后,验证者会将被访问文件与本地的获批文件许可列表进行比较。如果无法识别其中的任何哈希,系统即被视为不安全,并触发撤消事件。
必须启用 IMA/EVM,Keylime 才能收集信息。要启用该进程,请使用 ima_appraise=log
和 ima_policy=tcb
参数引导代理的内核:
在
/etc/default/grub
中使用这两个参数更新GRUB_CMDLINE_LINUX_DEFAULT
选项:GRUB_CMDLINE_LINUX_DEFAULT="ima_appraise=log ima_policy=tcb"
运行以下命令重新生成
grub.cfg
:#
transactional-update grub.cfg重引导系统。
上面的过程使用了默认的内核 IMA 策略。为了避免监控的文件太多,因而产生过长的日志,您可以创建新的自定义策略。有关详细信息,请参见 Keylime 文档。
要指明预期的哈希,请在注册代理时使用 keylime_tenant
命令的 --allowlist
选项。要查看排除或忽略的文件,请使用 keylime_tenant
命令的 --exclude
选项:
#
keylime_tenant --allowlist
-v 127.0.0.1 \
-uUUID
7 更多信息 #
Keylime 主页:https://keylime.dev。
最新的 Keylime 文档:https://keylime.readthedocs.io/en/latest/。
有关 IMA/EVM 的简要概述,请访问 https://en.opensuse.org/SDB:Ima_evm#Introduction。
有关创建新内核 IMA 策略的详细信息,请访问 https://keylime-docs.readthedocs.io/en/latest/user_guide/runtime_ima.html。
8 法律声明 #
版权所有 © 2006–2024 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。