mcpField
U
understanding-tauri-runtime-authority

understanding-tauri-runtime-authority

github.com/dchukセキュリティ36148 回インストール40 週間前に更新
リポジトリ

understanding-tauri-runtime-authority について

Tauri のランタイムオーソリティが WebView からコマンドへの要求を制御する仕組みを説明する技術資料スキルです。権限、ケイパビリティ、スコープの設定やデバッグを行う開発者向けです。

主な機能

  1. 01IPC 要求の送信元検証
  2. 02ウィンドウのケイパビリティ解決
  3. 03コマンド権限の確認
  4. 04スコープの注入と適用
  5. 05拒否ルールを許可ルールより優先
  6. 06パストラバーサルの防止

活用シーン

  1. 01コマンド呼び出しの権限拒否を調査
  2. 02パス単位でファイルアクセスを制限
  3. 03ウィンドウごとに権限を分離
  4. 04ランタイムアクセス設定を監査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dchuk/claude-code-tauri-skills --skill understanding-tauri-runtime-authority

インストール後、Claude Code で/understanding-tauri-runtime-authorityを入力して読み込まれたか確認します。

詳細

Tauri ランタイム権限管理

ランタイム権限管理は、アプリケーションの実行中にセキュリティポリシーを適用する、Tauri の中核コンポーネントです。コマンドの実行前に権限を検証し、ケイパビリティを解決して、スコープを注入します。

ランタイム権限管理とは?

ランタイム権限管理は、WebView フロントエンドと Tauri コマンドの間に位置する適用レイヤーです。すべての IPC(プロセス間通信)リクエストに対する門番として機能します。

中核機能

Webview が Tauri コマンドを呼び出すと、ランタイム権限管理は次の処理を行います。

  1. Webview からの呼び出しリクエストを受け取ります
  2. リクエスト元が、要求されたコマンドを呼び出すことを許可されているか検証します
  3. リクエスト元が適用対象のケイパビリティに属していることを確認します
  4. 定義されたスコープをリクエストに注入します
  5. 検証済みのリクエストを Tauri コマンドに渡します

リクエスト元が許可されていない場合、リクエストは拒否され、コマンドは実行されません。

信頼境界モデル

Tauri は、Rust コアコードと WebView フロントエンドコードを分離する信頼境界を実装しています。

ゾーン信頼レベルアクセス
Rust コア完全に信頼システムへの無制限アクセス
WebView フロントエンド限定的な信頼IPC 経由で公開されたリソースのみ

ランタイム権限管理は、実行時にこの境界を適用します。

セキュリティアーキテクチャ

ランタイム権限管理の役割
Frontend (WebView)
       |
       v
[IPC Invoke Request]
       |
       v
+------------------+
| Runtime Authority|  <-- Validates permissions, capabilities, scopes
+------------------+
       |
       v (if allowed)
[Tauri Command Execution]
       |
       v
[System Resources]
主なコンポーネント
コンポーネントランタイムでの役割
権限使用可能なコマンドと、そのアクセスルールを定義します
ケイパビリティ権限を特定のウィンドウ/webview に割り当てます
スコープパス/リソースの制限によってコマンドの動作を制約します
ランタイム権限管理実行時に上記すべてを適用します

ランタイムでのケイパビリティ解決

コマンドが呼び出されると、ランタイム権限管理は適用対象のケイパビリティを解決します。

解決プロセス
  1. リクエスト元の特定:リクエストを送信したウィンドウ/webview を特定します
  2. ケイパビリティの照合:このウィンドウを含むすべてのケイパビリティを探します
  3. 権限の収集:照合されたすべてのケイパビリティの権限を集約します
  4. コマンドアクセスの確認:コマンドが許可されていることを確認します
  5. スコープの統合:適用されるすべてのスコープ制限を統合します
  6. 検証または拒否:スコープを注入して処理を進めるか、リクエストを拒否します
ウィンドウのケイパビリティの統合

ウィンドウが複数のケイパビリティに含まれている場合、セキュリティ境界は統合されます。

// capability-1.json
{
  "identifier": "basic-access",
  "windows": ["main"],
  "permissions": ["fs:allow-read-file"]
}

// capability-2.json
{
  "identifier": "write-access",
  "windows": ["main"],
  "permissions": ["fs:allow-write-file"]
}

結果:「main」ウィンドウには、読み取りと書き込みの両方の権限が付与されます。

プラットフォーム固有の解決

ケイパビリティは特定のプラットフォームを対象にできます。実行時には、現在のプラットフォームに一致するケイパビリティのみが考慮されます。

{
  "identifier": "desktop-features",
  "platforms": ["linux", "macOS", "windows"],
  "windows": ["main"],
  "permissions": ["shell:allow-execute"]
}

