用于 Junos OS 的已验证执行官 (Veriexec) 文件签名和验证

了解 Veriexec 文件签名和验证、优势以及如何使用它。

为了保护 Junos 操作系统 (OS) 免受可能损害设备完整性的未经授权的软件和活动的侵害,Verified Exec (Veriexec) 提供了一个文件签名和验证框架,确保仅执行经过授权和可信的软件。Junos OS 改编了最初为 NetBSD 开发的 Veriexec 框架,并默认启用它以帮助通过文件验证确保软件完整性。

Veriexec 使用与每个授权的 Junos OS 文件关联的指纹来验证其完整性,并确定该文件是否可以打开或执行。

Veriexec 通过在系统使用之前验证关键软件组件的完整性来帮助保护它们,包括:

  • 内核
  • 内核模块
  • 可执行文件
  • 共享库
  • 软件包
  • 其他受保护的系统文件

Veriexec 的工作原理

Veriexec 使用数字签名清单,其中包含可执行文件和其他必须保持不可变的文件的指纹。

验证过程通常遵循以下步骤:

  1. Veriexec 加载程序验证与清单关联的数字签名。
  2. 验证成功后,加载程序将清单内容提供给内核。
  3. 系统在启动期间验证内核。
  4. 系统会在加载内核模块时(在启动期间或系统运行期间)验证内核模块。
  5. 内核在允许使用文件之前验证文件是否与其预期的指纹匹配。

Veriexec 要求内核、根文件系统映像和内核模块通过验证,然后系统才能使用它们。

如果启用了 Veriexec 强制执行,则只能运行具有经过验证的指纹的可执行文件。此外,无法写入、修改或更改受保护的文件。

验证范围

Veriexec 在多个阶段验证软件完整性:

组件 验证阶段
内核 在系统启动期间
根文件系统映像 在系统启动期间
内核模块 在启动或运行时加载时
软件包 安装前
受保护的文件 运行时使用前

在安装之前,Veriexec 框架会验证软件包是否未被更改并且可以信任。包验证和运行时验证使用相同的 Veriexec 框架并支持相同的散列算法。

脚本执行注意事项

  • Veriexec 阻止已验证的 shell 脚本执行清单中未列出的未签名脚本。

  • 您可以使用 /bin/sh 文件运行任意脚本。从安全角度来看,这些脚本的处理方式与交互式命令类似,因为执行是通过用户身份验证和权限控制的。

验证失败

如果指纹丢失或不正确,加载程序或内核将拒绝该文件。影响取决于文件类型及其在系统中的作用。

验证失败时:

  • 加载程序或内核拒绝受影响的文件。
  • 影响因文件的重要性而异。
  • 默认情况下,加载程序会跳过验证失败的文件。
  • 或者,您可以将加载程序配置为在遇到不正确的散列时停止启动过程。

清单和散列算法

每个安装映像都包含一个只读清单,用于存储受保护文件的指纹和相关属性。

本主题中的指纹示例使用 SHA-1 哈希仅用于说明目的。Veriexec 支持 SHA-1、SHA-256、SHA-384 和 SHA-512 散列算法。Junos OS 版本和平台决定了 Veriexec 用于验证的散列算法。

清单标识每个受保护的文件,并存储其预期的指纹和关联属性。清单包含如下条目:

指纹不匹配和日志消息

当文件的计算指纹与清单中存储的指纹不匹配时,Veriexec 会生成日志消息。

日志消息的格式如下:

如果文件已修改,并且生成的指纹与清单中的指纹不同,则会看到类似于以下内容的日志消息:

指纹不匹配表示文件内容与清单中存储的受信任指纹不匹配。这种不匹配可能是由于文件损坏、存储问题或未经授权的修改而发生的。

验证失败的关键文件不可信任。请联系 JTAC 获取指导。

