Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

用于 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 版本。