iOS/Android では、このケイパビリティは実行時に無視されます。

アクセス制御の適用

拒否ルールの優先

アクセスを評価する際、拒否ルールは常に優先されます。

{
  "permissions": [
    {
      "identifier": "fs:allow-read-file",
      "allow": [{ "path": "$HOME/**" }],
      "deny": [{ "path": "$HOME/.ssh/**" }]
    }
  ]
}

実行時:

  • $HOME/documents/file.txt の読み取りリクエスト — 許可
  • $HOME/.ssh/id_rsa の読み取りリクエスト — 拒否(拒否ルールに一致)
コマンドレベルの検証

コマンドの実行前に、次の処理を行います。

  1. ランタイム権限管理が、コマンドの権限が存在するか確認します
  2. 呼び出し元のウィンドウが、そのケイパビリティを通じて該当する権限を持つことを確認します
  3. スコープ制限が満たされていることを検証します
Window "editor" calls fs.readFile("/home/user/doc.txt")
                        |
                        v
Runtime Authority checks:
  - Does "editor" have fs:allow-read-file? Yes
  - Is "/home/user/doc.txt" in allowed scope? Yes
  - Is it in any deny scope? No
                        |
                        v
Command executes with scopes injected

スコープの注入

ランタイムでのスコープの仕組み

スコープは単なる検証ルールではありません。コマンドの実行コンテキストに注入されます。コマンドは適用対象のスコープにアクセスして、制限を適用できます。

スコープ変数

実行時には、スコープ変数は実際のパスに解決されます。

変数ランタイムでの解決先
$APPアプリケーションのインストールディレクトリ
$APPDATAアプリデータディレクトリ
$APPCONFIGアプリ設定ディレクトリ
$HOMEユーザーのホームディレクトリ
$TEMP一時ディレクトリ
$DOCUMENTドキュメントディレクトリ
$DOWNLOADダウンロードディレクトリ
$DESKTOPデスクトップディレクトリ
スコープの組み合わせ例
{
  "identifier": "main-capability",
  "windows": ["main"],
  "permissions": [
    {
      "identifier": "fs:allow-read-file",
      "allow": [{ "path": "$APPDATA/*" }]
    },
    {
      "identifier": "fs:allow-write-file",
      "allow": [{ "path": "$APPDATA/config.json" }]
    }
  ]
}

