Tauri調べてみた
開発作業や日々の生活をする中でツールを作ったりするときありますよね。TauriはGUIを作るためのフレームワークでこういうちょっとしたツールを作ることにも使えるフレームワークです。
昔はC#,WPFでGUIを作っていたのですが、RustやWeb系の技術スタックに興味があったのでTauriについて調べてみました。
何ができるの?
ここに書いてあることを列挙すると
- Brown Field
特定のフロントエンド技術スタックに依存していないので、既存のフロントエンド資産をなんでも流用できます。自分の得意な技術スタックを使える - Security
書いてあることが長いためあとに記載 - FLOSS
MITまたはMIT/Apache 2.0ライセンス(該当する場合)により、再ライセンスおよび再配布が可能です。 - Bundle Size
OSのネイティブレンダラーを使用するため軽い。ElectronではChromiumを使用するため比較すると思い - Cross Platform
サンプルのGitHub Actionを使用するとWindows, Linux, Mac向けに提供できる - Built on Rust
パフォーマンスとセキュリティを中心に据えたRustで開発できる
Security
一部抜粋ですが、以下のような技術が紹介されています。
-
No Server Required
Tauriでは、バックエンドとの通信にサーバーを使用することなく、ユーザーインターフェイスにWebテクノロジーを使用したアプリケーションを構築できます。このためサーバー攻撃の手法から守ることができ、攻撃対象を減らすことができている -
Language Features of Rust
メモリの安全性が高いRustを使用することで、"Use after free" 脆弱性のような、悪意のある攻撃者がシステムに侵入するといったことが起こりえない -
Ahead of Time Compilation:AOT
Ahead of Timeコンパイラを使用すると、セッションごとに一意のコード参照を生成され、実行コードを攻撃者が確認することが難しい -
Functional ASLR
ASLR自体はスタックなどのメモリ配置をランダム化してスタックオーバーフロー対策などを行う技術。Tauriでは実行時に関数名をランダム化し、OTPハッシュを実装することができるため、2つのセッションが同じになることはないため、静的攻撃を防ぐことができる -
Allowing API
API関数をUIやRustで利用できるようにするか、選択することができます
Process Model
Electronと同じようにマルチプロセスアーキテクチャを利用している。
Why Multiple Processes?
複数のプロセスで処理と権限を分担することで、UIがフリーズするようなことは防止しやすくし、クラッシュが起きたとして影響を一部にとどめて再起動を容易することができ、悪用された場合のリスクも制限するため
The Core Process
オペレーティングシステムにフルアクセスできる唯一のコンポーネントであるコアプロセスがあります。Core Processは、設定やデータベース接続などのグローバル・ステートの管理も担当し、フロントエンドの覗き見からビジネス上の機密データを保護することができる
The WebView Process
Coreプロセスは、実際のユーザーインターフェース(UI)そのものをレンダリングするのではなく、オペレーティングシステムが提供するWebViewライブラリを活用するWebViewプロセスを利用します。
Windows:Microsoft Edge WebView2
Linux:webkitgtk
macOS:WKWebView
Inter-Process Communication
プロセス間通信(IPC)は、分離されたプロセスが安全に通信することを可能にし、より複雑なアプリケーションを構築するための鍵となります。
Tauriは非同期メッセージパッシングと呼ばれるプロセス間通信の特殊なスタイルを採用して、共有メモリーや関数への直接アクセスよりも安全な手法である。
Events
Eventはfire-and-forget(※)の一方向IPCメッセージで、ライフサイクルのイベントや状態の変更を伝えるのに最適なメッセージです。コマンドとは異なり、EventはFrontendとTauri Coreの両方から発行できます。
(※)メッセージを送信した後にその応答を待たずに処理を継続する手法
Commands
リクエストを出して応答を待つようなIPCメッセージであり、TauriはIPCメッセージの上に外部関数インターフェースのような抽象化を提供する。主要なAPIであるinvokeは、ブラウザのfetch APIに似ており、FrontendがRust関数を呼び出し、引数を渡し、データを受け取ることを可能にしている。
守るべきこととしては、リクエストとレスポンスをシリアライズするためにJSON-RPCのようなプロトコルを使用するため、すべての引数とリターンデータはJSONにシリアライズ可能でなければなりません。
Discussion