Rust言語のメリットと課題、「Azure IoT Edge」の事例から分かること:Microsoft社内の採用事例
MicrosoftはRust言語を実運用環境で採用した。「Azure IoT Edge」に向けたセキュリティデーモンを実装するプログラミング言語として利用している。Microsoft Security Response Center(MSRC)は、このような決定の背景と、実装過程で分かったメリットと課題について解説した。
Microsoft Security Response Center(MSRC)は2019年9月30日(米国時間)、Microsoft社内におけるRust言語の採用事例を発表した。
「Azure IoT Edge」のセキュリティデーモンコンポーネントを実装するプログラミング言語として「Rust」を選択した背景と、実装過程で分かったメリットと課題が分かる。
Azure IoT Edgeは、MicrosoftのAzure IoTチームが手掛けるオープンソースのクロスプラットフォームソフトウェアプロジェクト。プロジェクトの目的は、クラウドからオンプレミスネットワーク内のエッジへとコンピューティング機能の分散を進め、管理する上での問題解決だ。
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.
関連記事
- Microsoft、安全で高効率のプログラミング言語として「Rust」を高く評価
Microsoft Security Response Center(MSRC)は、ソフトウェアのセキュリティ確保と効率性の両方の要件を満たす最も有望なシステムプログラミング言語の一つとして、「Rust」を高く評価した。メモリ破壊バグをそもそも作り込まないことでセキュリティを確保できるという。 - Microsoftが「Rust」言語を導入、安全性以外の理由あり(続報)
Microsoft Security Response Center(MSRC)は、C/C++に代わるシステムプログラミング言語の最有力の選択肢として「Rust」を挙げ、その理由を解説した。合わせてMicrosoftのような大規模なコードベースを持つ企業にとっての課題も示した。 - 「Azure IoT Edge」ソリューション用のCI/CDパイプラインを作成する、Azure Pipelinesを利用
Microsoftは、さまざまなプラットフォームでAzure IoT Edgeモジュールをビルドしてプッシュし、一連のAzure IoT Edgeデバイスに継続的に提供する簡単な方法を紹介した。「Azure Pipelines」内の「Azure IoT Edge」タスクを使用する。