Veriexec 的优势

  • 安全系统 — 保护瞻博网络路由器、交换机和防火墙免受安全漏洞影响。

  • 防止未经授权的访问 — 阻止威胁行为者获得持续的未经授权的访问或导致系统故障。

  • 防止恶意软件执行 — 通过防止未签名的二进制执行来阻止未经授权的修改和恶意软件。

  • 支持授权代码 — 使用 JET SDK 通过 Veriexec 实施,将已签名的授权代码添加到 Junos OS。有关 SDK 解决方案的更多信息,请参阅 瞻博网络扩展工具包开发人员指南。

检查 Veriexec 实施状态

在支持的平台上,Junos OS 提供禁用 Veriexec 实施的可选版本。有关此功能及其用例的详细信息,请参阅 Junos 增强型自动化。

要验证是否强制执行 Veriexec,请从 Junos OS CLI shell 运行以下命令:

  1. 启动 shell。

  2. 使用命令 sysctl security.mac.veriexec.state 。

    如果强制执行 Veriexec,则输出为 security.mac.veriexec.state: loaded active enforce。如果未强制执行 Veriexec,则输出为 security.mac.veriexec.state: loaded active。

验证 Veriexec 文件实施

要验证 Veriexec 强制是否处于活动状态,请将授权文件复制到清单范围之外的未受保护位置(例如 /usr/bin/id)到新位置,如下所示。Veriexec 阻止复制的文件运行,因为清单包含 但 /usr/bin/id 不 /tmp/id包含 的有效条目。尽管复制不会更改文件内容,但 Veriexec 会根据清单条目验证文件,包括其路径和关联的元数据。因此,Veriexec 会阻止复制的文件,因为它与任何受保护的清单条目不匹配。

  1. 启动 shell。

  2. 更改目录,然后将授权文件(例如 /usr/bin/id)复制到新位置。

结果

如果强制执行 Veriexec,系统将生成身份验证错误。如果未强制执行 Veriexec,则文件将正常运行:

未强制执行 Veriexec 时生成的输出,显示复制的文件成功运行:

未强制执行 Veriexec 时生成的输出,显示文件已复制

安装 Veriexec Loader

从 Junos OS 19.2 版开始,支持 Veriexec 的加载程序 (veloader) 用于基于 BSDX 的 Junos 平台。加载程序会先验证 Junos OS 映像,然后才能信任其启动。Veriexec 加载程序可验证您从简单文件传输协议 (TFTP) 服务器或 USB 存储设备安装的 Junos OS 映像。

  • 要从 TFTP 服务器安装 Junos OS 映像,请使用以下命令:

  • 要从 USB 存储设备安装 Junos OS 映像,请使用以下命令:

支持 Veriexec 的加载程序可验证 Junos OS 映像。

加载程序仅启动包含指纹的 Junos OS 映像,不会启动不包含指纹或有效内核的映像。您可以使用该 nextboot 功能检查当前启动设备。

Bootupgrade 是 Junos OS 软件包中提供的一款工具,用于支持 BIOS 固件升级。您可以使用 bootupgrade shell 命令进行升级、检查 U-Boot、手动加载和安装支持 Veriexec 的加载程序。该 bootupgrade -c loader 命令打印当前加载程序的版本字符串。

在安装支持 Veriexec 的加载程序之前,系统会验证两个双根分区是否都包含 Junos OS 指纹。

从 Junos OS CLI shell 安装支持 Veriexec 的加载程序:

  1. 启动 shell。

  2. 使用命令 bootupgrade -l /boot/veloader 安装支持 Veriexec 的加载程序。

  3. 您可以在这里看到不同的场景:

    • 使用 request system software add /var/tmp/xxx.tgz no-copy no-validate 命令安装带有指纹的 Junos OS。该 no-validate 选项不会禁用包签名验证,并且系统将继续拒绝无效包。

    • 如果支持 Veriexec 的加载程序不支持早期版本中的目标 Junos OS 映像,您可以将加载程序降级到与该版本兼容的版本。使用该 request system software add /var/tmp/xxx.tgz no-copy no-validate 命令自动降级到加载程序的早期版本。
    • 使用此 request system software add /var/tmp/xxx 命令检查 Junos OS 软件包是否与 Veriexec 加载程序兼容。

      在此示例中,系统将终止安装,因为 Veriexec 加载程序不支持早于 20.3R1 的 Junos OS 版本。