理解安全密钥库
目标: 探索位于ROS 2安全密钥库中的文件。
教程级别: 高级
时间: 15分钟
背景
sros2 包可用于创建在启用ROS 2安全性所必需的密钥、证书和策略。然而,安全配置非常灵活。对ROS 2安全密钥库的基本理解将允许与现有PKI(公钥基础设施)集成,并根据组织政策管理敏感密钥材料。
安全工件位置
在前一个教程中启用了通信安全性后,让我们来看看在启用安全性时创建的文件。这些文件使加密成为可能。
sros2
实用程序(ros2 security ...
)将文件分为公共、私有和飞地密钥材料。
ROS 使用由环境变量 ROS_SECURITY_KEYSTORE
定义的目录作为密钥库。对于本教程,我们使用目录 ~/sros2_demo/demo_keystore
。
公钥材料
在``~/sros2_demo/demo_keys/public``目录中,你会找到三个加密证书;然而,身份和权限证书实际上只是指向证书颁发机构(CA)证书的链接。
在公钥基础设施中,`证书颁发机构(Certificate Authority)<https://en.wikipedia.org/wiki/Certificate_authority>`_ 充当信任锚点:它验证参与者的身份和权限。对于ROS来说,这意味着所有参与ROS图(可能延伸到整个机器人群)的节点。通过将证书颁发机构的证书(ca.cert.pem
)放置在机器人上的正确位置,所有ROS节点可以使用相同的证书颁发机构与其他节点建立相互信任。
虽然在我们的教程中我们会即时创建一个证书颁发机构,但在生产系统中,这应该根据预先定义的安全计划进行。通常情况下,生产系统的证书颁发机构将在离线状态下创建,并在机器人的初始设置过程中放置。它可以针对每个机器人是唯一的,也可以在整个机器人群中共享,这些机器人都相互信任。
DDS(以及ROS)支持身份和权限信任链的分离,因此每个功能都有自己的证书颁发机构。在大多数情况下,ROS系统的安全计划不需要在这些职责之间进行分离,因此安全工具生成一个用于身份和权限的单个证书颁发机构。
使用``openssl``命令来查看该x509证书并以文本形式显示:
cd ~/sros2_demo/demo_keys/public
openssl x509 -in ca.cert.pem -text -noout
输出结果应该类似于以下内容:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
02:8e:9a:24:ea:10:55:cb:e6:ea:e8:7a:c0:5f:58:6d:37:42:78:aa
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN = sros2testCA
Validity
Not Before: Jun 1 16:57:37 2021 GMT
Not After : May 31 16:57:37 2031 GMT
Subject: CN = sros2testCA
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:
08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:
7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:
a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:
dc:ed:39:c5:32
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE, pathlen:1
Signature Algorithm: ecdsa-with-SHA256
30:45:02:21:00:d4:fc:d8:45:ff:a4:51:49:98:4c:f0:c4:3f:
e0:e7:33:19:8e:31:3c:d0:43:e7:e9:8f:36:f0:90:18:ed:d7:
7d:02:20:30:84:f7:04:33:87:bb:4f:d3:8b:95:61:48:df:83:
4b:e5:92:b3:e6:ee:3c:d5:cf:30:43:09:04:71:bd:dd:7c
- 关于该CA证书需要注意的一些事项:
证书主题名称``sros2testCA``是由``sros2``工具提供的默认值。
该证书有效期为十年,从创建时开始
与所有证书一样,它包含用于公钥加密的公钥
作为根证书颁发机构,这是一个`自签名证书 <https://en.wikipedia.org/wiki/Self-signed_certificate>`_;即,它使用自己的私钥进行签名。
由于这是一个公共证书,可以根据需要自由复制以在整个ROS系统中建立信任。
私钥材料
私钥材料可以在密钥库目录 ~/sros2_demo/demo_keys/private
中找到。与``public``目录类似,其中包含一个证书机构密钥 ca.key.pem
和指向它的符号链接,用作身份和权限 CA 的私钥。
警告
请保护好这个私钥,并进行安全备份!
这是与公共证书机构相关联的私钥,它是您的ROS系统中所有安全性的锚点。您将使用它来修改ROS图的加密策略并添加新的ROS参与者。根据您的机器人的安全需求,可以使用访问权限保护该密钥,并将其锁定到另一个帐户,或者完全将其移出机器人并放置到另一个系统或设备上。如果文件丢失,您将无法更改访问权限并向系统添加新的参与者。同样,任何具有对该文件访问权限的用户或进程都有修改系统策略和参与者的能力。
这个文件只用于配置机器人,但对于机器人的运行来说是不需要的。可以安全地将它离线存储在另一个系统或可移动介质中。
sros2
实用程序使用 椭圆曲线加密 而不是 RSA,以提高安全性和减小密钥大小。使用以下命令显示有关此椭圆曲线私钥的详细信息:
cd ~/sros2_demo/demo_keys/private
openssl ec -in ca.key.pem -text -noout
你的输出应该类似于以下内容:
read EC key
Private-Key: (256 bit)
priv:
93:da:76:b9:e3:91:ab:e9:42:76:f2:38:f1:9d:94:
90:5e:b5:96:7b:7f:71:ee:13:1b:d4:a0:f9:48:fb:
ae:77
pub:
04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:
08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:
7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:
a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:
dc:ed:39:c5:32
ASN1 OID: prime256v1
NIST CURVE: P-256
除了私钥本身外,请注意公钥也被列出,并且与证书颁发机构 ca.cert.pem
中列出的公钥匹配。
域治理政策
在密钥库的保险库目录中,~/sros2_demo/demo_keys/enclaves``中找到域治理政策。``enclave``目录包含XML治理政策文件``governance.xml
,以及由Permissions CA签署的文档副本``governance.p7s``。
``governance.p7s``文件包含域范围的设置,例如如何处理未经身份验证的参与者,是否加密发现以及访问主题的默认规则。
使用以下命令验证治理文件的 S/MIME签名:
openssl smime -verify -in governance.p7s -CAfile ../public/permissions_ca.cert.pem
该命令将打印出XML文档,最后一行将显示``Verification successful``,以显示文档已由Permissions CA正确签名。
安全飞地
安全进程(通常为ROS节点)在安全飞地内运行。在最简单的情况下,所有进程可以合并到同一个飞地中,并且所有进程将使用相同的安全策略。然而,为了将不同的策略应用于不同的进程,进程可以在启动时使用不同的安全飞地。有关安全飞地的更多详细信息,请参阅`设计文档 <https://design.ros2.org/articles/ros2_security_enclaves.html>`_。在运行节点时,可以使用ROS参数``--enclave``来指定安全飞地。
**每个安全飞地需要六个文件**以启用安全性。每个文件的名称必须按照下面的定义命名,并且如上面的`DDS Security标准 <https://www.omg.org/spec/DDS-SECURITY/1.1/About-DDS-SECURITY/>`_中所述。为了避免有多个相同文件的副本,``sros2``工具会为每个飞地创建到单个治理策略、身份CA和权限CA的链接。
请查看``listener``飞地内的以下六个文件。其中三个文件是特定于此飞地的,而另外三个文件是通用于此ROS系统的:
key.pem
,用于在此飞地内进行加密和解密的私钥
cert.pem
,此飞地的公共证书;该证书已由身份认证机构签名
permissions.p7s
,此飞地的权限;该文件已由权限认证机构签名
governance.p7s
,此域名的签署安全策略文件的链接
identity_ca.cert.pem
,此域名的身份认证中心链接
permissions_ca.cert.pem
,此域名的权限认证中心链接
私有加密密钥``key.pem``应根据您的安全计划进行保护。该密钥用于加密、解密和验证此特定飞地内的通信。如果密钥丢失或被盗,应撤销该密钥并为该飞地创建新的身份。
该目录中还创建了文件 permissions.xml
,可用于重新创建已签名的权限文件。但是,启用安全性时不需要此文件,因为DDS使用已签名的文件版本。
参加测验吧!
看看你是否能回答关于ROS安全密钥库的这些问题。从一个新的终端会话开始,并使用前面教程中创建的密钥库启用安全性:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keys
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
cd ~/sros2_demo/demo_keys/enclaves/talker_listener/listener
在开始之前,先备份 permissions.p7s
文件。
在文本编辑器中打开``permissions.p7s``。对XML内容进行微小的更改(例如,添加一个空格或空白行),然后保存文件。启动监听器节点:
ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener
你期望会发生什么?
你能否启动说话节点?
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
启动监听器和启动说话节点有什么区别?
监听器无法启动并抛出错误。当``permissions.p7s``文件被修改(即使是微小的修改),文件的签名就会变得无效。当权限文件无效时,节点将无法以启用和强制安全性的方式启动。
讲话者将按预期启动。它在不同的保护区中使用``permissions.p7s``文件,并且该文件仍然有效。
哪个命令可以用来检查修改后的``permissions.p7s``文件的签名是否有效?
使用``openssl smime``命令来检查``permissions.p7s``是否已由Permissions CA正确签名:
openssl smime -verify -in permissions.p7s -CAfile permissions_ca.cert.pem
在继续下一个教程之前,请恢复您的原始、正确签名的“permissions.p7s”文件。