用于 Junos OS 的已验证执行官 (Veriexec) 文件签名和验证
了解 Veriexec 文件签名和验证、优势以及如何使用它。
为了保护 Junos 操作系统 (OS) 免受可能损害设备完整性的未经授权的软件和活动的侵害,Verified Exec (Veriexec) 提供了一个文件签名和验证框架,确保仅执行经过授权和可信的软件。Junos OS 改编了最初为 NetBSD 开发的 Veriexec 框架,并默认启用它以帮助通过文件验证确保软件完整性。
Veriexec 使用与每个授权的 Junos OS 文件关联的指纹来验证其完整性,并确定该文件是否可以打开或执行。
Veriexec 通过在系统使用之前验证关键软件组件的完整性来帮助保护它们,包括:
- 内核
- 内核模块
- 可执行文件
- 共享库
- 软件包
- 其他受保护的系统文件
Veriexec 的工作原理
Veriexec 使用数字签名清单,其中包含可执行文件和其他必须保持不可变的文件的指纹。
验证过程通常遵循以下步骤:
- Veriexec 加载程序验证与清单关联的数字签名。
- 验证成功后,加载程序将清单内容提供给内核。
- 系统在启动期间验证内核。
- 系统会在加载内核模块时(在启动期间或系统运行期间)验证内核模块。
- 内核在允许使用文件之前验证文件是否与其预期的指纹匹配。
Veriexec 要求内核、根文件系统映像和内核模块通过验证,然后系统才能使用它们。
如果启用了 Veriexec 强制执行,则只能运行具有经过验证的指纹的可执行文件。此外,无法写入、修改或更改受保护的文件。
验证范围
Veriexec 在多个阶段验证软件完整性:
| 组件 | 验证阶段 |
| 内核 | 在系统启动期间 |
| 根文件系统映像 | 在系统启动期间 |
| 内核模块 | 在启动或运行时加载时 |
| 软件包 | 安装前 |
| 受保护的文件 | 运行时使用前 |
在安装之前,Veriexec 框架会验证软件包是否未被更改并且可以信任。包验证和运行时验证使用相同的 Veriexec 框架并支持相同的散列算法。
脚本执行注意事项
-
Veriexec 阻止已验证的 shell 脚本执行清单中未列出的未签名脚本。
-
您可以使用 /bin/sh 文件运行任意脚本。从安全角度来看,这些脚本的处理方式与交互式命令类似,因为执行是通过用户身份验证和权限控制的。
验证失败
如果指纹丢失或不正确,加载程序或内核将拒绝该文件。影响取决于文件类型及其在系统中的作用。
验证失败时:
- 加载程序或内核拒绝受影响的文件。
- 影响因文件的重要性而异。
- 默认情况下,加载程序会跳过验证失败的文件。
- 或者,您可以将加载程序配置为在遇到不正确的散列时停止启动过程。
清单和散列算法
每个安装映像都包含一个只读清单,用于存储受保护文件的指纹和相关属性。
本主题中的指纹示例使用 SHA-1 哈希仅用于说明目的。Veriexec 支持 SHA-1、SHA-256、SHA-384 和 SHA-512 散列算法。Junos OS 版本和平台决定了 Veriexec 用于验证的散列算法。
清单标识每个受保护的文件,并存储其预期的指纹和关联属性。清单包含如下条目:
etc/rc sha1=478eeda6750c455fbfc18eeb06093e32a341911b uid=0 gid=0 mode=644 etc/rc.verify sha1=15566bb2731abee890fabd0ae8799e02071e006c uid=0 gid=0 mode=644 usr/libexec/veriexec-ext.so.1 sha1=8929292d008d12cd5beb2b9d9537458d4974dd22 uid=0 gid=0 mode=550 no_fips sbin/verify-sig sha1=cd3ffd45f30f1f9441e1d4a366955d8e2c284834 uid=0 gid=0 mode=555 no_ptrace sbin/veriexec sha1=7b40c1eae9658f4a450eb1aa3df74506be701baf uid=0 gid=0 mode=555 no_ptrace jail/usr/bin/php sha1=c444144fef5d65f7bbc376dc3ebb24373f1433a2 uid=0 gid=0 mode=555 indirect no_fips usr/sbin/chassisd sha1=61b82b36da9c6fb7eeb413d809ae2764a8a3cebc uid=0 gid=0 mode=555 trusted
指纹不匹配和日志消息
当文件的计算指纹与清单中存储的指纹不匹配时,Veriexec 会生成日志消息。
日志消息的格式如下:
/kernel:veriexec:fingerprint for dev <deviceid>, file <fileid><calculatedfingerprint>!= <fingerprintinthemanifest>
如果文件已修改,并且生成的指纹与清单中的指纹不同,则会看到类似于以下内容的日志消息:
/kernel:veriexec:fingerprint for dev 100728577, file 70750 64ea873ed0ca43b113f87fa25fb30f9f60030cec!= 0d9457c041bb3646eb4b9708ba605facb84a2cd0
指纹不匹配表示文件内容与清单中存储的受信任指纹不匹配。这种不匹配可能是由于文件损坏、存储问题或未经授权的修改而发生的。
验证失败的关键文件不可信任。请联系 JTAC 获取指导。
Veriexec 的优势
-
安全系统 — 保护瞻博网络路由器、交换机和防火墙免受安全漏洞影响。
-
防止未经授权的访问 — 阻止威胁行为者获得持续的未经授权的访问或导致系统故障。
-
防止恶意软件执行 — 通过防止未签名的二进制执行来阻止未经授权的修改和恶意软件。
-
支持授权代码 — 使用 JET SDK 通过 Veriexec 实施,将已签名的授权代码添加到 Junos OS。有关 SDK 解决方案的更多信息,请参阅 瞻博网络扩展工具包开发人员指南。
检查 Veriexec 实施状态
在支持的平台上,Junos OS 提供禁用 Veriexec 实施的可选版本。有关此功能及其用例的详细信息,请参阅 Junos 增强型自动化。
要验证是否强制执行 Veriexec,请从 Junos OS CLI shell 运行以下命令:
-
启动 shell。
username@hostname> start shell %
-
使用命令
sysctl security.mac.veriexec.state。% sysctl security.mac.veriexec.state security.mac.veriexec.state: loaded active enforce %
如果强制执行 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 会阻止复制的文件,因为它与任何受保护的清单条目不匹配。
-
启动 shell。
username@hostname> start shell #
-
更改目录,然后将授权文件(例如 /usr/bin/id)复制到新位置。
# /usr/bin/id uid=928(username) gid=20 groups=20,0(wheel),10(field) # cp /usr/bin/id /tmp
结果
如果强制执行 Veriexec,系统将生成身份验证错误。如果未强制执行 Veriexec,则文件将正常运行:
未强制执行 Veriexec 时生成的输出,显示复制的文件成功运行:
# /tmp/id /bin/sh: /tmp/id: Authentication error #
未强制执行 Veriexec 时生成的输出,显示文件已复制
# /tmp/id #
安装 Veriexec Loader
从 Junos OS 19.2 版开始,支持 Veriexec 的加载程序 (veloader) 用于基于 BSDX 的 Junos 平台。加载程序会先验证 Junos OS 映像,然后才能信任其启动。Veriexec 加载程序可验证您从简单文件传输协议 (TFTP) 服务器或 USB 存储设备安装的 Junos OS 映像。
-
要从 TFTP 服务器安装 Junos OS 映像,请使用以下命令:
loader> install tftp://[host]/package
-
要从 USB 存储设备安装 Junos OS 映像,请使用以下命令:
loader> install file:///package
加载程序仅启动包含指纹的 Junos OS 映像,不会启动不包含指纹或有效内核的映像。您可以使用该 nextboot 功能检查当前启动设备。
username@hostname# nextboot
Platform: srx-sword
eUSB
usb
current bootdev is: eUSB
Bootupgrade 是 Junos OS 软件包中提供的一款工具,用于支持 BIOS 固件升级。您可以使用 bootupgrade shell 命令进行升级、检查 U-Boot、手动加载和安装支持 Veriexec 的加载程序。该 bootupgrade -c loader 命令打印当前加载程序的版本字符串。
在安装支持 Veriexec 的加载程序之前,系统会验证两个双根分区是否都包含 Junos OS 指纹。
从 Junos OS CLI shell 安装支持 Veriexec 的加载程序:
-
启动 shell。
username@hostname> start shell %
-
使用命令
bootupgrade -l /boot/veloader安装支持 Veriexec 的加载程序。% bootupgrade -l /boot/veloader Checking Loader CRC... veloader size 1251641 OK
-
您可以在这里看到不同的场景:
-
使用
request system software add /var/tmp/xxx.tgz no-copy no-validate命令安装带有指纹的 Junos OS。该no-validate选项不会禁用包签名验证,并且系统将继续拒绝无效包。username@hostname> request system software add /var/tmp/junos-srxsme-20.4I-20200810_dev_common.0.0833.tgz no-copy no-validate Formatting alternate root (/dev/ad0s2a)... /dev/ad0s2a: 600.0MB (1228732 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 150.00MB, 9600 blks, 19200 inodes. super-block backups (for fsck -b #) at: 32, 307232, 614432, 921632 Installing package '/altroot/cf/packages/install-tmp/junos-20.4I-20200810_dev_common.0.0833' ... Verified junos-boot-srxsme.tgz signed by PackageDevelopmentECP256_2020 method ECDSA256+SHA256 Verified junos-srxsme-domestic signed by PackageDevelopmentECP256_2020 method ECDSA256+SHA256 Verified manifest signed by PackageDevelopmentECP256_2020 method ECDSA256+SHA256 WARNING: The software that is being installed has limited support. WARNING: Run 'file show /etc/notices/unsupported.txt' for details. JUNOS 20.4I-20200810_dev_common.0.0833 will become active at next reboot WARNING: A reboot is required to load this software correctly WARNING: Use the 'request system reboot' command WARNING: when software installation is complete Saving state for rollback ... - 如果支持 Veriexec 的加载程序不支持早期版本中的目标 Junos OS 映像,您可以将加载程序降级到与该版本兼容的版本。使用该
request system software add /var/tmp/xxx.tgz no-copy no-validate命令自动降级到加载程序的早期版本。username@hostname> request system software add /var/tmp/junos-srxsme-19.4R1.3.tgz no-copy no-validate WARNING: Package junos-19.4R1.3 version 19.4R1.3 is not compatible with current loader WARNING: Automatic recovering loader, please wait ... Upgrading Loader... ##################################### Verifying the loader image... OK WARNING: The new boot firmware will take effect when the system is rebooted. WARNING: Loader recover finish. Formatting alternate root (/dev/ad0s1a)... /dev/ad0s1a: 598.5MB (1225692 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 149.62MB, 9576 blks, 19200 inodes. super-block backups (for fsck -b #) at: 32, 306464, 612896, 919328 Installing package '/altroot/cf/packages/install-tmp/junos-19.4R1.3' ... Verified junos-boot-srxsme-19.4R1.3.tgz signed by PackageProductionEc_2019 method ECDSA256+SHA256 Verified junos-srxsme-19.4R1.3-domestic signed by PackageProductionEc_2019 method ECDSA256+SHA256 Verified junos-boot-srxsme-19.4R1.3.tgz signed by PackageProductionEc_2019 method ECDSA256+SHA256 Verified junos-srxsme-19.4R1.3-domestic signed by PackageProductionEc_2019 method ECDSA256+SHA256 JUNOS 19.4R1.3 will become active at next reboot WARNING: A reboot is required to load this software correctly WARNING: Use the 'request system reboot' command WARNING: when software installation is complete Saving state for rollback ... -
使用此
request system software add /var/tmp/xxx命令检查 Junos OS 软件包是否与 Veriexec 加载程序兼容。username@hostname> request system software add /var/tmp/junos-srxsme-19.4R2.3.tgz WARNING: Package junos-19.4R2.3 version 19.4R2.3 is not compatible with this system. WARNING: Please install a package with veloader support, 20.3 or higher.
在此示例中,系统将终止安装,因为 Veriexec 加载程序不支持早于 20.3R1 的 Junos OS 版本。
-