了解安全密钥库

目标:探索位于 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/enclavesenclave 目录包含 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

启动监听器和启动说话器有什么区别?

What command lets you check to see if the signature on the modified permissions.p7s file is valid?

在继续下一个教程之前,请恢复原始的、正确签名的“permissions.p7s”文件。