understanding-tauri-runtime-authority について
Tauri のランタイムオーソリティが WebView からコマンドへの要求を制御する仕組みを説明する技術資料スキルです。権限、ケイパビリティ、スコープの設定やデバッグを行う開発者向けです。
主な機能
- 01IPC 要求の送信元検証
- 02ウィンドウのケイパビリティ解決
- 03コマンド権限の確認
- 04スコープの注入と適用
- 05拒否ルールを許可ルールより優先
- 06パストラバーサルの防止
活用シーン
- 01コマンド呼び出しの権限拒否を調査
- 02パス単位でファイルアクセスを制限
- 03ウィンドウごとに権限を分離
- 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 コマンドを呼び出すと、ランタイム権限管理は次の処理を行います。
- Webview からの呼び出しリクエストを受け取ります
- リクエスト元が、要求されたコマンドを呼び出すことを許可されているか検証します
- リクエスト元が適用対象のケイパビリティに属していることを確認します
- 定義されたスコープをリクエストに注入します
- 検証済みのリクエストを 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 に割り当てます |
| スコープ | パス/リソースの制限によってコマンドの動作を制約します |
| ランタイム権限管理 | 実行時に上記すべてを適用します |
ランタイムでのケイパビリティ解決
コマンドが呼び出されると、ランタイム権限管理は適用対象のケイパビリティを解決します。
解決プロセス
- リクエスト元の特定:リクエストを送信したウィンドウ/webview を特定します
- ケイパビリティの照合:このウィンドウを含むすべてのケイパビリティを探します
- 権限の収集:照合されたすべてのケイパビリティの権限を集約します
- コマンドアクセスの確認:コマンドが許可されていることを確認します
- スコープの統合:適用されるすべてのスコープ制限を統合します
- 検証または拒否:スコープを注入して処理を進めるか、リクエストを拒否します
ウィンドウのケイパビリティの統合
ウィンドウが複数のケイパビリティに含まれている場合、セキュリティ境界は統合されます。
// 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の読み取りリクエスト — 拒否(拒否ルールに一致)
コマンドレベルの検証
コマンドの実行前に、次の処理を行います。
- ランタイム権限管理が、コマンドの権限が存在するか確認します
- 呼び出し元のウィンドウが、そのケイパビリティを通じて該当する権限を持つことを確認します
- スコープ制限が満たされていることを検証します
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 セキュリティ境界によります |
| サプライチェーン攻撃 | 依存関係のセキュリティの問題です |
ランタイム権限機構のデバッグ
権限拒否エラー
コマンドが権限拒否で失敗した場合:
- ウィンドウラベルを確認:リクエストを行っているウィンドウを確認します
- ケイパビリティを確認:ケイパビリティがそのウィンドウを対象としていることを確認します
- 権限を確認:ケイパビリティにその権限が含まれていることを確認します
- スコープを確認:リソースが許可スコープ内にあり、拒否対象ではないことを確認します
よくあるランタイムの問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| コマンドが許可されない | ケイパビリティに権限がない | ケイパビリティに権限を追加します |
| スコープが適用されない | 権限にスコープが定義されていない | 許可スコープを追加します |
| 許可されているのにアクセスが拒否される | 拒否ルールが優先される | 競合する拒否ルールを削除します |
| ウィンドウに権限がない | ケイパビリティがウィンドウを対象としていない | ケイパビリティのウィンドウラベルを確認します |
ランタイム設定の確認
生成されたスキーマを確認して、利用可能な権限を調べます。
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 ベースのセキュリティモデルを適用する仕組みです。
- すべての IPC リクエストは、ランタイム権限の検証を経ます
- ケイパビリティは呼び出し元のウィンドウに基づいて実行時に解決されます
- スコープはコマンド実行コンテキストに注入されます
- 拒否ルールは常に許可ルールより優先されます
- パストラバーサルは自動的にブロックされます
- セキュリティ境界は複数のケイパビリティを持つウィンドウで統合されます
ケイパビリティと権限を正しく設定すれば、ランタイム権限機構によって、アプリケーションの実行中を通じて一貫して適用されます。