了解安全密钥库
目标:探索位于 ROS 2 安全密钥库中的文件。
教程级别:高级
时间:15 分钟
背景
sros2
包可用于创建启用 ROS 2 安全性所需的密钥、证书和策略。
但是,安全配置非常灵活。
对 ROS 2 安全密钥库的基本了解将允许与现有 PKI(公钥基础设施)集成并管理与组织策略一致的敏感密钥材料。
安全工件位置
在上一个教程中启用了通信安全性后,让我们看一下启用安全性时创建的文件。 这些文件使加密成为可能。
sros2
实用程序(ros2 security ...
)将文件分为公钥、私钥和 enclave 密钥材料。
ROS 使用环境变量``ROS_SECURITY_KEYSTORE`` 定义的目录作为密钥库。 对于本教程,我们使用目录``~/sros2_demo/demo_keystore``。
公钥材料
您将在公共目录“~/sros2_demo/demo_keys/public”中找到三个加密证书;但是,身份和权限证书实际上只是证书颁发机构 (CA) 证书的链接。
在公钥基础设施中, 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 = sros2CA Validity
Not Before: Jun 1 16:57:37 2021 GMT Not After : May 31 16:57:37 2031 GMT
Subject: CN = sros2CA 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 证书需要注意以下几点: - 证书主题名称“sros2CA”是“sros2”实用程序提供的默认名称。 - 此证书自创建之日起有效期为十年 - 与所有证书一样,它包含用于公钥-私钥加密的公钥 - 作为根证书颁发机构,这是一个“自签名证书<https://en.wikipedia.org/wiki/Self-signed_certificate>”;即,它是使用自己的私钥签名的。
由于这是一个公共证书,因此可以根据需要自由复制它,以在整个 ROS 系统中建立信任。
私钥材料
私钥材料可在密钥库目录“~/sros2_demo/demo_keys/private”中找到。 与“public”目录类似,它包含一个证书颁发机构密钥“ca.key.pem”和指向它的符号链接,可用作身份和权限 CA 私钥。
Warning
保护此私钥并创建它的安全备份!
这是与公共证书颁发机构关联的私钥,它是 ROS 系统中所有安全性的锚点。 您将使用它来修改 ROS 图的加密策略并添加新的 ROS 参与者。 根据您的机器人的安全需求,可以使用访问权限保护密钥并将其锁定到另一个帐户,或者可以将其完全从机器人移出并移到另一个系统或设备上。 如果文件丢失,您将无法更改访问权限并向系统添加新参与者。 同样,任何有权访问该文件的用户或进程都可以修改系统策略和参与者。
此文件仅用于配置机器人,但对于机器人运行不是必需的。 它可以安全地离线存储在另一个系统或可移动媒体中。
``sros2``实用程序使用 elliptic curve cryptograpy 而不是 RSA,以提高安全性并减少密钥大小。 使用以下命令显示有关此椭圆曲线私钥的详细信息:
cd ~/sros2_demo/demo_keys/private
openssl ec -in ca.key.pem -text -noout
Your output should look similar to the following:
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”中列出的公钥相匹配。
域治理政策
在密钥库中的 enclave 目录中找到域治理政策 ~/sros2_demo/demo_keys/enclaves
。
enclave
目录包含 XML 治理政策文档 governance.xml
,以及已由权限 CA 签名为 governance.p7s
的文档副本。
governance.p7s
文件包含域范围的设置,例如如何处理未经身份验证的参与者、是否加密发现以及访问主题的默认规则。
使用以下命令验证治理文件的 S/MIME 签名:
openssl smime -verify -in governance.p7s -CAfile ../public/permissions_ca.cert.pem
此命令将打印出 XML 文档,最后一行将是“验证成功”,以表明文档已由权限 CA 正确签名。
安全区域
安全进程(通常是 ROS 节点)在安全区域内运行。 在最简单的情况下,所有进程都可以合并到同一个区域,然后所有进程都将使用相同的安全策略。 但是,要将不同的策略应用于不同的进程,进程可以在启动时使用不同的安全区域。 有关安全区域的更多详细信息,请参阅 design document. 运行节点时,使用 ROSE 参数“–enclave”指定安全区域。
**每个安全区域都需要六个文件**才能实现安全性。
每个文件**必须**按照下文定义命名,并按照 DDS Security standard. 为了避免拥有相同文件的多个副本,“sros2”实用程序为每个 enclave 创建指向单个治理策略(上述身份 CA 和权限 CA)的链接。
请参阅“listener”enclave 中的以下六个文件。 其中三个是此 enclave 所特有的,而另外三个是此 ROS 系统通用的:
key.pem
,用于在此 enclave 内加密和解密的私钥cert.pem
,此 enclave 的公共证书;此证书已由身份 CA 签名permissions.p7s
,此 enclave 的权限;此文件已由权限 CA 签名governance.p7s
,指向此域的已签名安全策略文件的链接identity_ca.cert.pem
,指向此域的身份 CA 的链接permissions_ca.cert.pem
,指向此域的权限 CA 的链接
私有加密密钥“key.pem”应根据您的安全计划进行保护。 此密钥加密、解密和验证此特定 enclave 内的通信。 如果密钥丢失或被盗,请撤销密钥并为此 enclave 创建新身份。
文件“permissions.xml”也已在此目录中创建,可用于重新创建签名的权限文件。 但是,此文件不是启用安全性所必需的,因为 DDS 使用的是该文件的签名版本。
参加测验!
看看您是否可以回答有关 ROS 安全密钥库的这些问题。 从新的终端会话开始,并使用在上一个教程中创建的密钥库启用安全性:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
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
您期望发生什么?
您可以启动 talker 节点吗?
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
启动监听器和启动说话器有什么区别?
侦听器无法启动并抛出错误。 当“permissions.p7s”文件被修改时(无论修改多么小),文件的签名都会变得无效。 当权限文件无效时,节点将无法在启用和强制执行安全性的情况下启动。
谈话者将按预期启动。 它在不同的 enclave 中使用“permissions.p7s”文件,并且该文件仍然有效。
What command lets you check to see if the signature on the modified permissions.p7s
file is valid?
Check that permissions.p7s
has been properly signed by the Permissions CA using the openssl smime
command:
openssl smime -verify -in permissions.p7s -CAfile permissions_ca.cert.pem
在继续下一个教程之前,请恢复原始的、正确签名的“permissions.p7s”文件。