了解安全密钥库
目标:探索位于 ROS 2 安全密钥库中的文件。
教程级别:高级
时间:15 分钟
背景
在继续之前,请确保您已完成 设置安全性 教程。
sros2
包可用于创建启用 ROS 2 安全性所需的密钥、证书和策略。
但是,安全配置非常灵活。
对 ROS 2 安全密钥库的基本了解将允许与现有 PKI(公钥基础设施)集成并管理与组织策略一致的敏感密钥材料。
安全工件位置
在上一个教程中启用通信安全性后,让我们看一下启用安全性时创建的文件。
这些是使加密成为可能的文件。
sros2
实用程序(ros2 security ...
)将文件分为公钥、私钥和 enclave 密钥材料。
ROS 使用环境变量 ROS_SECURITY_KEYSTORE
定义的目录作为密钥库。
对于本教程,我们使用目录“~/sros2_demo/demo_keystore”。
公钥材料
您将在公共目录“~/sros2_demo/demo_keystore/public”中找到三个加密证书;但是,身份和权限证书实际上只是证书颁发机构 (CA) 证书的链接。
在公钥基础设施中,“证书颁发机构 <https://en.wikipedia.org/wiki/Certificate_authority>”充当信任锚:它验证参与者的身份和权限。 对于 ROS,这意味着参与 ROS 图的所有节点(可能扩展到整个单个机器人队列)。 通过将证书颁发机构的证书(“ca.cert.pem”)放置在机器人上的正确位置,所有 ROS 节点都可以使用相同的证书颁发机构与其他节点建立相互信任。
虽然在我们的教程中我们会即时创建证书颁发机构,但在生产系统中,这应该根据预定义的安全计划来完成。 通常,生产系统的证书颁发机构将离线创建,并在初始设置期间放置在机器人上。 它可能对每个机器人都是唯一的,或者在一群机器人之间共享,所有机器人都打算相互信任。
DDS(以及 ROS,通过扩展)支持身份和权限信任链的分离,因此每个功能都有自己的证书颁发机构。 在大多数情况下,ROS 系统安全计划不需要将这些职责分开,因此安全实用程序会生成一个用于身份和权限的证书颁发机构。
使用“openssl”查看此 x509 证书并将其显示为文本:
cd ~/sros2_demo/demo_keystore/public
openssl x509 -in ca.cert.pem -text -noout
The output should look similar to the following:
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_keystore/private”中找到。 与“public”目录类似,它包含一个证书颁发机构密钥“ca.key.pem”和指向它的符号链接,可用作身份和权限 CA 私钥。
保护此私钥并创建其安全备份!
这是与公共证书颁发机构关联的私钥,可作为 ROS 系统中所有安全性的锚点。 您将使用它来修改 ROS 图的加密策略并添加新的 ROS 参与者。 根据机器人的安全需求,可以使用访问权限保护密钥并将其锁定到另一个帐户,或者可以将其完全从机器人移出并移到另一个系统或设备上。 如果文件丢失,您将无法更改访问权限并将新参与者添加到系统。 同样,任何有权访问该文件的用户或进程都可以修改系统策略和参与者。
此文件仅用于配置机器人,但对于机器人运行来说不是必需的。 它可以安全地离线存储在另一个系统或可移动媒体中。
sros2
实用程序使用 椭圆曲线加密 而不是 RSA,以提高安全性并减小密钥大小。
使用以下命令显示有关此椭圆曲线私钥的详细信息:
cd ~/sros2_demo/demo_keystore/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”中列出的公钥相匹配。
域治理政策
在密钥库中的 enclave 目录中找到域治理政策 ~/sros2_demo/demo_keystore/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 节点)在安全区域内运行。 在最简单的情况下,所有进程都可以合并到同一个区域,然后所有进程将使用相同的安全策略。 但是,要将不同的策略应用于不同的进程,进程可以在启动时使用不同的安全区域。 有关安全区域的更多详细信息,请参阅`设计文档 <https://design.ros2.org/articles/ros2_security_enclaves.html>`_。 运行节点时,使用 ROS 参数``–enclave`` 指定安全区域。
**每个安全区域需要六个文件**才能启用安全性。
每个文件**必须**按照下面定义的方式命名,并按照`DDS 安全标准 <https://www.omg.org/spec/DDS-SECURITY/1.1/About-DDS-SECURITY/>`_ 中概述的方式命名。
为了避免拥有相同文件的多个副本,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``。 此密钥加密、解密和验证此特定区域内的通信。 如果密钥丢失或被盗,请撤销密钥并为此区域创建新的身份。
文件``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_keystore/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”文件,并且该文件仍然有效。
哪个命令可以让您检查修改后的“permissions.p7s”文件上的签名是否有效?
使用“openssl smime”命令检查“permissions.p7s”是否已被权限 CA 正确签名:
openssl smime -verify -in permissions.p7s -CAfile permissions_ca.cert.pem
在继续下一个教程之前,请恢复原始的、正确签名的“permissions.p7s”文件。