【ROS2】高级:安全-部署指南

news2024/11/24 18:36:34

目标:了解将安全工件部署到生产系统时的最佳实践。

 教程级别:高级

 时间:20 分钟

 内容

  •  背景

  •  先决条件

  •  一般准则

  • 构建部署场景

    • 生成 Docker 镜像

    • 理解 compose 文件

  •  运行示例

    • 检查容器

 背景

典型的部署场景通常涉及将容器化的应用程序或软件包发送到远程系统。部署启用安全性的应用程序时应特别注意,要求用户考虑打包文件的敏感性

遵循 DDS 安全标准 https://www.omg.org/spec/DDS-SECURITY/1.1/About-DDS-SECURITY/ , sros2 包提供了一系列实用工具,以高度模块化和灵活的方式管理 ROS 2 环境下的安全性。

组织不同证书、密钥和目录的基本核心指南仍然是避免系统安全受到威胁的关键因素。这包括保护意识和选择在远程生产系统上部署的必要文件最小集合的标准,以尽量减少安全暴露。

 先决条件

  • 带有 compose 插件的 docker 安装。请参阅 Docker 安装 https://docs.docker.com/engine/install/ 和 Compose 插件 https://docs.docker.com/compose/install/ 中详细的安装步骤。

  • (推荐)对 ROS 2 安全设计的基本理解 https://design.ros2.org/articles/ros2_dds_security.html 。

  • (推荐)完成以前的安全教程。特别是:

    •  设置安全 https://docs.ros.org/en/jazzy/Tutorials/Advanced/Security/Introducing-ros2-security.html

    • 理解安全密钥库 https://docs.ros.org/en/jazzy/Tutorials/Advanced/Security/The-Keystore.html 

    •  设置访问控制 https://docs.ros.org/en/jazzy/Tutorials/Advanced/Security/Access-Controls.html

 一般准则

ROS 2 利用 DDS 安全扩展来确保同一飞地内消息交换的安全性。飞地内的不同签名文件和证书是由受信任实体的证书颁发机构 (CA) 的私钥和证书生成的。事实上,每个飞地可以为身份和权限选择两个不同的 CA。这些 CA 工件存储在密钥库的 private/ 和 public/ 子目录中,文件夹结构如下:

keystore
├── enclaves
│   └── ...
│       └── ...
├── private
│   └── ...
└── public
    └── ...

在典型的生产系统部署中,创建和使用特定证书颁发机构的一个良好实践是:

  1. 在仅供内部使用的组织系统内创建它

  2. 生成/修改所需的飞地时请记住:

  • 并非所有生成的飞地都应部署到所有目标设备。

  • 一种合理的进行方式是每个应用程序有一个独立的区域,从而实现关注点分离。

将 public/ 与相应的 enclaves/ 一起在设置期间运送到不同的远程生产设备中。

保管和保护组织中的 private/ 密钥和/或认证请求

请注意,如果 private/ 文件丢失,将无法更改访问权限、添加或修改安全配置文件。

此外,还可以考虑进一步的做法:

  • 授予对 enclaves/ 目录内容的只读权限

  • 如果提供了符合 PKCS#11 标准的 URI 用于生成飞地的私钥,则可以使用硬件安全模块 (HSM) 来存储它们。https://en.wikipedia.org/wiki/Hardware_security_module

下表描述了与推荐位置相关的密钥库目录的前述声明摘要:

 目录 / 位置

 组织

 目标设备

 材料敏感性

 公共

 低

 私密

 高

 飞地

 中等

Directory / Location

Organization

Target Device

Material Sensitivity

public

Low

private

High

enclaves

Medium

构建部署场景

为了说明一个简单的部署场景,将在 ros:<DISTRO> 提供的镜像之上构建一个新的 docker 镜像。从该镜像开始,将创建三个容器,目的是:

  • 在本地主机的共享卷中初始化密钥库

  • 模拟两个已部署的远程设备以安全的方式相互交互

