🙄

Tauri調べてみた

2024/02/28に公開

開発作業や日々の生活をする中でツールを作ったりするときありますよね。TauriはGUIを作るためのフレームワークでこういうちょっとしたツールを作ることにも使えるフレームワークです。

昔はC#,WPFでGUIを作っていたのですが、RustやWeb系の技術スタックに興味があったのでTauriについて調べてみました。

何ができるの?

ここに書いてあることを列挙すると
https://tauri.app/

  • 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