设置访问控制

目标:限制节点可以使用的主题。

教程级别:高级

时间:20 分钟

背景

在继续之前,请确保您已完成 设置安全性 教程。

权限非常灵活,可用于控制 ROS 图中的许多行为。

在本教程中,我们演示了一种策略,该策略仅允许在默认 chatter 主题上发布消息。

例如,这将防止在启动侦听器时重新映射主题或将相同的安全区域用于其他目的。

为了执行此策略,我们需要在启动节点之前更新 permissions.xml 文件并重新签名。

这可以通过手动修改权限文件或使用 XML 模板来完成。

修改 permissions.xml

首先备份您的权限文件,然后打开 permissions.xml 进行编辑:

cd ~/sros2_demo/demo_keystore/enclaves/talker_listener/talker
mv permissions.p7s permissions.p7s~
mv permissions.xml permissions.xml~
vi permissions.xml

我们将修改 <publish><subscribe><allow_rule>。 此 XML 文件中的主题使用 DDS 命名格式,而不是 ROS 名称。 有关在 ROS 和 DDS 之间映射主题名称的详细信息,请参阅``主题和服务名称设计文档 <https://design.ros2.org/articles/topic_and_service_names.html#mapping-of-ros-2-topic-and-service-names-to-dds-concepts>`_。

将以下 XML 内容粘贴到 permission.xml 中,保存文件并退出文本编辑器。 这显示了 chatterrosout ROS 主题分别重命名为 DDS rt/chatterrt/rosout 主题:

<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.omg.org/spec/DDS-SECURITY/20170901/omg_shared_ca_permissions.xsd">
  <permissions>
    <grant name="/talker_listener/talker">
      <subject_name>CN=/talker_listener/talker</subject_name>
      <validity>
        <not_before>2021-06-01T16:57:53</not_before>
        <not_after>2031-05-31T16:57:53</not_after>
      </validity>
      <allow_rule>
        <domains>
          <id>0</id>
        </domains>
        <publish>
          <topics>
            <topic>rt/chatter</topic>
            <topic>rt/rosout</topic>
            <topic>rt/parameter_events</topic>
            <topic>*/talker/*</topic>
          </topics>
        </publish>
        <subscribe>
          <topics>
            <topic>rt/parameter_events</topic>
            <topic>*/talker/*</topic>
          </topics>
        </subscribe>
      </allow_rule>
      <allow_rule>
        <domains>
          <id>0</id>
        </domains>
        <publish>
          <topics>
            <topic>ros_discovery_info</topic>
          </topics>
        </publish>
        <subscribe>
          <topics>
            <topic>ros_discovery_info</topic>
          </topics>
        </subscribe>
      </allow_rule>
      <default>DENY</default>
    </grant>
  </permissions>
</dds>

此策略允许谈话者在“chatter”和“rosout”主题上发布消息。 它还允许包括谈话者节点管理参数所需的发布和订阅权限(所有节点的要求)。 发现权限与原始模板保持不变。

签署策略文件

下一个命令从更新的 XML 文件“permissions.xml”创建新的 S/MIME 签名策略文件“permissions.p7s”。 ​​该文件必须使用 Permissions CA 证书进行签名,这需要访问 Permission CA 私钥。 如果私钥已受到保护,则可能需要根据您的安全计划执行其他步骤来解锁和使用它。

openssl smime -sign -text -in permissions.xml -out permissions.p7s \
  --signer permissions_ca.cert.pem \
  -inkey ~/sros2_demo/demo_keystore/private/permissions_ca.key.pem

启动节点

更新权限后,我们可以使用之前教程中使用的相同命令成功启动节点:

ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

但是,尝试重新映射“chatter”主题会阻止节点启动(请注意,这需要将“ROS_SECURITY_STRATEGY”设置为“Enforce”)。

ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker \
  --remap chatter:=not_chatter

使用模板

安全策略很快就会变得令人困惑,因此“sros2”实用程序添加了从模板创建策略的功能。 使用“sros2”存储库中提供的“示例策略文件<https://github.com/ros2/sros2/blob/rolling/sros2/test/policies/sample.policy.xml#L1>”执行此操作。 让我们为“talker”和“listener”创建一个策略,使其仅使用“chatter”主题。

首先下载带有示例策略文件的“sros2”存储库:

git clone https://github.com/ros2/sros2.git /tmp/sros2

然后使用“create_permission”动词并指向示例策略来生成 XML 权限文件:

ros2 security create_permission demo_keystore \
  /talker_listener/talker \
  /tmp/sros2/sros2/test/policies/sample.policy.xml
ros2 security create_permission demo_keystore \
  /talker_listener/listener \
  /tmp/sros2/sros2/test/policies/sample.policy.xml

这些权限文件允许节点仅发布或订阅“chatter”主题,并启用参数所需的通信。

在一个启用了安全性的终端中,如之前的安全教程中所述,运行“talker”演示程序:

ros2 run demo_nodes_cpp talker --ros-args -e /talker_listener/talker

在另一个终端中对“监听器”程序执行相同操作:

ros2 run demo_nodes_py listener --ros-args -e /talker_listener/listener

此时,您的“talker”和“listener”节点将使用显式访问控制列表进行安全通信。 但是,“listener”节点尝试订阅“chatter”以外的主题将会失败:

ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener \
  --remap chatter:=not_chatter