设置访问控制

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

辅导水平: 高级

时间 20 分钟

背景介绍

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

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

在本教程中,我们将演示一种策略,该策略只允许在默认的 唠叨 主题。例如,这可以防止在启动监听器时重新映射主题,或将相同的安全飞地用于其他目的。

为了执行这一策略,我们需要更新 permissions.xml 文件,并在启动节点前重新签署。这可以通过手动修改权限文件或使用 XML 模板来实现。

修改 permissions.xml

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

CD ~/sros2_demo/demo_keystore/enclaves/talker_listener/talker mv 权限.p7s 权限 permissions.xml permissions.xml~ vi permissions.xml

我们将修改 <allow_rule>; 对于 发布订阅;.该 XML 文件中的主题使用 DDS 命名格式,而不是 ROS 名称。有关在 ROS 和 DDS 之间映射主题名称的详情,请参阅 主题和服务名称设计文件.

将以下 XML 内容粘贴到 permission.xml保存文件并退出文本编辑器。这将显示 唠叨莲雾 将 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";>;
  <权限>;
    <grant 名称"/talker_listener/talker";>;
      <主题名称>;CN=/talker_listener/talker</subject_name>;
      有效性;
        不早于 <not_before>;2021-06-01T16:57:53</not_before>;
        不在之后;2031-05-31T16:57:53</not_after>;
      </validity>;
      <allow_rule>;
        <domains>;
          id>;0</id>;
        </域>;
        发布
          <主题>;
            <主题>;rt/chatter</topic>;
            <主题>;rt/rosout</topic>;
            <主题>;rt/parameter_events</topic>;
            <主题>;*/talker/*</topic>;
          </topics>;
        </publish>;
        订阅;
          <主题>;
            <主题>;rt/parameter_events</topic>;
            <主题>;*/talker/*</topic>;
          </topics>;
        订阅</subscribe>;
      </allow_rule>;
      <allow_rule>;
        <domains>;
          id>;0</id>;
        </域>;
        发布
          <主题>;
            <主题>;ros_discovery_info(发现信息</topic>;
          </topics>;
        </publish>;
        订阅;
          <主题>;
            <主题>;ros_discovery_info(发现信息</topic>;
          </topics>;
        订阅</subscribe>;
      </allow_rule>;
      默认值;拒绝</default>;
    </grant>;
  </permissions>;
</dds>;

该政策允许发言者在 唠叨莲雾 主题。它还允许发布和订阅谈论者节点管理参数(所有节点都需要)所需的权限。发现权限与原始模板保持不变。

签署政策文件

下一条命令将创建新的 S/MIME 签名策略文件 权限.p7s 从更新的 XML 文件中 permissions.xml.文件必须使用 Permissions CA 证书签名、 这需要访问权限 CA 私钥.如果私人密钥受到保护,则可能需要根据安全计划采取其他步骤才能解锁和使用。

opensl 默记 -签名 -文本 -在 permissions.xml -退出 权限.p7s \
  --签署人 permissions_ca.cert.pem \
  -钥匙 ~/sros2_demo/demo_keystore/private/permissions_ca.key.pem

启动节点

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

玫瑰2 运行 演示节点 话匣子 --ros-args --飞地 /talker_listener/talker

然而,试图重新映射 唠叨 主题阻止节点启动(注意,这需要使用 安全战略 设为 执行).

玫瑰2 运行 演示节点 话匣子 --ros-args --飞地 /talker_listener/talker \
  --remap 唠叨:=不唠叨

使用模板

安全策略很快就会变得混乱,因此 sros2 实用程序添加了从模板创建策略的功能。使用 政策文件样本 中提供的 sros2 仓库。让我们同时为 话匣子听众 只使用 唠叨 主题。

首先下载 sros2 存储库中的示例策略文件:

笨蛋 复制 https://github.com/ros2/sros2.git /tmp/sros2

然后使用 创建许可 动词,同时指向样本策略以生成 XML 权限文件:

玫瑰2 安全 创建许可 demo_keystore \
  /talker_listener/talker \
  /tmp/sros2/sros2/test/policies/sample.policy.xml ros2 安全 创建许可 demo_keystore \
  /talker_listener/listener \
  /tmp/sros2/sros2/test/policies/sample.policy.xml

这些权限文件只允许节点发布或订阅 唠叨 并启用参数所需的通信。

在一个启用了安全功能的终端中,如前面的安全教程一样,运行 话匣子 演示程序:

玫瑰2 运行 演示节点 话匣子 --ros-args -e /talker_listener/talker

在另一个终端中使用 听众 计划

玫瑰2 运行 演示节点 听众 --ros-args -e /talker_listener/listener

此时,您的 话匣子听众 节点将使用显式访问控制列表进行安全通信。不过,以下尝试 听众 节点来订阅除 唠叨 就会失败:

玫瑰2 运行 演示节点 听众 --ros-args --飞地 /talker_listener/listener \
  --remap 唠叨:=不唠叨