Examen du trafic réseau

Objectif : Capturez et examinez le trafic réseau brut ROS 2.

Niveau du didacticiel : Avancé

Durée : 20 minutes

Arrière-plan

La sécurité des communications ROS 2 consiste à protéger les communications entre les nœuds. Les tutoriels précédents activaient la sécurité, mais comment pouvez-vous vraiment savoir si le trafic est chiffré ? Dans ce didacticiel, nous examinerons la capture du trafic réseau en direct pour montrer la différence entre le trafic chiffré et non chiffré.

Exécutez la démo

Installer tcpdump

Commencez dans une nouvelle fenêtre de terminal en installant tcpdump, un outil de ligne de commande pour capturer et afficher le trafic réseau. Bien que ce didacticiel décrive les commandes tcpdump, vous pouvez également utiliser Wireshark, un outil graphique similaire pour capturer et analyser le trafic.

sudo apt update
sudo apt install tcpdump

Exécutez les commandes suivantes sur une seule machine via plusieurs sessions ssh.

Démarrer le locuteur et l’auditeur

Redémarrez à la fois le locuteur et l’auditeur, chacun dans son propre terminal. Les variables d’environnement de sécurité ne sont pas définies, la sécurité n’est donc pas activée pour ces sessions.

# In terminal 1:
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

# In terminal 2:
ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

Afficher les paquets de découverte non chiffrés

Avec le talker et le listener en cours d’exécution, ouvrez un autre terminal et lancez tcpdump pour examiner le trafic réseau. Vous devez utiliser sudo car la lecture du trafic réseau brut est une opération privilégiée.

La commande ci-dessous utilise l’option -X pour imprimer le contenu des paquets, l’option -i pour écouter les paquets sur n’importe quelle interface et ne capture que UDP trafic du port 7400.

sudo tcpdump -X -i any udp port 7400

Vous devriez voir des paquets comme celui-ci

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

Il s’agit d’un datagramme de découverte - le locuteur à la recherche d’abonnés. Comme vous pouvez le voir, le nom du nœud (/talker_listener/talker) et l’enclave (également /talker_listener/talker) sont passés en texte brut. Vous devriez également voir des datagrammes de découverte similaires du nœud listener. Quelques autres fonctionnalités d’un paquet de découverte typique :

  • L’adresse de destination est 239.255.0.1, qui est une adresse IP multidiffusion ; ROS 2 utilise le trafic multidiffusion pour la découverte par défaut.

  • UDP 7400 est le port de destination, conformément à la spécification DDS-RTPS.

  • Le paquet contient la balise « RTPS », également telle que définie dans la spécification DDS-RTPS.

Afficher les paquets de données non chiffrés

Utilisez tcpdump pour capturer les paquets RTPS sans découverte en filtrant sur les ports UDP supérieurs à 7400 :

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

Vous verrez peu de types de paquets différents, mais faites attention à quelque chose comme ce qui suit qui est évidemment des données envoyées d’un locuteur à un auditeur :

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

Quelques fonctionnalités à noter à propos de ce paquet :

  • Le contenu du message, « Hello World: 2135 », est envoyé en texte clair

  • L’adresse IP source et destination est localhost : étant donné que les deux nœuds s’exécutent sur la même machine, les nœuds se sont découverts sur l’interface localhost

Activer le chiffrement

Arrêtez à la fois le locuteur et les nœuds d’écoute. Activez le chiffrement pour les deux en définissant les variables d’environnement de sécurité et exécutez-les à nouveau.

# In terminal 1:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keys
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

# In terminal 2:
export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keys
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforce
ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

Afficher les paquets de découverte chiffrés

Exécutez la même commande tcpdump utilisée précédemment pour examiner la sortie du trafic de découverte avec le chiffrement activé :

sudo tcpdump -X -i any udp port 7400

Le paquet de découverte typique ressemble un peu à ce qui suit : :

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

Ce paquet est beaucoup plus volumineux et comprend des informations qui peuvent être utilisées pour configurer le chiffrement entre les nœuds ROS. Comme nous le verrons bientôt, cela inclut en fait certains des fichiers de configuration de sécurité qui ont été créés lorsque nous avons activé la sécurité. Intéressé à en savoir plus? Jetez un œil à l’excellent article Network Reconnaissance and Vulnerability Excavation of Secure DDS Systems pour comprendre pourquoi cela est important.

Afficher les paquets de données chiffrés

Utilisez maintenant tcpdump pour capturer les paquets de données :

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

Un paquet de données typique ressemble à ce qui suit : :

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

Les données de ce paquet RTPS sont toutes cryptées.

En plus de ce paquet de données, vous devriez voir des paquets supplémentaires avec des noms de nœud et d’enclave ; ceux-ci prennent en charge d’autres fonctionnalités ROS telles que les paramètres et les services. Les options de chiffrement de ces paquets peuvent également être contrôlées par la politique de sécurité.