使用签名密钥以本机方式运行第三方应用程序
签名密钥概述
从 Junos OS 演化版 22.4R1 开始,您可以生成签名密钥并使用它们对可执行文件或共享对象进行签名。对可执行文件进行签名即可授予其在设备上运行的权限,从而允许您批准受信任的应用程序与授权的瞻博网络软件一起运行。
Junos OS 演化版要求用户对所有将映射到内存中执行的文件进行签名。这包括以下文件类型:
-
可执行和可链接格式 (ELF) 文件
-
共享对象 (.so) 文件
以下类型的文件不需要签名:
-
码头工人容器
-
容器内的应用
-
脚本
注意:尽管脚本不需要签名,但它们确实需要通过已签名的解释器进行执行。Junos OS Evolved 随附了签名的 Python 2 和 Python 3 解释器,可通过 shell 命令使用
python script-name
。
签名密钥由名为完整性测量体系结构 (IMA) 的 Linux 子系统控制。IMA 策略包含一些规则,这些规则定义在执行文件之前需要执行哪些操作。IMA 衡量策略将测量和存储文件的哈希值,IMA 评估策略将确保文件具有有效的哈希值或数字签名。仅当此验证成功时,IMA 才允许文件运行。有关 IMA 的详细信息,请参阅 使用 IMA 保护 Junos OS 演化版的完整性。
签名密钥存储在 系统密钥库中,用于验证签名密钥的证书存储在 IMA 扩展密钥环中。继续阅读以了解如何生成、导入、查看和使用签名密钥。
生成签名密钥
密钥可以通过 OpenSSL 命令行或 OpenSSL 配置文件生成。
使用 OpenSSL 命令行生成签名密钥
以下示例 OpenSSL 命令可用于生成签名密钥:
openssl req -new \ -newkey rsa:3072 \ # Create an RSA 3072 key -x509 \ # Need an X509 certificates -sha256 \ # Strong hashing algorithm -nodes \ # No encrypted private-key -out ima-cert.x509 \ # Name of the certificate file -outform DER \ # Key in DER format -keyout privkey.pem \ # Name of the private key
此命令将生成 2 个文件:
-
privkey.pem
- 可用于对可执行文件进行签名的 PEM 编码私钥。 -
ima-cert.x509
- 要加载到 IMA 扩展密钥环中的 DER 编码证书。
OpenSSL 命令行的功能有限。它不允许您设置 X509v3 扩展的值。使用上述命令生成的所有密钥都可以用作证书颁发机构 (CA),因此可用于签署其他证书。为了防止这种情况,我们可以使用 OpenSSL 配置文件。
使用 OpenSSL 配置文件生成签名密钥
创建一个名为 ima-x509.cnf
的文件并粘贴以下内容:
# Begining of ima-x509.cnf [ req ] default_bits = 2048 distinguished_name = custom_distinguished_name prompt = no string_mask = utf8only x509_extensions = custom_exts [ custom_distinguished_name ] O = Juniper Networks, Inc. CN = IMA extended signing key emailAddress = john.smith@juniper.net [ custom_exts ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid # EOF
创建配置文件后,使用以下 OpenSSL 命令创建 ima-privkey.pem
和 ima-cert.x509
文件:
openssl req -new \ -nodes \ -utf8 \ -sha1 \ -days 36500 \ -batch \ -x509 \ -config ima-x509.cnf \ -outform DER -out ima-cert.x509 \ -keyout ima-privkey.pem
私钥文件用于生成签名密钥,证书文件ima-privkey.pem
ima-cert.x509
用于验证签名。在将签名密钥导入系统密钥库和 IMA 扩展密钥环的过程中会使用这两个文件。
将签名密钥导入系统密钥库和 IMA 扩展密钥环
在使用之前,需要将签名密钥导入到系统密钥库中。导入到系统密钥库中的密钥会自动导入到 IMA 扩展密钥环中。密钥将在两个路由引擎上导入。
要将签名密钥导入系统密钥库,请将命令与 request security system-keystore import
以下 2 个必需参数一起使用:
-
key-name
- 密钥的唯一名称 -
x509-cert
- DER 编码证书文件的路径
以下示例命令将使用证书文件ima-cert.x509
创建名为ima-test-key的密钥:
user@host> request security system-keystore import key-name ima-test-key x509-cert ima-cert.x509 Key Name: ima-test-key X509 Cert Path: /etc/ima-ext/ima-test-key/ima-cert.x509 Key SKI: b71b35e380517cd224b46072dadeb6c53e0a58a1
将密钥成功导入 system-keystore
后,您将看到上述输出,其中显示了密钥的名称、磁盘上证书的路径以及密钥的主题密钥标识符 (SKI)。您可以使用以下命令检查此 SKI 是否与加载到 IMA 扩展密钥环中的密钥匹配:
user@host> show security integrity extended-keyring Keyring 351716837 ---lswrv 0 0 keyring: ima_ext 684930381 --als--v 0 0 \_ asymmetric: Juniper Extended Signing Key: b71b35e380517cd224b46072dadeb6c53e0a58a1
查看系统密钥库和 IMA 扩展密钥环
您可以通过 Junos OS 演进版 CLI show
命令查看系统密钥库和 IMA 扩展密钥环的内容。
使用 show security integrity system-keystore
命令查看系统密钥库中的可用签名密钥:
user@host> show security integrity system-keystore Available signing keys: --- Key Name: ima-test-key X509 Cert Path: /etc/ima-ext/ima-test-key/ima-cert.x509 Key SKI: b71b35e380517cd224b46072dadeb6c53e0a58a1 --- Key Name: test-key1 X509 Cert Path: /etc/ima-ext/test-key1/ima-cert.x509 Key SKI: 332f173d61bba03fed5399a609523cbd3cfe66b3 --- Key Name: test-key2 X509 Cert Path: /etc/ima-ext/test-key2/ima-cert.x509 Key SKI: 26ebafd58b54f7b8b530d0311503fd84873ee754 ---
密钥 SKI 字段中的信息可用于将这些密钥映射到 IMA 扩展密钥环。
使用 show security integrity extended-keyring
命令查看 IMA 扩展密钥环的内容:
user@host> show security integrity extended-keyring Keyring 351716837 ---lswrv 0 0 keyring: ima_ext 684930381 --als--v 0 0 \_ asymmetric: Juniper Extended Signing Key: b71b35e380517cd224b46072dadeb6c53e0a58a1 316767440 --als--v 0 0 \_ asymmetric: Juniper Extended Signing Key: 26ebafd58b54f7b8b530d0311503fd84873ee754 950431262 --als--v 0 0 \_ asymmetric: Juniper Extended Signing Key: 332f173d61bba03fed5399a609523cbd3cfe66b3
如何签署应用程序
将签名密钥导入系统密钥库后,可以使用该密钥对可执行二进制文件进行签名。
使用该 request security integrity measure file filename key key-name
命令对文件进行签名。
以下示例命令显示名为 ima-test 的文件由名为 的 ima-test-key密钥签名:
user@host> request security integrity measure file ima-test key ima-test-key Successfully signed file /data/var/home/root/ima-test
您可以使用命令 request security integrity appraise file filename key key-name
验证文件是否已成功签名,如下所示:
user@host> request security integrity appraise file ima-test key ima-test-key File /data/var/home/root/ima-test has a valid IMA signature
如果文件未正确签名,将显示以下消息:
user@host> request security integrity appraise file ima-test key ima-test-key warning: IMA signature verification failed for /data/var/home/root/ima-test using ima-test-key IMA appraisal for /data/var/home/root/ima-test failed.
对文件进行签名后,即可在 Junos OS 演化版设备上以本机方式运行。