在此示例中,本地主机充当组织的系统。让我们从创建一个工作区文件夹开始:

mkdir ~/security_gd_tutorial
cd ~/security_gd_tutorial

生成 Docker 镜像

构建一个新的 Docker 镜像,需要一个 Dockerfile。可以使用以下命令获取本教程中建议的 Dockerfile:

# Download the Dockerfile
wget https://raw.githubusercontent.com/ros2/ros2_documentation/jazzy/source/Tutorials/Advanced/Security/resources/deployment_gd/Dockerfile
# 定义一个构建参数ROS_DISTRO,默认值为humble
ARG ROS_DISTRO=humble
# 使用基础镜像ros:${ROS_DISTRO}-ros-base
FROM ros:${ROS_DISTRO}-ros-base


# 安装所需的软件包
RUN apt-get update && apt-get install -y \  # 更新包列表并安装以下软件包
      tree \  # 安装tree工具,用于显示目录树
      ros-${ROS_DISTRO}-demo-nodes-cpp \  # 安装ROS示例节点(C++版本)
      ros-${ROS_DISTRO}-demo-nodes-py && \  # 安装ROS示例节点(Python版本)
    rm -rf /var/lib/apt/lists/*  # 删除apt缓存,减小镜像体积

现在,用以下命令构建 Docker 镜像

# Build the base image
sudo apt install docker.io
sudo docker build -t ros2_security/deployment_tutorial --build-arg ROS_DISTRO=jazzy .
sudo docker build \
  --build-arg HTTP_PROXY=http://127.0.0.1:2334 \
  --build-arg HTTPS_PROXY=http://1270.0.1:2334  \
  --build-arg NO_PROXY=localhost,127.0.0.1,.example.com \
  -t ros2_security/deployment_tutorial --build-arg ROS_DISTRO=jazzy .

056e00a9d37ccfde809715a8829f9479.png

955dd2e6104285a38fc52fd0751eb35d.png

e74478562043ab77b48ee7a81e89c3fb.png

24b6a9e99a8968e93a8c56d5d2d08b57.png

网络原因docker安装镜像失败

#  docker/buildx https://github.com/docker/buildx/releases/

理解 compose 文件

编排配置文件使用镜像来创建作为服务的容器。在本教程中,配置中定义了三个服务:

  • keystore-creator:与之前的教程类似,它在内部初始化一个新的密钥库树目录。这将创建 enclaves/ public/ 和 private/,在 ROS 2 安全飞地 https://design.ros2.org/articles/ros2_security_enclaves.html 中有更详细的解释。 keystore 目录被配置为跨容器的共享卷

  • 监听器和对话者:在本教程中充当远程设备角色。所需的 Security 环境变量以及来自共享卷的必要密钥库文件已被获取。

可以下载 compose 配置 yaml 文件: (compose.deployment.yaml)

# Download the compose file
wget https://raw.githubusercontent.com/ros2/ros2_documentation/jazzy/source/Tutorials/Advanced/Security/resources/deployment_gd/compose.deployment.yaml
services:


  # 在共享卷中创建密钥存储
  keystore-creator:  # 定义服务名称为keystore-creator
    image: ros2_security/deployment_tutorial:latest  # 使用ros2_security/deployment_tutorial:latest镜像
    volumes:
      - ./keystore:/keystore  # 将本地的./keystore挂载到容器的/keystore
    command:  # 执行的命令
      - /bin/bash  # 使用/bin/bash作为shell
      - -c  # 执行-c后面的多行命令
      - |
        ros2 security create_keystore /keystore  # 创建密钥存储在/keystore路径
        ros2 security create_enclave /keystore /talker_listener/talker  # 为talker创建安全区
        ros2 security create_enclave /keystore /talker_listener/listener  # 为listener创建安全区


  # 启动一个模拟远程设备的安全监听器
  listener:  # 定义服务名称为listener
    image: ros2_security/deployment_tutorial:latest  # 使用ros2_security/deployment_tutorial:latest镜像
    container_name: tutorial-listener-1  # 容器名称为tutorial-listener-1
    environment:  # 设置环境变量
      - ROS_SECURITY_KEYSTORE=/keystore  # 指定密钥存储路径
      - ROS_SECURITY_ENABLE=true  # 启用ROS2安全特性
      - ROS_SECURITY_STRATEGY=Enforce  # 安全策略为Enforce
    volumes:  # 挂载卷
      - ./keystore/enclaves/governance.p7s:/keystore/enclaves/governance.p7s  # 挂载governance.p7s文件
      - ./keystore/enclaves/governance.xml:/keystore/enclaves/governance.xml  # 挂载governance.xml文件
      - ./keystore/enclaves/talker_listener/listener:/keystore/enclaves/talker_listener/listener  # 挂载listener的安全区
      - ./keystore/public:/keystore/public  # 挂载public目录
    command: ros2 run demo_nodes_py listener --ros-args --enclave /talker_listener/listener  # 运行监听器节点,并指定安全区
    depends_on:  # 依赖关系
      keystore-creator:  # 依赖于keystore-creator服务
        condition: service_completed_successfully  # 当keystore-creator服务成功完成时启动


  # 启动一个模拟另一个远程设备的安全发布器
  talker:  # 定义服务名称为talker
    image: ros2_security/deployment_tutorial:latest  # 使用ros2_security/deployment_tutorial:latest镜像
    container_name: tutorial-talker-1  # 容器名称为tutorial-talker-1
    environment:  # 设置环境变量
      - ROS_SECURITY_KEYSTORE=/keystore  # 指定密钥存储路径
      - ROS_SECURITY_ENABLE=true  # 启用ROS2安全特性
      - ROS_SECURITY_STRATEGY=Enforce  # 安全策略为Enforce
    volumes:  # 挂载卷
      - ./keystore/enclaves/governance.p7s:/keystore/enclaves/governance.p7s  # 挂载governance.p7s文件
      - ./keystore/enclaves/governance.xml:/keystore/enclaves/governance.xml  # 挂载governance.xml文件
      - ./keystore/enclaves/talker_listener/talker:/keystore/enclaves/talker_listener/talker  # 挂载talker的安全区
      - ./keystore/public:/keystore/public  # 挂载public目录
    command: ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker  # 运行发布器节点,并指定安全区
    depends_on:  # 依赖关系
      keystore-creator:  # 依赖于keystore-creator服务
        condition: service_completed_successfully  # 当keystore-creator服务成功完成时启动

运行示例

在相同的工作目录 ~/security_gd_tutorial 中,运行:

# Start the example
docker compose -f compose.deployment.yaml up

这应该产生以下输出:

  • tutorial-listener-1Found security directory: /keystore/enclaves/talker_listener/listener

  • tutorial-talker-1Found security directory: /keystore/enclaves/talker_listener/talker

  • tutorial-listener-1Publishing: 'Hello World: <number>'

  • tutorial-talker-1I heard: [Hello World: <number>]

检查容器

在运行模拟本教程中两个远程设备的容器时,通过打开两个不同的终端并输入以下内容来连接到每个设备:

# Terminal 1
docker exec -it tutorial-listener-1 bash
cd keystore
tree


# Terminal 2
docker exec -it tutorial-talker-1 bash
cd keystore
tree

应获得类似于下图所示的输出:

# Terminal 1
keystore
 ├── enclaves
 │   ├── governance.p7s
 │   ├── governance.xml
 │   └── talker_listener
 │       └── listener
 │           ├── cert.pem
 │           ├── governance.p7s
 │           ├── identity_ca.cert.pem
 │           ├── key.pem
 │           ├── permissions_ca.cert.pem
 │           ├── permissions.p7s
 │           └── permissions.xml
 └── public
     ├── ca.cert.pem
     ├── identity_ca.cert.pem
     └── permissions_ca.cert.pem


# Terminal 2
keystore
 ├── enclaves
 │   ├── governance.p7s
 │   ├── governance.xml
 │   └── talker_listener
 │       └── talker
 │           ├── cert.pem
 │           ├── governance.p7s
 │           ├── identity_ca.cert.pem
 │           ├── key.pem
 │           ├── permissions_ca.cert.pem
 │           ├── permissions.p7s
 │           └── permissions.xml
 └── public
     ├── ca.cert.pem
     ├── identity_ca.cert.pem
     └── permissions_ca.cert.pem

 请注意:

  • private/ 文件夹没有移动,而是留在本地主机(组织)中。

  • 每个部署的设备都包含其应用所需的最低限度的飞地。

 注意

为了简化起见,在此飞地内,身份和权限均使用相同的 CA。

cf0e8dc5c95228712c4ba739c6fe99f8.png

cf13e9854dbec7eb1a30ded29f9f1b19.png

84c21e1c9517c5439df1ee01f34de710.png

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

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

相关文章

高校体育场小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;状态管理&#xff0c;学生管理&#xff0c;用户管理&#xff0c;体育场管理&#xff0c;用户订单管理&#xff0c;学生订单管理&#xff0c;评价信息管理&#xff0c;交流论坛&#xff0c;系统管理 微…

4 种在 Windows 11/10/8/7 上恢复永久删除文件的可靠方法

您是否在 Windows 11/10/8/7 中从桌面永久删除了重要文件&#xff1f;当您不小心删除文件然后意识到以后需要它们时&#xff0c;这可能是一个真正的痛苦。但别担心&#xff0c;您可以使用多种方法从Windows PC恢复永久删除的文件。在这篇博文中&#xff0c;我们将为您提供 4 种…

机器学习 | 回归算法原理——最小二乘法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。很早便想学习并总结一本很喜欢的机器学习图书——立石贤吾的《白话机器学习的数学》&#xff0c;可谓通俗易懂&#xff0c;清晰形象。那就在此分享并作为学习笔记来记录我的学习过程吧&#xff01;本章的回归算法原理基于《基于…

Flutter Hive NoSql 数据库使用指南

Flutter Hive NoSql 数据库使用指南 视频 https://www.bilibili.com/video/BV1yJ4m1u7P2/ https://youtu.be/UJobRKdp68k 前言 原文 https://ducafecat.com/blog/flutter-hive-nosql-guide 本文将会写一个 Hive CURD 的例子&#xff0c;详细介绍 Hive 这个轻量级的 Flutter …

解决element-plus的Date Picker日期选择器组件禁用时间的坑

目前需求是有一个表单&#xff0c;其中有多个日期组件需要选择时间范围&#xff0c;并且选择的范围不可以有交集重复&#xff0c;所以这里需要用到Date Picker中的disabled-date属性&#xff0c;来判断该日期是否被禁用。 直接上代码&#xff0c;这个是我写的demo代码&#xf…

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022…

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…

leetcode日记(46)最后一个单词的长度

很简单&#xff0c;从后往前遍历即可 class Solution { public:int lengthOfLastWord(string s) {int len0;for(int is.size()-1;i>0;i--){if(s[i]! ) len;else if(len!0) break;}return len;} };

Vision Permutator(TPAMI 2022)论文与代码解析

paper&#xff1a;Vision Permutator: A Permutable MLP-Like Architecture for Visual Recognition official implementation&#xff1a;https://github.com/houqb/VisionPermutator 出发点 现有的MLP模型在编码空间信息时通常会将空间维度展开并沿着展平的维度进行线性投…

《Java初阶数据结构》----3.<线性表---LinkedList与链表>

目录 前言 一、链表的简介 1.1链表的概念 1.2链表的八种结构 重点掌握两种 1.3单链表的常见方法 三、单链表的模拟实现 四、LinkedList的模拟实现&#xff08;双链表&#xff09; 4.1 什么是LinkedList 4.2LinkedList的使用 五、ArrayList和LinkedList的区别 前言 …

无法连接到internet怎么办?已连接但无internet访问,其实并不难

有时我们会遇到无法连接到Internet的问题&#xff0c;由多种原因引起&#xff0c;包括硬件故障、软件设置问题、网络供应商故障等。本文将介绍无法连接到Internet时可以采取的步骤。 简述 当你无法连接到Internet时&#xff0c;可以按照以下步骤进行检查和解决&#xff1a; 1…

数据结构C++——优先队列

文章目录 一、定义二、ADT三、优先队列的描述3.1 线性表3.2 堆3.2.1 最大堆的ADT3.2.2 最大堆的插入3.2.3 最大堆的删除3.2.4 最大堆的初始化3.3 左高树 LT3.3.1 高度优先左高树HBLT3.3.2 重量优先左高树WBLT3.3.3 最大HBLT的插入3.3.4 最大HBLT的删除3.3.5 合并两棵最大HBLT3.…

自用:磁传感器数据解算

协议格式&#xff1a; 详细计算磁场如下&#xff1a; 3字节数据的格式为有符号整型数&#xff0c;数据为补码格式&#xff0c;最高位为符号位。需要先将补码格式的数据转化为10进制的实际值&#xff0c;方法如下&#xff1a; 当数据小于时为正数&#xff0c;实际值为本身&…

Mac中maven配置安装路径

Mac中maven配置安装路径 没有下载maven的可以先下载&#xff1a;&#xff08;这里建议maven版本不要下高了&#xff09; 如果你的bash_profile中没有配置JAVA_HOME路径&#xff0c;可以按照下面的命令配置一下 获取JAVA的安装路径&#xff1a; /usr/libexec/java_home -V …

Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档

什么是 Swagger ? Swagger 是一组围绕 OpenAPI 规范构建的开源工具&#xff0c;可以帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具 包括&#xff1a; Swagger Editor&#xff1a;基于浏览器的编辑器&#xff0c;您可以在其中编写 OpenAPI 定义Swagger UI&…

NSSCTF[堆][tcache]

1. [CISCN 2021 初赛]lonelywolf 题目地址&#xff1a;[CISCN 2021 初赛]lonelywolf | NSSCTF 思路&#xff1a; 修开tcache结构&#xff0c;伪造一个0x91的chunk&#xff0c;伪造0x91chunk的数量&#xff08;填满tcache&#xff09;&#xff0c;再将其释放free进入unsortedb…

Linux中,MySQL数据库基础

21 世纪&#xff0c;人类迈入了“信息爆炸时代”&#xff0c;大量的数据、信息在不断产生&#xff0c;伴随而来的就是如何安全、有效地存储、检索和管理它们。对数据的有效存储、高效访问、方便共享和安全控制已经成为信息时代亟待解决的问题。 数据库简介 使用数据库的必要性…

MATLAB--文件操作相关指令

文章目录 文件操作相关指令前言 M文件创建MATLAB文件操作指令MATLAB文件流控制 文件操作相关指令 前言 记录一下M文件创建、操作、获取信息等相关资料。   MATLAB的M文件是用来代替MATLAB命令行窗口输入指令的文件。因此所有的MATLAB指令都可以再MATLAB的M文件中调用. M文件…

算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公共祖先】

前言 公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。 二叉树篇继续。 一、【236. 二叉树的最近公共祖先】题目阅读 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff…

Spring Bean介绍

目录 1.什么是bean 2.获取bean 3.bean的作用域 4.第三方bean 5.Bean的生命周期 6.Bean的种类 7.为什么使用Bean&#xff1f; 1.什么是bean Bean是Java世界中的一种组件&#xff0c;用于封装数据和逻辑&#xff0c;以便在应用程序中重用和维护。它不仅可以装在数据&#x…