Rust en Microsoft (o la creación de Security Daemon Azure IoT Edge)



Nota del traductor: Rust es un lenguaje de programación relativamente joven, y los ejemplos prácticos siempre son interesantes en esta etapa de desarrollo. Se sabe que Intel, Dropbox, Amazon, Facebook, Google y otros usan Rust en sus proyectos. Se conocía el uso de Rust en el proyecto de Microsoft, pero no había detalles, y esta es probablemente la primera publicación oficial sobre el uso de Rust en Microsoft. (los detalles técnicos del producto en sí se proporcionan "tal cual", especifique los detalles en el sitio web de la compañía)

Azure IoT Edge es un proyecto de software multiplataforma de código abierto creado por el equipo de desarrollo de Azure IoT en Microsoft. Azure IoT Edge "es un servicio de Internet de las cosas basado en el Centro de Internet de las cosas. Este servicio está destinado a clientes que necesitan analizar datos no en la nube, sino en dispositivos periféricos. Como resultado de trasladar parte de la carga de trabajo al área fronteriza, los dispositivos pasan menos tiempo enviando mensajes a la nube y responden más rápidamente a los eventos ". [tomado de la documentación oficial en idioma ruso (1) - aprox. traductor

Esta publicación explica algunas de las razones por las que elegimos Rust como el lenguaje de programación para implementar el componente Security Daemon en el producto.

Security Daemon carga el tiempo de ejecución de Azure IoT Edge. Actúa como mediador de la comunicación entre el tiempo de ejecución de Azure IoT Edge y muchos servicios de host, como el tiempo de ejecución del contenedor y los dispositivos de hardware criptográfico Security Security Modules (HSM) y Trusted Platform Modules (TPM).

Selección técnica de pila para Security Daemon


Cuando comenzamos a trabajar en Security Daemon (en adelante denominado edgelet ), identificamos los siguientes objetivos principales de diseño:
  • edgelet debe ser un componente nativo que no requiera un tiempo de ejecución, como .NET CLR.
  • dado que el edgelet servirá como un canal para acceder al equipo HSM / TPM en el dispositivo, debe ser seguro.
  • edgelet interactuará con el equipo HSM / TPM a través de la interfaz binaria de la aplicación C (ABI), por lo que cargar objetos comunes / DLL y llamar a funciones C debería ser simple.

Según estos puntos, tuvimos que elegir uno de los siguientes lenguajes de programación: C o C ++, o Rust, que se compila en código nativo. La falta de voluntad para cargar los gastos generales del recolector de basura significaba que Go no era adecuado para nosotros. Los requisitos de seguridad del demonio significaban que queríamos evitar errores de memoria y concurrencia. Al final resultó que, dadas estas limitaciones, Rust es perfecto para nosotros. En una publicación anterior (2) en este blog [que significa el blog del Centro de Respuesta de Seguridad de Microsoft - traducción] , se consideraron las ventajas de elegir Rust como lenguaje de programación.

Que nos gustó


Antes de lanzar Azure IoT Edge al público, contratamos a un proveedor de seguridad externo para probar el software de penetración. El hecho de que no encontraron ningún problema con la seguridad de la base del código en Rust fue para nosotros una confirmación de la corrección de nuestra elección. Desde el principio, decidimos que el compilador trataría todas las advertencias como errores, incluidos los errores verificados por clippy. Nuestro sistema de integración continua rechaza un conjunto de solicitudes que no pasan rustfmt, lo que garantiza un formato consistente del código en toda la base del código.

El proceso de actualización del compilador Rust and Cargo [sistema de montaje y gestión de paquetes - aprox. traductor] funciona a la perfección en Azure IoT Edge. La actualización a una nueva versión del compilador es casi siempre una acción indolora.

Aceptación de óxido


El siguiente paso fue aprender el idioma. En comparación con otros lenguajes de programación populares, Rust tiene un umbral de entrada bastante alto, y temíamos qué impacto tendría este estudio en la línea de tiempo del proyecto. Nuestro equipo tenía desarrolladores experimentados en C, C ++, C # y Java, y afortunadamente para nosotros, ¡también hubo varios desarrolladores a quienes les apasionaba Rust!

Se nos ocurrieron talleres de Rust en los que dirigimos un equipo sobre aquellas partes del lenguaje que, en nuestra experiencia, eran bastante difíciles de entender. Estos consumos de tiempo resultaron ser muy útiles. Descubrimos que aprender un idioma terminó no siendo un problema tan grande como imaginábamos.

Durante 4-6 semanas, casi todos los miembros del equipo hicieron una contribución no trivial al código fuente en Rust.

Dificultades


A pesar de que nuestra primera experiencia de lanzar una producción con un producto basado en Rust en Microsoft fue completamente exitosa, habríamos notado varios puntos difíciles:
  • El ecosistema de Rust es todavía relativamente nuevo en comparación con otros idiomas más establecidos. Esto significaba que a menudo teníamos que crear partes de la infraestructura que, de lo contrario, probablemente no necesitaríamos crear.
  • Analizar los mensajes de error del compilador a veces resultaba demasiado complicado, especialmente cuando se trabajaba con código que utilizaba mucho los combinadores de Tokio (3) [un marco asíncrono para Rust] Futures o std :: iter :: Iterator.
  • Los equipos que están acostumbrados a soportar completamente las herramientas de edición y depuración de C # y el código Java no encontraron el mismo soporte en Rust. La extensión VS Code Rust RLS era inestable en la práctica.
  • Desafíos en el análisis de la cadena futura de Tokio
  • A veces no fue fácil clasificar los tipos complejos que inevitablemente surgen en las cadenas de combinación de Tokio Future.


Que sigue


Sería justo señalar aquí que Azure IoT está completamente integrado con el lenguaje de programación Rust. Desde que lanzamos Azure IoT Edge, el uso de Rust solo ha aumentado. Muchos de los proyectos de servicios en la nube en los que actualmente se está trabajando activamente están escritos en Rust. La trinidad que ofrece Rust (seguridad de memoria, seguridad de carrera de datos y rendimiento) es perfecta para Azure IoT. ¡Esperamos tener algo más que decir sobre esto en el futuro!

Raj Wengalil, Gerente General, SWE, Plataforma IoT

Referencias


(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 un traductor: gracias por la ayuda en la traducción de Legatus88 , Funkill , el grupo de telegramas en ruso Rust (@rustlang_ru), KDPV desde aquí .

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


All Articles