Paramétrage des contrôles d’accès

Objectif : Limiter les sujets qu’un nœud peut utiliser.

Niveau du didacticiel : Avancé

Durée : 20 minutes

Arrière-plan

Les autorisations sont assez flexibles et peuvent être utilisées pour contrôler de nombreux comportements dans le graphe ROS.

Pour ce didacticiel, nous démontrons une stratégie qui autorise uniquement la publication de messages sur le sujet par défaut chatter. Cela empêcherait, par exemple, de remapper le sujet lors du lancement de l’écouteur ou d’utiliser les mêmes enclaves de sécurité à d’autres fins.

Afin d’appliquer cette politique, nous devons mettre à jour le fichier permissions.xml et le re-signer avant de lancer le nœud. Cela peut être fait en modifiant manuellement le fichier d’autorisations ou en utilisant des modèles XML.

Modifier permissions.xml

Commencez par faire une sauvegarde de vos fichiers de permissions et ouvrez permissions.xml pour le modifier :

cd ~/sros2_demo/demo_keys/enclaves/talker_listener/talker
mv permissions.p7s permissions.p7s~
mv permissions.xml permissions.xml~
vi permissions.xml

Nous allons modifier la <allow_rule> pour <publish> et <subscribe>. Les rubriques de ce fichier XML utilisent le format de dénomination DDS, et non le nom ROS. Trouvez des détails sur le mappage des noms de rubrique entre ROS et DDS dans le document de conception Topic and Service Names.

Collez le contenu XML suivant dans permission.xml, enregistrez le fichier et quittez l’éditeur de texte. Cela montre les sujets ROS chatter et rosout renommés respectivement en sujets DDS rt/chatter et 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">
  <permissions>
    <grant name="/talker_listener/talker">
      <subject_name>CN=/talker_listener/talker</subject_name>
      <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>
        </domains>
        <publish>
          <topics>
            <topic>rt/chatter</topic>
            <topic>rt/rosout</topic>
            <topic>rt/parameter_events</topic>
            <topic>*/talker/*</topic>
          </topics>
        </publish>
        <subscribe>
          <topics>
            <topic>rt/parameter_events</topic>
            <topic>*/talker/*</topic>
          </topics>
        </subscribe>
      </allow_rule>
      <allow_rule>
        <domains>
          <id>0</id>
        </domains>
        <publish>
          <topics>
            <topic>ros_discovery_info</topic>
          </topics>
        </publish>
        <subscribe>
          <topics>
            <topic>ros_discovery_info</topic>
          </topics>
        </subscribe>
      </allow_rule>
      <default>DENY</default>
    </grant>
  </permissions>
</dds>

Cette politique permet au locuteur de publier sur les sujets chatter et rosout. Il permet également d’inclure les autorisations de publication et d’abonnement nécessaires au nœud locuteur pour gérer les paramètres (une exigence pour tous les nœuds). Les autorisations de découverte restent inchangées par rapport au modèle d’origine.

Signer le fichier de stratégie

Cette commande suivante crée le nouveau fichier de stratégie signé S/MIME permissions.p7s à partir du fichier XML mis à jour permissions.xml. Le fichier doit être signé avec le certificat Permissions CA, qui nécessite l’accès à la clé privée Permission CA. Si la clé privée a été protégée, des étapes supplémentaires peuvent être nécessaires pour la déverrouiller et l’utiliser conformément à votre plan de sécurité.

openssl smime -sign -text -in permissions.xml -out permissions.p7s \
  --signer permissions_ca.cert.pem \
  -inkey ~/sros2_demo/demo_keys/private/permissions_ca.key.pem

Lancer le nœud

Avec les autorisations mises à jour en place, nous pouvons lancer le nœud avec succès en utilisant la même commande utilisée dans les tutoriels précédents :

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

Cependant, tenter de remapper le sujet chatter empêche le nœud de se lancer (notez que cela nécessite que ROS_SECURITY_STRATEGY soit défini sur Enforce).

ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker \
  --remap chatter:=not_chatter

Utilisez les modèles

Les politiques de sécurité peuvent rapidement devenir déroutantes, c’est pourquoi les utilitaires sros2 ajoutent la possibilité de créer des politiques à partir de modèles. Pour ce faire, utilisez le sample policy file fourni dans le sros2 dépôt. Créons une politique pour le talker et le listener pour n’utiliser que le sujet chatter.

Commencez par télécharger le référentiel sros2 avec les exemples de fichiers de stratégie :

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

Utilisez ensuite le verbe create_permission tout en pointant vers l’exemple de stratégie pour générer les fichiers d’autorisation XML :

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

Ces fichiers d’autorisation permettent aux nœuds de publier ou de s’abonner uniquement au sujet chatter et d’activer les communications requises pour les paramètres.

Dans un terminal avec la sécurité activée comme dans les tutoriels de sécurité précédents, exécutez le programme de démonstration talker :

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

Dans un autre terminal, faites de même avec le programme listener :

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

À ce stade, vos nœuds talker et listener communiqueront en toute sécurité à l’aide de listes de contrôle d’accès explicites. Cependant, la tentative suivante pour que le nœud listener s’abonne à un sujet autre que chatter échouera :

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