当前位置:   article > 正文

【ROS2】高级:安全-检查网络流量

【ROS2】高级:安全-检查网络流量

目标:捕获和检查原始 ROS 2 网络流量。

 教程级别:高级

 时间:20 分钟

 内容

  •  概述

  •  先决条件

  •  运行演示

    •  安装 tcpdump

    • 启动说话者和听者

    • 显示未加密的发现数据包

    • 显示未加密的数据包

    •  启用加密

    • 显示加密的发现数据包

    • 显示加密数据包

 概述

ROS 2 通信安全是关于保护节点之间的通信。之前的教程启用了安全性,但你如何真正判断流量是否被加密?在本教程中,我们将通过捕获实时网络流量来展示加密和未加密流量之间的区别。

 注意

rmw_fastrtps_cpp 默认使用共享内存传输https://fast-dds.docs.eprosima.com/en/latest/fastdds/transport/shared_memory/shared_memory.html ,以提高端点在同一主机系统中时传输层的性能。安全飞地仍然适用,数据将被加密。但是,您无法捕获实时网络流量,因为数据不会出现在网络接口上。如果您使用 rmw_fastrtps_cpp ,则需要通过本教程并在发布者和订阅者之间使用不同的主机系统,或者通过启用 UDP 传输 https://fast-dds.docs.eprosima.com/en/latest/fastdds/transport/udp/udp.html#enabling-udp-transport 和设置 Fast-DDS XML 配置 https://github.com/ros2/rmw_fastrtps#full-qos-configuration 来禁用共享内存传输。

 先决条件

本指南仅在 Linux 上运行,并假设您已安装 ROS 2。

运行演示 

 安装 tcpdump 

在新的终端窗口中开始安装 tcpdump  https://www.tcpdump.org/manpages/tcpdump.1.html ,这是一个用于捕获和显示网络流量的命令行工具。虽然本教程描述了 tcpdump 命令,您也可以使用 Wireshark https://www.wireshark.org/ ,这是一个类似的图形工具,用于捕获和分析流量。

  1. sudo apt update
  2. sudo apt install tcpdump

在单台机器上通过多个 ssh 会话运行以下命令。

启动说话者和听者

请重新启动讲述者和监听器,每个在自己的终端中。安全环境变量未设置,因此这些会话未启用安全性。

  1. # Disable ROS Security for both terminals
  2. unset ROS_SECURITY_ENABLE
  3. # In terminal 1:
  4. ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
  5. # In terminal 2:
  6. ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

显示未加密的发现数据包

在运行对话者和监听器的情况下,打开另一个终端并启动 tcpdump 以查看网络流量。由于读取原始网络流量是特权操作,因此需要使用 sudo 。

下面的命令使用 -X 选项打印数据包内容,使用 -i 选项监听任何接口上的数据包,并且只捕获 UDP 7400 端口 https://en.wikipedia.org/wiki/User_Datagram_Protocol 的流量。

sudo tcpdump -X -i any udp port 7400

你应该看到如下的数据包:

