跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 使用 Keylime 保护 SLE Micro

使用 Keylime 保护 SLE Micro

出版日期:2024-12-12
解释

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)。

在开始安装和注册代理之前,请按照下面所述的过程在远程主机上准备验证者和注册者。

  1. 找到 Keylime 工作负载映像。

    # podman search keylime
    [...]
    registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane
  2. 从注册表中提取映像。

    # podman pull\
      registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest
  3. 创建 keylime-control-plane 卷以持久存放数据库以及证明过程中所需的证书。

    # podman container runlabel install \
      registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest
  4. 启动容器及相关服务。

    # 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 代理,您需要手动安装。要安装代理,请执行以下操作:

  1. 按如下所示安装 rust-keylime 软件包:

    # transactional-update pkg in rust-keylime

    然后重引导系统。

  2. 调整代理的默认配置。

    1. 创建一个目录,在 /etc/keylime/agent.conf.d/ 中存储用于保存您的更改的新配置文件。默认配置文件存储在 /usr/etc/keylime/agent.conf 中,但我们不建议编辑此文件,因为将来进行系统更新时会覆盖该文件。

      # mkdir -p /etc/keylime/agent.conf.d
    2. 创建新文件 /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

      1

      每次代理运行时都会生成唯一标识符,不过,您可以使用此选项定义一个特定的值。

      2

      注册者的 IP 地址。

      3

      验证者的 IP 地址。

    3. /etc/keylime/ 目录的拥有者更改为 keylime:tss

      # chown -R keylime:tss /etc/keylime
    4. 更改对 /etc/keylime/ 目录的权限:

      # chmod -R 600 /etc/keylime
  3. 将 CA 生成的证书复制到代理节点。在代理节点上执行以下操作:

    1. 准备用于存储证书的目录:

      # mkdir -p /var/lib/keylime/cv_ca
    2. 将证书复制到代理上:

      # scpCERT_SERVER_ADDRESS:/var/lib/keylime/cv_ca/cacert.crt /var/lib/keylime/cv_ca
    3. 将证书的拥有者更改为 keylime:tss

      # chown -R keylime:tss /var/lib/keylime/cv_ca
  4. 启动并启用 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

1

AGENT 是要注册的代理的 IP 地址。

2

UUID 是代理的唯一标识符。

3

include 选项传递的文件用于向代理传送机密的有效负载数据。有关细节,请参见第 5 节 “Keylime 安全有效负载”

您可以在验证者主机上使用 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=logima_policy=tcb 参数引导代理的内核:

  1. /etc/default/grub 中使用这两个参数更新 GRUB_CMDLINE_LINUX_DEFAULT 选项:

    GRUB_CMDLINE_LINUX_DEFAULT="ima_appraise=log ima_policy=tcb"
  2. 运行以下命令重新生成 grub.cfg

    # transactional-update grub.cfg
  3. 重引导系统。

上面的过程使用了默认的内核 IMA 策略。为了避免监控的文件太多,因而产生过长的日志,您可以创建新的自定义策略。有关详细信息,请参见 Keylime 文档

要指明预期的哈希,请在注册代理时使用 keylime_tenant 命令的 --allowlist选项。要查看排除或忽略的文件,请使用 keylime_tenant 命令的 --exclude 选项:

# keylime_tenant --allowlist
    -v 127.0.0.1 \
    -uUUID

7 更多信息