了解安全密钥库

目标:探索位于 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/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 节点)在安全区域内运行。 在最简单的情况下,所有进程都可以合并到同一个区域,然后所有进程将使用相同的安全策略。 但是,要将不同的策略应用于不同的进程,进程可以在启动时使用不同的安全区域。 有关安全区域的更多详细信息,请参阅`设计文档 <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”文件上的签名是否有效?

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