e7fcc8f13f20aee62895cdf3575ff5f6.png

  1. 20:18:04.400770 IP 8_xterm.46392 > 239.255.0.1.7400: UDP, length 252
  2. 0x0000: 4500 0118 d48b 4000 0111 7399 c0a8 8007 E.....@...s.....
  3. 0x0010: efff 0001 b538 1ce8 0104 31c6 5254 5053 .....8....1.RTPS
  4. ...
  5. 0x00c0: 5800 0400 3f0c 3f0c 6200 1c00 1800 0000 X...?.?.b.......
  6. 0x00d0: 2f74 616c 6b65 725f 6c69 7374 656e 6572 /talker_listener
  7. 0x00e0: 2f74 616c 6b65 7200 2c00 2800 2100 0000 /talker.,.(.!...
  8. 0x00f0: 656e 636c 6176 653d 2f74 616c 6b65 725f enclave=/talker_
  9. 0x0100: 6c69 7374 656e 6572 2f74 616c 6b65 723b listener/talker;
  10. 0x0110: 0000 0000 0100 0000 ........

这是一个发现数据报——发言者正在寻找订阅者。正如您所看到的,节点名称( /talker_listener/talker )和飞地(也是 /talker_listener/talker )以纯文本形式传递。您还应该看到来自 listener 节点的类似发现数据报。典型发现数据包的其他一些功能:

  • 目标地址是 239.255.0.1,这是一个多播 IP 地址;ROS 2 默认使用多播流量进行发现。

  • UDP 7400 是目标端口,根据 DDS-RTPS 规范。https://www.omg.org/spec/DDSI-RTPS/About-DDSI-RTPS/

  • 数据包包含“RTPS”标签,也如 DDS-RTPS 规范中定义的那样。

显示未加密的数据包

使用 tcpdump 通过过滤 7400 以上的 UDP 端口来捕获非发现 RTPS 数据包

sudo tcpdump -i any -X udp portrange 7401-7500

你会看到几种不同类型的数据包,但请注意以下明显是从讲话者发送到听众的数据包:

5f2614c7a312605de34c6c347db30c8c.png

  1. 20:49:17.927303 IP localhost.46392 > localhost.7415: UDP, length 84
  2. 0x0000: 4500 0070 5b53 4000 4011 e127 7f00 0001 E..p[S@.@..'....
  3. 0x0010: 7f00 0001 b538 1cf7 005c fe6f 5254 5053 .....8...\.oRTPS
  4. 0x0020: 0203 010f 010f 4874 e752 0000 0100 0000 ......Ht.R......
  5. 0x0030: 0901 0800 cdee b760 5bf3 5aed 1505 3000 .......`[.Z...0.
  6. 0x0040: 0000 1000 0000 1204 0000 1203 0000 0000 ................
  7. 0x0050: 5708 0000 0001 0000 1200 0000 4865 6c6c W...........Hell
  8. 0x0060: 6f20 576f 726c 643a 2032 3133 3500 0000 o.World:.2135...

关于此数据包的一些功能:

  • 消息内容“Hello World: 2135”以明文发送

  • 源和目标 IP 地址是 localhost :由于两个节点都在同一台机器上运行,节点在 localhost 接口上发现了彼此

启用加密

停止讲者和监听器节点。通过设置安全环境变量为两者启用加密,然后重新运行它们。

  1. # In terminal 1:
  2. export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
  3. export ROS_SECURITY_ENABLE=true
  4. export ROS_SECURITY_STRATEGY=Enforce
  5. ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker
  6. # In terminal 2:
  7. export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
  8. export ROS_SECURITY_ENABLE=true
  9. export ROS_SECURITY_STRATEGY=Enforce
  10. ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

显示加密的发现数据包

运行之前使用的相同 tcpdump 命令,以检查启用加密的发现流量的输出:

sudo tcpdump -X -i any udp port 7400

典型的发现数据包看起来如下所示:

54232d84670a1c7d855025cb12e5fd20.png

  1. 21:09:07.336617 IP 8_xterm.60409 > 239.255.0.1.7400: UDP, length 596
  2. 0x0000: 4500 0270 c2f6 4000 0111 83d6 c0a8 8007 E..p..@.........
  3. 0x0010: efff 0001 ebf9 1ce8 025c 331e 5254 5053 .........\3.RTPS
  4. 0x0020: 0203 010f bbdd 199c 7522 b6cb 699f 74ae ........u"..i.t.
  5. ...
  6. 0x00c0: 5800 0400 3f0c ff0f 6200 2000 1a00 0000 X...?...b.......
  7. 0x00d0: 2f74 616c 6b65 725f 6c69 7374 656e 6572 /talker_listener
  8. 0x00e0: 2f6c 6973 7465 6e65 7200 0000 2c00 2800 /listener...,.(.
  9. 0x00f0: 2300 0000 656e 636c 6176 653d 2f74 616c #...enclave=/tal
  10. 0x0100: 6b65 725f 6c69 7374 656e 6572 2f6c 6973 ker_listener/lis
  11. 0x0110: 7465 6e65 723b 0000 0110 c400 1400 0000 tener;..........
  12. 0x0120: 4444 533a 4175 7468 3a50 4b49 2d44 483a DDS:Auth:PKI-DH:
  13. 0x0130: 312e 3000 0400 0000 0c00 0000 6464 732e 1.0.........dds.
  14. ...
  15. 0x0230: 1100 0000 6464 732e 7065 726d 5f63 612e ....dds.perm_ca.
  16. 0x0240: 616c 676f 0000 0000 0d00 0000 4543 4453 algo........ECDS
  17. 0x0250: 412d 5348 4132 3536 0000 0000 0000 0000 A-SHA256........
  18. 0x0260: 0510 0800 0700 0080 0600 0080 0100 0000 ................

这个数据包要大得多,并且包含可用于在 ROS 节点之间设置加密的信息。正如我们很快将看到的那样,这实际上包括一些在我们启用安全性时创建的安全配置文件。想了解更多吗?看看优秀的论文《安全 DDS 系统的网络侦察和漏洞挖掘》 https://arxiv.org/abs/1908.05310 以了解为什么这很重要。

显示加密数据包

现在使用 tcpdump 来捕获数据包:

sudo tcpdump -i any -X udp portrange 7401-7500

一个典型的数据包如下所示:

2922daa521b3e0c76e4c6777d38f832f.png

  1. 21:18:14.531102 IP localhost.54869 > localhost.7415: UDP, length 328
  2. 0x0000: 4500 0164 bb42 4000 4011 8044 7f00 0001 E..d.B@.@..D....
  3. 0x0010: 7f00 0001 d655 1cf7 0150 ff63 5254 5053 .....U...P.cRTPS
  4. 0x0020: 0203 010f daf7 10ce d977 449b bb33 f04a .........wD..3.J
  5. 0x0030: 3301 1400 0000 0003 492a 6066 8603 cdb5 3.......I*`f....
  6. 0x0040: 9df6 5da6 8402 2136 0c01 1400 0000 0000 ..]...!6........
  7. 0x0050: 0203 010f daf7 10ce d977 449b bb33 f04a .........wD..3.J
  8. ...
  9. 0x0130: 7905 d390 3201 1400 3ae5 0b60 3906 967e y...2...:..`9..~
  10. 0x0140: 5b17 fd42 de95 54b9 0000 0000 3401 1400 [..B..T.....4...
  11. 0x0150: 42ae f04d 0559 84c5 7116 1c51 91ba 3799 B..M.Y..q..Q..7.
  12. 0x0160: 0000 0000 ....

RTPS 数据包中的所有数据都是加密的

除了这个数据包之外,您还应该看到带有节点和飞地名称的其他数据包;这些支持其他 ROS 功能,例如参数和服务。这些数据包的加密选项也可以由安全策略控制。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/881817
推荐阅读
相关标签
  

闽ICP备14008679号