Rust chez Microsoft (ou la création de Security Daemon Azure IoT Edge)



Note du traducteur: Rust est un langage de programmation relativement jeune, et les exemples pratiques sont toujours intéressants à ce stade de développement. Il est connu qu'Intel, Dropbox, Amazon, Facebook, Google et d'autres utilisent Rust dans leurs projets. À propos de l'utilisation de Rust dans le projet de Microsoft était connu, mais il n'y avait aucun détail, et c'est probablement la première publication officielle sur l'utilisation de Rust chez Microsoft. (les détails techniques du produit lui-même sont fournis «en l'état», précisez les détails sur le site Web de l'entreprise)

Azure IoT Edge est un projet logiciel multiplateforme open source créé par l'équipe de développement Azure IoT de Microsoft. Azure IoT Edge “est un service Internet des objets basé sur le Centre Internet des objets. Ce service est destiné aux clients qui ont besoin d'analyser des données non pas dans le cloud, mais sur des appareils périphériques. Du fait du déplacement d'une partie de la charge de travail vers la zone frontalière, les appareils passent moins de temps à envoyer des messages vers le cloud et répondent plus rapidement aux événements. » [extrait de la documentation officielle en russe (1) - env. traducteur]

Cet article explique certaines des raisons pour lesquelles nous avons choisi Rust comme langage de programmation pour implémenter le composant Security Daemon dans le produit.

Le démon de sécurité charge le runtime Azure IoT Edge. Il agit comme médiateur de la communication entre le runtime Azure IoT Edge et de nombreux services hôtes tels que le runtime de conteneur et les périphériques matériels cryptographiques Security Security Modules (HSM) et Trusted Platform Modules (TPM).

Sélection de la pile technique pour Security Daemon


Lorsque nous avons commencé à travailler sur Security Daemon (ci-après dénommé edgelet ), nous avons identifié les principaux objectifs de conception suivants:
  • edgelet doit être un composant natif qui ne nécessite pas d'exécution, tel que le .NET CLR.
  • puisque l'edgelet servira de canal pour accéder à l'équipement HSM / TPM sur l'appareil, il doit être sécurisé.
  • edgelet interagira avec l'équipement HSM / TPM via l'interface binaire de l'application C (ABI), donc le chargement d'objets / DLL communs et l'appel de fonctions C devraient être simples.

Selon ces points, nous avons dû choisir l'un des langages de programmation suivants: C ou C ++, ou Rust, qui se compile en code natif. La réticence à supporter les frais généraux du ramasse-miettes signifiait que Go ne nous convenait pas. Les exigences de sécurité du démon signifiaient que nous voulions éviter les erreurs de mémoire et de concurrence. En fin de compte, étant donné ces limites, Rust est parfait pour nous. Dans une publication précédente (2) sur ce blog [signifiant le blog «Microsoft Security Response Center» - commentaire de traduction] , les avantages du choix de Rust comme langage de programmation ont été examinés.

Qu'aimons-nous


Avant de rendre public Azure IoT Edge, nous avons engagé un fournisseur de sécurité externe pour tester les logiciels de pénétration. Le fait qu'ils n'aient trouvé aucun problème avec la sécurité de la base de code à Rust était pour nous une confirmation de l'exactitude de notre choix. Dès le début, nous avons décidé que le compilateur traiterait tous les avertissements comme des erreurs, y compris les erreurs vérifiées par clippy. Notre système d'intégration continue rejette un pool de demandes qui ne passent pas rustfmt, ce qui garantit un formatage cohérent du code dans toute la base de code.

Le processus de mise à jour du compilateur Rust and Cargo [système de gestion d'assemblage et de colis - env. traducteur] fonctionne de manière transparente dans Azure IoT Edge. La mise à niveau vers une nouvelle version du compilateur est presque toujours une action indolore.

Acceptation de la rouille


L'étape suivante consistait à apprendre la langue. Comparé à d'autres langages de programmation populaires, Rust a un seuil d'entrée assez élevé, et nous craignions l'impact de cette étude sur le calendrier du projet. Notre équipe avait des développeurs expérimentés en C, C ++, C # et Java, et heureusement pour nous, il y avait aussi plusieurs développeurs qui étaient très passionnés par Rust!

Nous avons créé des ateliers de Rust dans lesquels nous avons dirigé une équipe sur les parties de la langue qui, selon notre expérience, étaient assez difficiles à comprendre. Ces consommations de temps se sont avérées très utiles. Nous avons constaté que l'apprentissage d'une langue n'était finalement pas un problème aussi important que nous le pensions.

Pendant 4 à 6 semaines, presque tous les membres de l'équipe ont apporté une contribution non triviale au code source de Rust.

Des difficultés


Malgré le fait que notre première expérience de lancement d'une production avec un produit à base de rouille chez Microsoft ait été complètement réussie, nous aurions noté plusieurs points difficiles:
  • L'écosystème Rust est encore relativement nouveau par rapport à d'autres langues plus établies. Cela signifiait que nous devions souvent créer des parties de l'infrastructure que nous n'aurions probablement pas besoin de créer autrement.
  • L'analyse des messages d'erreur du compilateur s'est parfois avérée trop compliquée, en particulier lorsque vous travaillez avec du code qui utilise fortement des combinateurs de Tokio (3) [un framework asynchrone pour Rust] Futures ou std :: iter :: Iterator.
  • Les équipes habituées à prendre pleinement en charge les outils d'édition et de débogage C # et le code Java n'ont pas trouvé le même support dans Rust. L'extension VS Code Rust RLS était instable dans la pratique.
  • Défis dans Tokio Future Chain Analysis
  • Parfois, il n'était pas facile de trier les types complexes qui surviennent inévitablement dans les chaînes combinatoires Tokio Future.


Et ensuite


Il serait juste de noter ici que Azure IoT est entièrement intégré au langage de programmation Rust. Depuis la sortie d'Azure IoT Edge, l'utilisation de Rust n'a fait qu'augmenter. De nombreux projets de services cloud actuellement en cours de développement sont écrits en rouille. La trinité qu'offre Rust (sécurité de la mémoire, sécurité de la course aux données et performances) est parfaite pour Azure IoT. Nous espérons que nous aurons autre chose à dire à ce sujet à l'avenir!

Raj Wengalil, directeur général, SWE, IoT Platform

Les références


(1) docs.microsoft.com/en-us/azure/iot-edge
(2) msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming
(3) tokio.rs

De la part d'un traducteur: merci pour l'aide à la traduction de Legatus88 , Funkill , le groupe de télégrammes en langue russe Rust (@rustlang_ru), KDPV d'ici .

Source: https://habr.com/ru/post/fr469961/


All Articles