签名第三方应用程序,以在不断发展Junos OS本地运行
签名密钥概述
从Junos OS演化版20.1R1开始,您可以生成签名密钥并使用它们来签名可执行文件或共享对象。对可执行文件进行签名可授予其在设备上运行的权限,从而允许您批准可信应用程序与经授权的软件瞻博网络运行。
Junos OS Evolved 要求用户签名将映射到内存以执行的所有文件。其中包括以下文件类型:
可执行文件和可链接格式 (ELF) 文件
共享对象 (.so) 文件
以下类型的文件无需签名:
Docker 容器
容器中的应用程序
脚本
注意:虽然脚本无需签名,但需要通过经过签名的解释器执行。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
命令以及以下 3 个必需参数:
key-name
- 密钥的唯一名称private-key
- 通往私钥文件的路径x509-cert
- 到 DER 编码证书文件的路径
以下示例命令将创建一个使用私钥文件和证书文件命名 ima-test-key ima-privkey.pem
的密钥 ima-cert.x509
:
user@host> request security system-keystore import key-name ima-test-key private-key ima-privkey.pem x509-cert ima-cert.x509 Key Name: ima-test-key Private Key Path: /etc/ima-ext/ima-test-key/privkey.pem X509 Cert Path: /etc/ima-ext/ima-test-key/ima-cert.x509 Key SKI: b71b35e380517cd224b46072dadeb6c53e0a58a1
将密钥成功导入 中后,将看到上述输出显示密钥名称、磁盘中私钥和证书的路径以及密钥的主题密钥标识符 system-keystore
(一种)。您可以使用以下命令检查此成功加载到 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 扩展密钥
您可查看系统密钥库以及 IMA 通过不断演进的源命令Junos OS密钥CLI show
内容。
使用 show security integrity system-keystore
命令查看系统密钥库中的可用签名密钥:
user@host> show security integrity system-keystore Available signing keys: --- Key Name: ima-test-key Private Key Path: /etc/ima-ext/ima-test-key/privkey.pem X509 Cert Path: /etc/ima-ext/ima-test-key/ima-cert.x509 Key SKI: b71b35e380517cd224b46072dadeb6c53e0a58a1 --- Key Name: test-key1 Private Key Path: /etc/ima-ext/test-key1/privkey.pem X509 Cert Path: /etc/ima-ext/test-key1/ima-cert.x509 Key SKI: 332f173d61bba03fed5399a609523cbd3cfe66b3 --- Key Name: test-key2 Private Key Path: /etc/ima-ext/test-key2/privkey.pem X509 Cert Path: /etc/ima-ext/test-key2/ima-cert.x509 Key SKI: 26ebafd58b54f7b8b530d0311503fd84873ee754 ---
Key KEYS 字段中的信息可用于将这些密钥映射到 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本地运行。
如何运行已签名的应用程序
在尝试执行尚未签名的文件时,您可能会 Permission Denied
出错:
user@host:~# ./ima-test -sh: ./ima-test: Permission denied
成功签名文件后,可以在文件名前面添加前缀,从 shell 提示符 ./
执行该文件:
user@host:~# ./ima-test Hello, World!