Rust言語のメリットと課題、「Azure IoT Edge」の事例から分かることMicrosoft社内の採用事例

MicrosoftはRust言語を実運用環境で採用した。「Azure IoT Edge」に向けたセキュリティデーモンを実装するプログラミング言語として利用している。Microsoft Security Response Center(MSRC)は、このような決定の背景と、実装過程で分かったメリットと課題について解説した。

» 2019年10月02日 18時00分 公開
[@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 Microsoft Security Response Center(MSRC)は2019年9月30日(米国時間)、Microsoft社内におけるRust言語の採用事例を発表した。

 「Azure IoT Edge」のセキュリティデーモンコンポーネントを実装するプログラミング言語として「Rust」を選択した背景と、実装過程で分かったメリットと課題が分かる。

 Azure IoT Edgeは、MicrosoftのAzure IoTチームが手掛けるオープンソースのクロスプラットフォームソフトウェアプロジェクト。プロジェクトの目的は、クラウドからオンプレミスネットワーク内のエッジへとコンピューティング機能の分散を進め、管理する上での問題解決だ。

Azure IoT Edgeデバイスとクラウドの関係(出典:Microsoft

 Azure IoT Edgeのセキュリティデーモンは、Azure IoT Edgeランタイムを起動(ブートストラップ)する。さらに、Azure IoTランタイムとさまざまなホストサービスの間で通信ブローカーとして機能する。例えばコンテナランタイムや、ハードウェアベース暗号化デバイスのHSM(Hardware Security Modules)やTPM(Trusted Platform Modules)などのホストサービスだ。

セキュリティデーモンの要件と技術スタックの選択

 セキュリティデーモン(Microsoft社内ではエッジレットと呼ぶ)の開発に着手するに当たり、まず次のような設計目標を定めた。

  • エッジレットは、実行する際に.NET CLR(Common Language Runtime)のようなランタイムを必要としないネイティブコンポーネントでなければならない
  • エッジレットは、デバイス上のHSM/TPMハードウェアにアクセスするためのチャネルとして機能するので、セキュアでなければならない
  • エッジレットはC ABI(Application Binary Interface)を介してHSM/TPMハードウェアと通信する。そのため、オブジェクト/DLLのロードとC関数の呼び出しが簡潔でなければならない

 これらの設計目標から、C、C++、Rustなど、ネイティブコードにコンパイルされるプログラミング言語を選択することになった。

 ガベージコレクションのランタイムオーバーヘッドを避けたかったため、Go言語は選択肢から外れた。加えて、デーモンに必要なセキュリティ関連の要件から、メモリや並行性(コンカレンシー)に由来するバグに対処する必要のない言語が必要だった(関連記事)。こうした条件を踏まえ、Rustが最適だという結論に達した。

Rustの採用で得たものとは?

 Azure IoT Edgeの一般提供を開始する前に外部のセキュリティベンダーと契約し、開発したソフトウェアに対するペネトレーションテストを実施した。その結果、コードベースのうち、Rustで作成した部分では、セキュリティ問題が見つからなかった。

 開発時にはRustエコシステムが役立った。開発当初から、「rust-clippy」を使用し、Rustコンパイラがカバーしない範囲の細かい警告を出力させることにした。

 加えて、継続的インテグレーション(CD)を実行する際、Rustコードの整形ツール「rustfmt」による処理を経ていないプルリクエストを却下する仕組みを採用したことで、コードベース全体で一貫したコードの整形が可能になった。

 Rustコンパイラの更新プロセスとツール整備は順調に進んだ。コンパイラへのアップグレードは、ほぼ常にスムーズだった。

Rust言語は難しくないのか

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。