実行時の「main」ウィンドウでは:

  • $APPDATA/* での読み取り操作が許可されます
  • 書き込み操作は $APPDATA/config.json に対してのみ許可されます

パストラバーサルの防止

ランタイム権限機構には、パストラバーサルを防止する機能が組み込まれています。

Request: /usr/path/to/../../../etc/passwd
Result: DENIED (path traversal detected)

パス内の親ディレクトリアクセサー(..)はブロックされるため、スコープ制限を回避できません。

設定例

基本的なランタイムセキュリティの設定

src-tauri/capabilities/default.json:

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "default-capability",
  "description": "Default runtime permissions",
  "windows": ["main"],
  "permissions": [
    "core:default",
    "core:event:default",
    "core:window:default"
  ]
}
スコープを指定したファイルシステムアクセス

src-tauri/capabilities/files.json:

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "file-access",
  "description": "Controlled filesystem access",
  "windows": ["main"],
  "permissions": [
    "fs:default",
    {
      "identifier": "fs:allow-read-file",
      "allow": [
        { "path": "$APPDATA/**" },
        { "path": "$DOCUMENT/**" }
      ],
      "deny": [
        { "path": "$DOCUMENT/private/**" }
      ]
    },
    {
      "identifier": "fs:allow-write-file",
      "allow": [
        { "path": "$APPDATA/**" }
      ]
    }
  ]
}
複数ウィンドウのセキュリティ境界

src-tauri/capabilities/editor.json:

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "editor-capability",
  "description": "Full editor permissions",
  "windows": ["editor"],
  "permissions": [
    "core:default",
    "fs:default",
    "fs:allow-read-file",
    "fs:allow-write-file",
    "dialog:default"
  ]
}

src-tauri/capabilities/preview.json:

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "preview-capability",
  "description": "Read-only preview permissions",
  "windows": ["preview"],
  "permissions": [
    "core:window:default",
    "core:event:default",
    {
      "identifier": "fs:allow-read-file",
      "allow": [{ "path": "$TEMP/preview/**" }]
    }
  ]
}

実行時:

  • "editor" ウィンドウはファイルの読み書きとダイアログの表示が可能です
  • "preview" ウィンドウは一時プレビュー用ディレクトリからの読み取りのみ可能です
HTTP リクエストのスコープ設定
{
  "identifier": "api-access",
  "windows": ["main"],
  "permissions": [
    {
      "identifier": "http:default",
      "allow": [
        { "url": "https://api.myapp.com/*" },
        { "url": "https://cdn.myapp.com/*" }
      ],
      "deny": [
        { "url": "https://api.myapp.com/admin/*" }
      ]
    }
  ]
}

ランタイムセキュリティの保証

ランタイム権限機構で保護されるもの
脅威保護
フロントエンドの侵害許可された権限の範囲内にのみ被害を制限します
許可されていないコマンドへのアクセス明示的なケイパビリティがないコマンドは拒否されます
パストラバーサル攻撃実行時に組み込みの防止機能が働きます
スコープの回避の試みコマンド実行前にすべてのスコープが適用されます
ウィンドウ間のアクセス各ウィンドウは自身のケイパビリティの範囲内に隔離されます
ランタイム権限機構で保護されないもの
脅威保護されない理由
悪意のある Rust コードRust コアは完全に信頼されています
過度に許可的な設定開発者の責任です
WebView の脆弱性OS の WebView セキュリティ境界によります
サプライチェーン攻撃依存関係のセキュリティの問題です

ランタイム権限機構のデバッグ

権限拒否エラー

コマンドが権限拒否で失敗した場合:

  1. ウィンドウラベルを確認:リクエストを行っているウィンドウを確認します
  2. ケイパビリティを確認:ケイパビリティがそのウィンドウを対象としていることを確認します
  3. 権限を確認:ケイパビリティにその権限が含まれていることを確認します
  4. スコープを確認:リソースが許可スコープ内にあり、拒否対象ではないことを確認します
よくあるランタイムの問題
問題原因解決策
コマンドが許可されないケイパビリティに権限がないケイパビリティに権限を追加します
スコープが適用されない権限にスコープが定義されていない許可スコープを追加します
許可されているのにアクセスが拒否される拒否ルールが優先される競合する拒否ルールを削除します
ウィンドウに権限がないケイパビリティがウィンドウを対象としていないケイパビリティのウィンドウラベルを確認します
ランタイム設定の確認

生成されたスキーマを確認して、利用可能な権限を調べます。

src-tauri/gen/schemas/desktop-schema.json
src-tauri/gen/schemas/mobile-schema.json

ベストプラクティス

最小権限の原則

各ウィンドウに実際に必要な権限のみを付与します。

// Good: Specific permissions
{
  "windows": ["settings"],
  "permissions": [
    "core:window:allow-close",
    "fs:allow-read-file"
  ]
}

// Avoid: Overly broad permissions
{
  "windows": ["settings"],
  "permissions": ["fs:default", "shell:default"]
}
常にスコープを定義する

ファイルシステムやネットワークの権限にスコープを設定せずに残してはいけません。

// Good: Scoped access
{
  "identifier": "fs:allow-read-file",
  "allow": [{ "path": "$APPDATA/**" }]
}

// Avoid: Unscoped access
{
  "permissions": ["fs:allow-read-file"]
}
機密性の高いパスを拒否する

機密性の高い場所へのアクセスを明示的に拒否します。

{
  "identifier": "fs:allow-read-file",
  "allow": [{ "path": "$HOME/**" }],
  "deny": [
    { "path": "$HOME/.ssh/**" },
    { "path": "$HOME/.gnupg/**" },
    { "path": "$HOME/.aws/**" }
  ]
}
信頼レベルごとにケイパビリティを分ける

セキュリティコンテキストごとに個別のケイパビリティを作成します。

capabilities/
  main-trusted.json      # Full access for main window
  plugin-limited.json    # Restricted for plugin windows
  preview-readonly.json  # Read-only for preview
プラットフォーム固有のセキュリティ

OS 固有の権限にはプラットフォームターゲティングを使用します。

{
  "identifier": "desktop-shell",
  "platforms": ["linux", "macOS", "windows"],
  "windows": ["main"],
  "permissions": ["shell:allow-execute"]
}

これにより、デスクトップ専用の権限がモバイルで評価されるのを防げます。

まとめ

ランタイム権限機構は、Tauri の ACL ベースのセキュリティモデルを適用する仕組みです。

  1. すべての IPC リクエストは、ランタイム権限の検証を経ます
  2. ケイパビリティは呼び出し元のウィンドウに基づいて実行時に解決されます
  3. スコープはコマンド実行コンテキストに注入されます
  4. 拒否ルールは常に許可ルールより優先されます
  5. パストラバーサルは自動的にブロックされます
  6. セキュリティ境界は複数のケイパビリティを持つウィンドウで統合されます

ケイパビリティと権限を正しく設定すれば、ランタイム権限機構によって、アプリケーションの実行中を通じて一貫して適用されます。

コメント