Introduction
Un startup matériel audio a besoin d'une infrastructure pour la signature de firmware, l'activation de périphériques et la livraison OTA. Les options des hyperscalers comme AWS KMS et Azure signing services sont trop coûteuses pour une entreprise bootstrappée. L'utilisation de WebAssembly semble être la solution idéale en raison de son sandboxing par conception, de sa compilation en un petit fichier binaire et de son support de réseau réel avec WASI Preview 2.
Contexte Technique
Le but est de créer un runtime WebAssembly minimal, similaire à Cloudflare Workers, mais auto-hébergé sur du matériel standard. Le projet, appelé Badwater, utilise Wasmtime et Rust pour exécuter du code non fiable de manière sécurisée. Cependant, les premiers tutoriels trouvés ne font pas la distinction entre les modules core et les composants, ce qui entraîne des problèmes avec l'utilisation de wasmtime::Func::wrap et wasmtime::Linker.
Un problème majeur est la panique du thread 'tokio-rt-worker' en raison de l'appel à block_on à l'intérieur d'un thread Tokio worker. La solution est d'utiliser spawn_blocking pour déplacer l'exécution de Wasmtime hors du thread pool async.
Analyse et Implications
Un runtime WebAssembly fonctionnel est une chose, mais un runtime multi-locataires en est une autre. La question est de savoir comment isoler les locataires pour éviter que le code d'un locataire ne puisse affecter un autre. La solution est d'utiliser deux binaires séparés : badwater-dispatcher pour gérer les requêtes et badwater-runner pour exécuter le code WebAssembly.
Chaque requête déclenche un nouveau processus badwater-runner, qui communique avec badwater-dispatcher via une paire de sockets Unix. Cela permet d'assurer l'isolation des locataires et de prévenir les accès non autorisés au système hôte. De plus, l'utilisation de bubblewrap pour le sandboxing Linux ajoute une couche de sécurité supplémentaire.
Perspective
Le projet Badwater démontre que la création d'un runtime WebAssembly multi-locataires sécurisé et auto-hébergé est possible en quelques jours. Cependant, il est important de surveiller les limites et les prochaines étapes, telles que l'amélioration de la scalabilité et de la fiabilité, ainsi que l'intégration de fonctionnalités supplémentaires pour répondre aux besoins des utilisateurs.