您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.

部署指南

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

辅导水平: 高级

时间 20 分钟

背景介绍

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

遵守 DDS 安全标准,"...... sros2 软件包提供了一系列实用程序,以高度模块化和灵活的方式管理 ROS 2 环境下的安全。

如何组织不同的证书、密钥和目录的基本核心准则仍然是避免损害系统安全的关键因素。这包括保护意识和标准,用于选择部署到远程生产系统的最小必要文件集,以最大限度地降低安全风险。

先决条件

一般准则

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

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

在生产系统的典型部署中创建和使用某个证书颁发机构的良好做法是:

  1. 在组织系统内创建,仅供内部使用。

  2. 生成/修改所需的飞地,同时铭记

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

    • 合理的做法是,每份申请都有一个飞地,这样就可以把关注点分开。

  3. 船舶 公众/ 与相应的 飞地/ 在设置过程中,将这些信息输入不同的远程生产设备。

  4. 保存和保护 私人/ 组织内的钥匙和/或认证申请。

需要注意的是,如果 私人/ 文件丢失后,将无法再更改访问权限、添加或修改安全配置文件。

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

  • 授予 飞地/ 目录内容。

  • 如果为生成飞地私钥提供了符合 PKCS#11 标准的 URI,则会出现一个 硬件安全模块(HSM) 可以用来存储它们。

下表概述了前面有关 Keystore 目录和推荐位置的说明:

目录 / 位置

组织结构

目标设备

材料敏感性

私人

飞地

中型

构建部署方案

为了说明一个简单的部署场景,我们将在由 ros:<DISTRO>;.从图像开始,将创建三个容器,目的是

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

  • 模拟两台已部署的远程设备以安全的方式进行交互。

在本例中,本地主机作为组织的系统。让我们先创建一个工作区文件夹:

mkdir ~/security_gd_tutorial
CD ~/security_gd_tutorial

生成 Docker 映像

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

# 下载 Dockerfile
wget https://raw.githubusercontent.com/ros2/ros2_documentation/rolling/source/Tutorials/Advanced/Security/resources/deployment_gd/Dockerfile

现在,用命令构建 docker 镜像:

# 生成基础图像
装卸工 构建 -t ros2_security/deployment_tutorial -构建参数 罗斯_迪斯特罗=滚动 .

了解撰写文件

编译配置文件将一个映像作为服务创建容器。在本教程中,配置中定义了三个服务:

  • 密钥库创建器:与之前的教程类似,它会在内部初始化一个新的密钥存储树目录。这将创建 飞地/ 公众/私人/详细说明见 ROS 2 安全飞地.......。 钥匙库 目录被配置为跨容器的共享卷。

  • 听众话匣子:在本教程中充当远程设备行为者。需要 安全 环境变量以及共享卷中的必要密钥存储文件。

可通过以下链接下载编译配置 yaml 文件:

# 下载撰写文件
wget https://raw.githubusercontent.com/ros2/ros2_documentation/rolling/source/Tutorials/Advanced/Security/resources/deployment_gd/compose.deployment.yaml

运行示例

在同一工作目录中 ~/security_gd_tutorial运行:

# 启动示例
装卸工 缀合 -f compose.deployment.yaml 向上

输出结果如下

  • 教程-监听器-1: 已找到 安全 目录: /keystore/enclaves/talker_listener/listener

  • 教程-对话者-1: 已找到 安全 目录: /keystore/enclaves/talker_listener/talker

  • 教程-监听器-1: 出版: 你好 世界: <number>'

  • 教程-对话者-1: I 听说: [你好 世界: <数字>]

检查集装箱

在运行本教程中模拟两个远程设备的容器时,打开两个不同的终端并输入,分别连接到它们:

# 1 号航站楼
装卸工 执行 -它 教程-监听器-1 敲击
CD 钥匙库树

# 2 号航站楼
装卸工 执行 -它 教程-对话者-1 敲击
CD 钥匙库树

应获得与下图类似的输出结果:

# 1 号航站楼
钥匙库
 ├── 飞地
    ├── 治理.p7s
    ├── 治理.xml
    └── 听众
        └── 听众
            ├── cert.pem
            ├── 治理.p7s
            ├── identity_ca.cert.pem
            ├── key.pem
            ├── permissions_ca.cert.pem
            ├── 权限.p7s
            └── permissions.xml
 └──      ├── ca.cert.pem
     ├── identity_ca.cert.pem
     └── permissions_ca.cert.pem

# 2 号航站楼
钥匙库
 ├── 飞地
    ├── 治理.p7s
    ├── 治理.xml
    └── 听众
        └── 话匣子
            ├── cert.pem
            ├── 治理.p7s
            ├── identity_ca.cert.pem
            ├── key.pem
            ├── permissions_ca.cert.pem
            ├── 权限.p7s
            └── permissions.xml
 └──      ├── ca.cert.pem
     ├── identity_ca.cert.pem
     └── permissions_ca.cert.pem

请注意

  • 私人/ 文件夹不会移动,而是留在本地主机(组织)中。

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

备注

为简单起见,在这个飞地内,身份和权限都使用同一个 CA。