【ROS2】高级:安全-设置访问控制

news2024/11/25 0:54:39

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

 教程级别:高级

 时间:20 分钟

 内容

  •  背景

    •  修改 permissions.xml

    • 签署策略文件

    •  启动节点

    •  使用模板

 背景

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

权限非常灵活,可以用来控制 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

我们将修改 <allow_rule> 以适应 <publish> 和 <subscribe> 。此 XML 文件中的主题使用 DDS 命名格式,而不是 ROS 名称。有关在 ROS 和 DDS 之间映射主题名称的详细信息,请参阅主题和服务名称设计文档。

将以下 XML 内容粘贴到 permission.xml ,保存文件并退出文本编辑器。这显示了 chatter 和 rosout ROS 主题分别重命名为 DDS rt/chatter 和 rt/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">
  <!-- 定义 DDS 安全配置文件,并指定 XML schema 的位置 -->
  <permissions>
    <!-- 权限定义的开始 -->
    <grant name="/talker_listener/talker">
      <!-- 定义一个权限授予,命名为 "/talker_listener/talker" -->
      <subject_name>CN=/talker_listener/talker</subject_name>
      <!-- 指定主体名称,即被授予权限的实体,CN 是通用名称 -->
      <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>
          <!-- 定义域 ID 为 0 -->
        </domains>
        <publish>
          <!-- 定义发布权限 -->
          <topics>
            <topic>rt/chatter</topic>
            <!-- 允许发布 rt/chatter 主题 -->
            <topic>rt/rosout</topic>
            <!-- 允许发布 rt/rosout 主题 -->
            <topic>rt/parameter_events</topic>
            <!-- 允许发布 rt/parameter_events 主题 -->
            <topic>*/talker/*</topic>
            <!-- 允许发布匹配 */talker/* 的主题 -->
          </topics>
        </publish>
        <subscribe>
          <!-- 定义订阅权限 -->
          <topics>
            <topic>rt/parameter_events</topic>
            <!-- 允许订阅 rt/parameter_events 主题 -->
            <topic>*/talker/*</topic>
            <!-- 允许订阅匹配 */talker/* 的主题 -->
          </topics>
        </subscribe>
      </allow_rule>
      <!-- 第一个允许规则的结束 -->
      <allow_rule>
        <!-- 第二个允许规则的开始 -->
        <domains>
          <id>0</id>
          <!-- 定义域 ID 为 0 -->
        </domains>
        <publish>
          <!-- 定义发布权限 -->
          <topics>
            <topic>ros_discovery_info</topic>
            <!-- 允许发布 ros_discovery_info 主题 -->
          </topics>
        </publish>
        <subscribe>
          <!-- 定义订阅权限 -->
          <topics>
            <topic>ros_discovery_info</topic>
            <!-- 允许订阅 ros_discovery_info 主题 -->
          </topics>
        </subscribe>
      </allow_rule>
      <!-- 第二个允许规则的结束 -->
      <default>DENY</default>
      <!-- 默认情况下拒绝所有未明确允许的操作 -->
    </grant>
    <!-- 权限授予的结束 -->
  </permissions>
  <!-- 权限定义的结束 -->
</dds>
<!-- DDS 安全配置文件的结束 -->

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

签署策略文件

此命令将从更新的 XML 文件 permissions.xml 创建新的 S/MIME 签名策略文件 permissions.p7s 。该文件必须使用权限 CA 证书签名,这需要访问权限 CA 私钥。如果私钥已被保护,则可能需要根据您的安全计划采取额外步骤来解锁和使用它。

cxy@cxy-Ubuntu2404:~/sros2_demo/demo_keystore/enclaves/talker_listener/listener$ 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

启动节点

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

export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

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

export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker \
  --remap chatter:=not_chatter

18b26a3d821d471bbf8f0022d321fd4e.png

使用模板

安全策略很快就会变得混乱,因此 sros2 实用程序增加了从模板创建策略的功能。通过使用 sros2 存储库中提供的示例策略文件来执行此操作。让我们为 talker 和 listener 创建一个策略,仅使用 chatter 主题。

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

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

fdbb97e4ec4b57c5697627e256e8e6a1.png

cxy@cxy-Ubuntu2404:~$ tree /tmp/sros2
/tmp/sros2
├── codecov.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── sros2
│   ├── CHANGELOG.rst
│   ├── package.xml
│   ├── pytest.ini
│   ├── resource
│   │   └── sros2
│   ├── setup.py
│   ├── sros2
│   │   ├── api
│   │   │   ├── _artifact_generation.py
│   │   │   ├── __init__.py
│   │   │   └── _policy.py
│   │   ├── command
│   │   │   ├── __init__.py
│   │   │   └── security.py
│   │   ├── errors.py
│   │   ├── __init__.py
│   │   ├── keystore
│   │   │   ├── _enclave.py
│   │   │   ├── __init__.py
│   │   │   ├── _keystore.py
│   │   │   └── _permission.py
│   │   ├── policy
│   │   │   ├── defaults
│   │   │   │   ├── dds
│   │   │   │   │   ├── governance.xml
│   │   │   │   │   └── __init__.py
│   │   │   │   ├── __init__.py
│   │   │   │   └── policy.xml
│   │   │   ├── __init__.py
│   │   │   ├── schemas
│   │   │   │   ├── dds
│   │   │   │   │   ├── governance.xsd
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── permissions.xsd
│   │   │   │   ├── __init__.py
│   │   │   │   └── policy.xsd
│   │   │   └── templates
│   │   │       ├── dds
│   │   │       │   ├── __init__.py
│   │   │       │   └── permissions.xsl
│   │   │       ├── __init__.py
│   │   │       └── policy.xsl
│   │   ├── _utilities.py
│   │   └── verb
│   │       ├── create_enclave.py
│   │       ├── create_keystore.py
│   │       ├── create_permission.py
│   │       ├── generate_artifacts.py
│   │       ├── generate_policy.py
│   │       ├── __init__.py
│   │       └── list_enclaves.py
│   ├── test
│   │   ├── conftest.py
│   │   ├── policies
│   │   │   ├── add_two_ints.policy.xml
│   │   │   ├── common
│   │   │   │   ├── lifecycle_node.xml
│   │   │   │   ├── node
│   │   │   │   │   ├── logging.xml
│   │   │   │   │   ├── parameters.xml
│   │   │   │   │   ├── time.xml
│   │   │   │   │   └── types.xml
│   │   │   │   └── node.xml
│   │   │   ├── invalid_policy_missing_topics_tag.xml
│   │   │   ├── minimal_action.policy.xml
│   │   │   ├── permissions
│   │   │   │   ├── add_two_ints
│   │   │   │   │   └── permissions.xml
│   │   │   │   ├── minimal_action
│   │   │   │   │   └── permissions.xml
│   │   │   │   ├── sample
│   │   │   │   │   └── permissions.xml
│   │   │   │   ├── single_context
│   │   │   │   │   └── permissions.xml
│   │   │   │   └── talker_listener
│   │   │   │       └── permissions.xml
│   │   │   ├── policy_to_permissions.py
│   │   │   ├── sample.policy.xml
│   │   │   ├── single_context.policy.xml
│   │   │   └── talker_listener.policy.xml
│   │   ├── sros2
│   │   │   ├── commands
│   │   │   │   └── security
│   │   │   │       └── verbs
│   │   │   │           ├── fixtures
│   │   │   │           │   ├── client_service_node.py
│   │   │   │           │   └── pub_sub_node.py
│   │   │   │           ├── test_create_enclave.py
│   │   │   │           ├── test_create_keystore.py
│   │   │   │           ├── test_create_permission.py
│   │   │   │           ├── test_generate_artifacts.py
│   │   │   │           ├── test_generate_policy_no_nodes.py
│   │   │   │           ├── test_generate_policy.py
│   │   │   │           ├── test_list_enclaves.py
│   │   │   │           ├── test_no_verb.py
│   │   │   │           └── utilities
│   │   │   │               ├── __init__.py
│   │   │   │               └── sros2_cli_test_case.py
│   │   │   ├── keystore
│   │   │   │   └── test_enclave.py
│   │   │   └── test_utilities.py
│   │   ├── test_copyright.py
│   │   ├── test_flake8.py
│   │   ├── test_mypy.py
│   │   ├── test_pep257.py
│   │   └── test_policy_to_permissions.py
│   └── xml_cache
│       ├── README.md
│       ├── xhtml-cache.xml
│       └── xml.xsd
├── sros2_cmake
│   ├── CHANGELOG.rst
│   ├── cmake
│   │   └── sros2_generate_artifacts.cmake
│   ├── CMakeLists.txt
│   ├── package.xml
│   ├── README.md
│   └── sros2_cmake-extras.cmake
├── SROS2_Linux.md
├── SROS2_MacOS.md
└── SROS2_Windows.md


35 directories, 92 files

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

89dc90d08bbfe463fb2ff0306658e5b5.png

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 主题,并启用参数所需的通信。

cxy@cxy-Ubuntu2404:~/sros2_demo$ ros2 security create_permission demo_keystore \ 
  /talker_listener/talker \
  /tmp/sros2/sros2/test/policies/sample.policy.xml
cxy@cxy-Ubuntu2404:~/sros2_demo$ ros2 security create_permission demo_keystore \ 
  /talker_listener/listener \
  /tmp/sros2/sros2/test/policies/sample.policy.xml

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

export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce


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

在另一个终端中对 listener 程序执行相同的操作:

export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce


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

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

15e598ac53fc8146c31000d76b9e5316.png

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

e953748c1f3ff93753df44f019f6fcf8.png

ee8469c6592517ebce52708d52452678.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法&#xff0c;特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…

Vue自定义指令与Vue插槽学习

文章目录 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项 自定义指令-指令的值1.使用效果2.语法 插槽-默认插槽1.作用2.用处4.插槽的基本语法 插槽-具名插槽1.作用2.具名插槽语法3.v-slot的简写 插槽总结1.插槽分类2.作用3.场景4.使用步骤 自定义指令 1.指…

WPS辟谣用户文档被用于AI训练:坚守个人信息保护底线

AITOP100平台获悉&#xff0c;7 月 21 日有网友在社交平台发文称“WPS 改版了用我们的文章喂给 AI 了”“WPS 疑似把我的审签内容喂给抖音豆包 AI”。这一消息引起了部分用户对于个人信息安全的担忧。针对这一传言&#xff0c;WPS官方客服微博于当日下午作出回应&#xff0c;明…

ARM功耗管理之功耗和安全

安全之安全(security)博客目录导读 思考&#xff1a;功耗与安全&#xff1f;超频攻击&#xff1f;欠压攻击&#xff1f;低功耗流程中的安全&#xff1f; 睡眠唤醒流程中&#xff0c;安全相关寄存器的备份恢复 举例&#xff1a;比如某DMA通道&#xff0c;芯片逻辑默认为安全通…

论文学习记录之一种具有边缘增强特点的医学图像分割网络

标题&#xff1a;一种具有边缘增强特点的医学图像分割网络 期刊&#xff1a;电子与信息学报-&#xff08;2022年5月出刊&#xff09; 摘要&#xff1a;针对传统医学图像分割网络存在边缘分割不清晰、缺失值大等问题&#xff0c;该文提出一种具有边缘增强特点的医学图像分割网…

【C语言】 利用栈完成十进制转二进制(分文件编译,堆区申请空间malloc)

利用栈先进后出的特性&#xff0c;在函数内部&#xff0c;进行除二取余的操作&#xff0c;把每次的余数存入栈内&#xff0c;最后输出刚好就是逆序输出&#xff0c;为二进制数 学习过程中&#xff0c;对存储栈进行堆区的内存申请时候&#xff0c;并不是很熟练&#xff0c;一开始…

【LaTeX Overleaf】 论文修订

对于在word中写的论文一般是使用【审阅】-【比较文档】来输出对比结果&#xff1b;对于overleaf&#xff0c;使用LaTeX排版&#xff0c;如何通过标记文字颜色来实现对比效果呢&#xff1f;&#xff1f; 1 批注功能-使用changes 宏包 在 LaTeX 中&#xff0c;changes 宏包是一个…

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展&#xff0c;汽车自动化、智能化程度的逐步提高&#xff0c;人们对汽车的安全性、舒适性、娱乐性等要求也不断提高&#xff0c;加上汽车节能减排法规的不断严峻&#xff0c;整车电气设备不断增加&#xff0c;作为连接汽车各种电器设备“神经网络”的整车…

docker安装jenkins,并配置jdk、node和maven

拉取jenkins镜像 docker pull jenkins/jenkins:2.468-jdk21 创建一个文件夹&#xff0c;用于二次打包jenkins镜像 mkdir -p /data/jenkins cd /data/jenkins 提前准备好jdk和maven&#xff0c;并放到/data/jenkins下 由于8.x以上版本的maven只支持https协议&#xff0c;我们需…

分享一个最近在进行前后端联调时改了2天的bug...

场景再现 我们这边前端端口是8080 后端端口是8121 我们在前端里在首页面写了一个任务 当进入网页三秒后 发起一个叫getLoginUser的请求 我们的getLoginUser是调用的这里 一个异步请求 这边我们前端调用后端的接口也已经写好 我们先把后端跑起来 访问前端页面 接收到了这个…

源码搭建国内微短剧系统(APP+小程序)云存储配置流程

国内微短剧系统很多人不知道云存储和配置的操作流程&#xff0c;我整理了一份非常详细的操作文档流程&#xff0c;给大家介绍短剧系统云存储配置的详细操作流程。顺便推荐一下国内微短剧系统。 推荐下他们的开源地址&#xff1a;https://gitee.com/nymaite_com_2878868888/tjg…

arthas在idea和docker中的应用

基于IDEA工具使用 1&#xff0c;安装arthas插件 安装之后重启&#xff0c;然后再代码区域右键如果可以看到如下菜单选项&#xff0c;则说明安装成功 2&#xff0c;pom文件中配置arthas相关jar包 <!-- https://mvnrepository.com/artifact/com.taobao.arthas/arthas-pack…

JS 鼠标拖动实现移动滚动条的滚动效果

效果 现在很多场景都以移动端为基本开发&#xff0c;比如说需要隐藏滚动条&#xff0c;在pc上实现鼠标拖动和手机触摸拖动差不多的效果。 实现 以mdn的overflow属性中范例为基础&#xff0c;内容溢出时候可使用overflow: auto;和overflow: scroll;实现滚动效果。 要实现鼠标…

【Day1415】Bean管理、SpringBoot 原理、总结、Maven 高级

0 SpringBoot 配置优先级 从上到下 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml是主流&#xff09; 1 Bean管理 1.1 从 IOC 容器中获取 Bean 1.2 Bean 作品域 可以通过注解 Scope("proto…

LeetCode 415.字符串相加 C++写法

LeetCode 415.字符串相加 C写法 思路&#x1f914;&#xff1a; 首先不能用stoi和tostring来做&#xff0c;如果给一个很大的数那一定存不下。我们可以从后往前一位一位的取&#xff0c;创建一个变量存储进位用于计算下一位数&#xff0c;之后取模得到当前数字&#xff0c;每一…

Redis+Lua脚本+AOP+反射+自定义注解,打造我司内部基础架构限流组件

定义注解 Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface RedisLimitAnnotation {/*** 资源的key,唯一* 作用&#xff1a;不同的接口&#xff0c;不同的流量控制*/String key() default "";/*** 最多的访问限制次数…

netty使用redis发布订阅实现消息推送

netty使用redis发布订阅实现消息推送 场景 项目中需要给用户推送消息: 接口 RestController public class PushApi {Autowiredprivate PushService pushService;/*** 消息推送* param query* return*/PostMapping("/push/message")public String push(RequestBody…

华为Ascend C算子开发(中级)考试

华为Ascend C算子开发&#xff08;中级&#xff09;考试题 提示&#xff1a;这个是河北廊坊Ascend C算子开发考试题和答案&#xff0c;仅供参考&#xff0c;因为不确定其他城市的考试题是否也是一样 文章目录 华为Ascend C算子开发&#xff08;中级&#xff09;考试题一、op_ho…

音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现

一、引言 通过FFmpeg命令可以判断出某个文件是否为AnnexB格式的H.264裸流&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为AnnexB格式的H.264裸流呢&#xff1f;它内部其实是通过h264_probe函数来判断的。从文章《FFmpeg源码&#xff1a;av_probe_input_format3函数分析》中…