i18n(ja) Japanese Text for Security Section (#3221)

Co-authored-by: Vitor Ayres <gitkey@virtuaires.com.br>
This commit is contained in:
Junichi TAKAI (たかい じゅんいち)
2025-08-17 06:12:59 +09:00
committed by GitHub
parent 4acf0b444c
commit 8e46177eb7
10 changed files with 1298 additions and 0 deletions

View File

@@ -0,0 +1,207 @@
---
title: セキュリティ・レベル Capabilities
sidebar:
order: 4
i18nReady: true
---
Tauri は、アプリケーションおよびプラグインの開発者に「セキュリティ・レベル」システムを提供し、システム WebView で実行されているアプリケーション・フロントエンドへのコア部の開示に関して細かい有効化/無効化の制限を設けています。
> > > 《訳注》 **セキュリティ・レベル** 原文は 「capabilities system」能力システム。情報開示レベルの決定能力を示すものであるため、本稿では「セキュリティ・レベル」と訳しています。
「セキュリティ・レベル」Capabilitiesとは、付与されたラベルに従ってアプリケーション・ウィンドウと Webview に割り当てられる [アクセス権Permissions](/ja/security/permissions/) のセットのことです。「セキュリティ・レベル」は複数のウィンドウや Webview の処理に関与し、また、複合的セキュリティ設定の中で参照される可能性があります。
:::tip[Security Tipヒント]
複数のセキュリティ・レベルの対象であるウィンドウと WebView は、関連するすべてのセキュリティ・レベルの「アクセス権」と「セキュリティ境界」とを効果的に統合します。
:::
セキュリティ・レベルを記述するファイルCapability filesは、JSON または TOML ファイルとして `src-tauri/capabilities` ディレクトリ内で定義されています。
それぞれのファイルを用いて `tauri.conf.json` 内で「識別子」でのみ参照するのがよくあるやりかたですが、この二つを `capabilities` フィールドで直接定義することもできます。
`capabilities` ディレクトリ内のすべてのセキュリティ・レベル機能は、デフォルトで自動的に有効になります。一旦 `tauri.conf.json` でセキュリティ・レベル機能が明示的に有効化されると、アプリケーションのビルドではその機能のみが使用されます。
体系的な設定項目の詳細については、[参考情報](/ja/reference/config/) の項を参照してください。
次の JSON の例では、コア・プラグインと `window.setTitle` API に対するデフォルト機能を有効化するセキュリティ・レベル設定を定義しています。
```json title="src-tauri/capabilities/default.json"
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-capability",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"core:path:default",
"core:event:default",
"core:window:default",
"core:app:default",
"core:resources:default",
"core:menu:default",
"core:tray:default",
"core:window:allow-set-title"
]
}
```
このスニペット(抜粋内容)は、[Tauri Configuration]/ja/develop/configuration-files/tauri-の設定)ファイルの一部です。
これがおそらく最も一般的な設定方法で、個々のセキュリティ・レベルを行内に埋め込み(インライン化)、アクセス権のみを「識別子」によって参照します。
これには、適切に定義された機能ファイルが `capabilities` ディレクトリ内に必要です。
```json title=src-tauri/tauri.conf.json
{
"app": {
"security": {
"capabilities": ["my-capability", "main-capability"]
}
}
}
```
インライン化された「セキュリティ・レベル」設定は、事前に定義された「セキュリティ・レベル」設定とも併記できます。
```json title=src-tauri/tauri.conf.json
{
"app": {
"security": {
"capabilities": [
{
"identifier": "my-capability",
"description": "My application capability used for all windows",
"windows": ["*"],
"permissions": ["fs:default", "allow-home-read-extended"]
},
"my-second-capability"
]
}
}
}
```
## 対象となるプラットフォーム
「セキュリティ・レベル」は、「`platforms` 配列」を定義することで、各プラットフォーム毎に設定が可能です。
デフォルトでは、「セキュリティ・レベル〕設定はすべてのターゲットに適用されますが、`linux`・`macOS`・`windows`・`iOS`・`android` の各ターゲット OS をサブセットで選択できます。
次の例は、デスクトップ・オペレーティング・システム用の「セキュリティ・レベル」設定です。
この設定では、デスクトップでのみ使用可能なプラグインのアクセス権を有効化していることに注目してください:
```json title="src-tauri/capabilities/desktop.json"
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "desktop-capability",
"windows": ["main"],
"platforms": ["linux", "macOS", "windows"],
"permissions": ["global-shortcut:allow-register"]
}
```
モバイル機器用の「セキュリティ・レベル」設定の事例はこちら。
この設定では、モバイル OS でのみ使用可能なプラグインのアクセス権を有効化することに注意してください:
```json title="src-tauri/capabilities/mobile.json"
{
"$schema": "../gen/schemas/mobile-schema.json",
"identifier": "mobile-capability",
"windows": ["main"],
"platforms": ["iOS", "android"],
"permissions": [
"nfc:allow-scan",
"biometric:allow-authenticate",
"barcode-scanner:allow-scan"
]
}
```
## リモート API アクセス
デフォルトでは、API は Tauri アプリにバンドルされているコードにのみアクセス可能です。
リモート・ソースが特定の Tauri コマンドにアクセスできるようにするためには、セキュリティ・レベル設定ファイルで定義する必要があります。
以下の事例では、NFC タグをスキャンし、`tauri.app` のすべてのサブドメインからバーコード・スキャナーを使用できるようにしています。
```json title="src-tauri/capabilities/remote-tags.json"
{
"$schema": "../gen/schemas/remote-schema.json",
"identifier": "remote-tag-capability",
"windows": ["main"],
"remote": {
"urls": ["https://*.tauri.app"]
},
"platforms": ["iOS", "android"],
"permissions": ["nfc:allow-scan", "barcode-scanner:allow-scan"]
}
```
:::caution[(警告)]
Linux および Android では、Tauri は埋め込み `<iframe>` タグからの要求とウィンドウ自体からの要求とを区別できません。
この「リモート API アクセス」機能の変更については十分に注意し、この機能に関する「参考情報 References」のセクションで、対象オペレーティング・システム特定のセキュリティ上の影響について詳しく理解した上で行なってください。
:::
## セキュリティ境界 Security Boundaries
_どのようなことから保護されるのでしょうか_
「アクセス権」と「セキュリティ・レベル」に応じて、次のことが可能になります:
- フロントエンドでの「セキュリティ侵害」の影響を最小限に抑えます
- ローカル・システムのインターフェースとデータの(偶発的な)「漏洩」を防止または軽減します
- フロントエンドからバックエンド/システムへの「権限昇格」を防止または軽減します
_どのようなことからは保護**されない**のでしょうか_
- 悪意のある、または安全でない「Rust コード」
- 緩すぎる「スコープ(適用範囲)」と「設定内容」
- コマンド実装における不正確な「スコープ・チェック」
- Rust コードからの「意図的な逸脱」
- 基本的に、アプリの Rust Core に記述されたもの「すべて」
- システム WebView 内の「ゼロデイ攻撃」またはパッチ未適用の「ワンデイ攻撃」
- 「サプライチェーン攻撃」または「不正侵入された開発者システム」
:::tip[Security Tipヒント]
セキュリティ境界は「ウィンドウ・ラベル」(**「タイトル」ではありません**)に依存します。
ウィンドウ生成機能は、より高い権限を持つウィンドウに対してのみ適用可能にすることを推奨します。
:::
## スキーマ・ファイル
Tauri は、アプリケーションで利用可能なすべてのアクセス権を持つ「JSON スキーマ」を生成しますので、使用している IDE統合開発環境で自動補完が行なえるようになります。
スキーマを使用するには、「設定」内の `$schema` プロパティを `gen/schemas` ディレクトリにあるプラットフォーム固有のスキーマの一つにセットします。
通常は `../gen/schemas/desktop-schema.json` または `../gen/schemas/mobile-schema.json` にセットしますが、特定のターゲット・プラットフォーム用のセキュリティ・レベルを定義することもできます。
## 設定ファイル
Tauri アプリケーションのディレクトリ構造例(簡略版):
```sh
tauri-app
├── index.html
├── package.json
├── src
├── src-tauri
│ ├── Cargo.toml
│ ├── capabilities
│ └── <identifier>.json/toml
│ ├── src
│ ├── tauri.conf.json
```
すべての項目を `tauri.conf.json` にインライン化できますが、少し高度な設定をするとこのファイルが肥大化してしまいます。
この方式の目標は、アクセス権を可能な限り単純化し、理解しやすくすることです。
## コア・アクセス権
すべてのコア・アクセス限のリストは、「参考情報 References」の [コア・アクセス権](/ja/reference/acl/core-permissions/) ページにあります。
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,46 @@
---
title: コンテンツ・セキュリティー・ポリシーCSP
sidebar:
order: 6
i18nReady: true
---
Tauri は HTML ページの [コンテンツ・セキュリティ・ポリシー]CSPを制限します。{/* 原文 restricts「制限する」ですが、この訳で正しいか不明です。 */}
これを使用すると、クロス・サイト・スクリプティングXSSのような一般的な Web ベースの脆弱性による影響を軽減または防止できます。
ローカル・スクリプトはハッシュ化され、スタイルと外部スクリプトは「ワンタイム暗号化乱数データnonce」を使用して参照されますので、許可されていないコンテンツが読み込まれるのを防止できます。
:::caution[(警告)]
CDNコンテンツ配信ネットワーク経由で提供されるスクリプトなどのリモート・コンテンツは「攻撃ベクトル」進入経路を取り込む可能性があるため、読み込みを避けてください。
概して、信頼できないファイルはどれも、新しい巧妙な攻撃ベクトルの侵入を許す可能性があります。
:::
CSPコンテンツ・セキュリティ・ポリシーによる保護は、Tauri 設定ファイルに登録されている場合にのみ有効になります。
このため、できる限り対象を絞り、Webview が信頼できるホスト(できれば自分で所有するホスト)からのアセットのみを読み込むようにする必要があります。
コンパイル時に、Tauri は、バンドルされたコードとアセットに対して、関連する CSP 属性へ nonce 値とハッシュ値を自動的に追加するため、自分で考慮する必要があるのはアプリケーションに固有のものだけになります。
{/* 「自動的に追加する」 この部分、原文は「append A to B」で「A を B に追加する」の意味であるが、実際には「append A to B to C」と書かれており、意味が取りづらい。本稿の訳では語順通りに解釈し、to C を「〜に対して」としてあります。 */}
次の CSP 設定例は、Tauri の [`api`](https://github.com/tauri-apps/tauri/blob/dev/examples/api/src-tauri/tauri.conf.json#L22) 事例から抜粋したものです。
アプリケーション開発者は、この内容を各自のアプリケーションのニーズに合わせて調整する必要があります。
```json title="tauri/examples/api/src-tauri/tauri.conf.json"
"csp": {
"default-src": "'self' customprotocol: asset:",
"connect-src": "ipc: http://ipc.localhost",
"font-src": ["https://fonts.gstatic.com"],
"img-src": "'self' asset: http://asset.localhost blob: data:",
"style-src": "'unsafe-inline' 'self' https://fonts.googleapis.com"
},
```
この CSPコンテンツ・セキュリティ・ポリシーによる保護方式の詳細については、[`script-src`]、[`style-src`]、および [CSP Sources] を参照してください。
[コンテンツ・セキュリティ・ポリシー]: https://developer.mozilla.org/ja/docs/Web/HTTP/CSP
[`script-src`]: https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
[`style-src`]: https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/style-src
[csp sources]: https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/Sources#sources
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,43 @@
---
title: Tauri エコシステム・セキュリティ
sidebar:
order: 8
i18nReady: true
---
Tauri の組織「エコシステム」(活動協調体制)は GitHub 上でホストされており、ソースコードやリリース版を標的とする外敵に対してリポジトリの耐性を高めるためのいくつかの機能を備えています。
リスクを軽減し、一般的に採用されているベスト・プラクティス(最優良事例)に倣うために、以下の方法を導入しています。
### ビルド・パイプライン(ビルド検証の自動化)
ソースコード成果物をリリースするプロセスは、GitHub アクションを使用した GitHub ビルド・パイプラインで高度に自動化されていますが、生身の人間によるキックオフ(作業開始)とレビュー(審査)を義務付けています。
### 署名付きコミット
Tauri のコア・リポジトリでは、「なりすまし(偽装)」リスクを軽減し、セキュリティ侵害の可能性を検出時にその原因と考えられるコミットを識別できるようにするために、署名付きのコミットが必要です。
### コード・レビュー
Tauri のリポジトリにマージされるすべての「プル・リクエストPR」には、そのプロジェクトほとんどの場合、ワーキング・グループですがの少なくとも一人のメンテナーからの承認が必要です。
コードは通常、PR でレビューされ、デフォルトのセキュリティ・ワークフローとチェックが実行されて、コードが共通の標準に準拠しているかどうかが確認されます。
### リリース・プロセス
Tauri のワーキング・グループは、コードの変更内容をレビューし、PR にスコープ(適用範囲)のタグを付け、すべてが最新の状態に保たれていることを確認します。
また、マイナーリリースとメジャーリリースを公開する前に、セキュリティに関連するすべての PR を内部で監査するよう努めています。
新しいバージョンを公開する時期には、メンテナーの一人が新しいリリースに「dev開発版」のタグを付け、以下の手順が実行されます
- コアの検証
- 評価試験の実施
- クレートと npm のセキュリティ監査
- 変更ログの作成
- 成果物(アーティファクト)の生成
- ドラフト版の作成
その後、メンテナーがリリースノートを確認し、必要に応じて編集した後、新しいリリースが完成します。
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,66 @@
---
title: これからの取り組み
sidebar:
order: 10
i18nReady: true
---
このセクションでは、Tauri アプリをさらに安全にするために開始した案件や、今後取り組みたい内容について説明します。
このような案件に興味がある、あるいは何らかの知識をお持ちの場合は、GitHub や Discord などの他のコミュニティ・プラットフォームを通じてご連絡ください。新しい貢献者の方もあたらしいアドバイスもいつでも歓迎致します。
### バイナリ解析
侵入テスト担当者、監査担当者、自動セキュリティ・チェックが適切にその役割を果たすようにするには、コンパイルされたバイナリからでも知見を得ることが非常に重要です。すべての企業がオープン・ソースであるわけではなく、監査、レッド・チーム、その他のセキュリティ・テスト用にソース・コードを提供しているわけでもありません。
> > > 《訳注》
> > > ・侵入テスト担当者 pentester = penetration tester
> > > ・レッド・チーム red teamセキュリティの脆弱性を検証する社内専任チーム
見落とされがちなもう一つの点は、Tauri 固有ののメタデータを提供することで、そのアプリケーションのユーザーの人々が、その生涯と努力を既知の脆弱性解決に捧げることなく、自らのシステムを既知の脆弱性に対してより大きな規模で監査できるようになることです。
> > > 《訳注》 **Tauri 固有のメタデータ** 原文は「inbuilt metadata」。inbuilt は「本来備わった」「固有の」「本質的な」の意味のようですが、「組み込み」「内蔵の」(= built-inの意味も含意しているかもしれません。本稿では「Tauri 固有/特有の」と解釈しています。
あなたの用いている「脅威モデル」が「隠蔽によるセキュリティ」に頼っているのであれば、以下にツールやポイントをいくつか提案しますので、脅威モデルを再検討していただければ幸いです。
> > > 《訳注》 **隠蔽によるセキュリティ** 設計や実装を非公開にする隠蔽ことによってセキュリティを確保する方法。この方法は非公開情報が漏洩した場合の防衛手段が存在しないため、非推奨です。Security Through Obscurity (STO) とも表記。
Rust には [SBOMソフトウェア部品表](https://ja.wikipedia.org/wiki/ソフトウェア・サプライチェーン) を作成するための `cargo-auditable` があり、再現可能なビルドを壊すことなく、バイナリの正確なクレート・バージョンと依存関係の情報を提供します。
フロントエンド・スタックについては、同じ様な方法を知らないので、バイナリからフロントエンド・アセットを抽出するのは単純明快なプロセスであるべきです。
その後、`npm Audit` などのツールを使用できるようになるはずです。
この抽出プロセスに関する [ブログ投稿](https://infosecwriteups.com/reverse-engineering-a-native-desktop-application-tauri-app-5a2d92772da5) はすでにありますが、簡便なツールはありません。
Tauri では、特定の機能を備えた Tauri アプリをコンパイルするときに、そのようなツールを提供したり、アセットの抽出を容易にしたりすることを計画しています。
[Burpsuite](https://portswigger.net/burp)、[Zap](https://www.zaproxy.org/) あるいは [Caido](https://caido.io/) といった「侵入テスト pentesting」ツールを利用するには、Webview からのトラフィックを傍受し、テスト・プロキシを通過させる必要があります。
現時点で、Tauri にはこれを実行するための Tauri 固有のメソッドはありませんが、このプロセスを容易に行なうための作業が進行中です。
このようなツールはどれも、ソース・コードにアクセスすることなく Tauri アプリケーションを適切にテストおよび検査できるため、Tauri アプリケーションをビルドするときに考慮すべきものです。
Tauri は、今後も関連機能の更なるサポートと実装を計画しています。
### WebView の強化
Tauri の現在の「脅威モデル」や Tauri が参照する「領域境界」内では、WebView 自体に更なるセキュリティ制約を追加することはできません。また、WebView はメモリ安全性のない言語で記述されたスタック一時記憶領域の最大の部分であるため、WebView プロセスをさらにサンドボックス化して隔離化する方法を調査・検討する予定です。
> > > 《訳注》 **領域境界** 原文「boundaries」 具体的に「何の」境界は不分明であるが、ここでは Tauri が取り扱える範囲の境界と解釈してあります。 **メモリ・アンセーフ言語** 原文「an memory unsafe language」 メモリ・アクセス時のプログラミングエラー防止機能や制約が欠如しているプログラミング言語。 《参考》 上記に関する基本情報は、Wikioedia の「[メモリ安全性](https://ja.wikipedia.org/wiki/メモリ安全性) の項をご覧ください。
セキュリティ攻撃の影響を軽減し、システム・アクセス用の IPC ブリッジプロセス間接続を強化するために、Tauri 固有および外部のサンドボックス方式を評価する予定です。
スタックのこの部分がリンクの弱点であると考えていますが、現行世代の WebView ではセキュリティの強化とエクスプロイト耐性(セキュリティ脆弱性攻撃への耐性)が向上しています。
### ファジングFuzzing
> > > 《訳注》 **ファジング** ファズ・テスト。コンピュータプログラム検証プロセスのひとつ。無効な、予期しない、ランダムなデータfuzz と呼ばれます)を入力し、意図的に例外状態を発生させてシステムの検証を行なう方法。詳しくは Wikipedia の「[ファジング]https://ja.wikipedia.org/wiki/ファジング)などを参照してください。
Tauri アプリケーションのファジング・プロセスをより効率的かつ簡素化するために、「モック・ランタイム」やその他のツールをさらに実装して、個々の Tauri アプリケーションの設定やビルドを容易にすることを目指しています。
Tauri は多数のオペレーティング・システムと CPU アーキテクチャをサポートしており、通常、アプリにはメモリ安全性のないコードが含まれる可能性はほとんど、あるいはまったく、ありません。
既存のファジング・ツールやライブラリでは、こうした滅多に見られないファジングの「ユース・ケース」に対応していないため、Tauri ファジング・フレームワークを構築するには、これを実装し、[libAFL](https://github.com/AFLplusplus/LibAFL) などの既存のライブラリをサポートする必要があります。
> > > 《訳注》 **ユース・ケース**use case ユーザーがシステムを利用して達成する際の具体的な目標や一連の操作を記述し、システムに必要な機能要件を明確化したもの。詳しくは Wikipedia の「ユースケース」(https://ja.wikipedia.org/wiki/ユースケース) などを参照してください。
目標は、ファジングを Tauri アプリケーション開発者のためにアクセスしやすく、効率的にすることです。
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,320 @@
---
title: HTTP ヘッダー
author: 39zde <git@39zde>
sidebar:
order: 7
badge:
text: New
variant: tip
i18nReady: true
---
import SinceVersion from '@components/SinceVersion.astro';
<SinceVersion version="2.1.0" />
「設定」内で定義されたヘッダーは、Webview への応答とともに送信されます。
これには「IPCプロセス間通信」メッセージと「エラー応答」は含まれません。
より具体的に言えば、
<a
href="https://github.com/tauri-apps/tauri/blob/8e8312bb8201ccc609e4bbc1a990bdc314daa00f/crates/tauri/src/protocol/tauri.rs#L103"
target="\_blank"
>
{' '}
crates/tauri/src/protocol/tauri.rs ↗
</a>
の `get_response`
関数を介して送信されるすべての応答に、このヘッダーが含まれます。
### ヘッダー名
「ヘッダー名」は以下に限定されています:
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials"
target="_blank"
>
Access-Control-Allow-Credentials ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Headers"
target="_blank"
>
Access-Control-Allow-Headers ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Methods"
target="_blank"
>
Access-Control-Allow-Methods ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Expose-Headers"
target="_blank"
>
Access-Control-Expose-Headers ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Max-Age"
target="_blank"
>
Access-Control-Max-Age ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy"
target="_blank"
>
Cross-Origin-Embedder-Policy ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy"
target="_blank"
>
Cross-Origin-Opener-Policy ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cross-Origin-Resource-Policy"
target="_blank"
>
Cross-Origin-Resource-Policy ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Permissions-Policy"
target="_blank"
>
Permissions-Policy ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Timing-Allow-Origin"
target="_blank"
>
Timing-Allow-Origin ↗
</a>
- <a
href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Content-Type-Options"
target="_blank"
>
X-Content-Type-Options ↗
</a>
- Tauri-Custom-Header
:::note[(注記)]
`Tauri-Custom-Header` は、本番環境での使用を目的としたものではありません。
:::
:::note[(注記)]
<a href="../ja/csp/">コンテンツ・セキュリティー・ポリシーCSP</a>
は、ここでは定義されていません。
:::
### ヘッダーの設定方法
- 文字列で
- 文字列の配列で
- オブジェクト/キー値で(値は文字列である必要があります)
- null 値で
実際の応答では、ヘッダー値は常に​​文字列に変換されます。設定ファイルの内容によっては、ヘッダー値のいくつかを作成する必要があります。
この複合値がどのように作成されるかに関するルールは次のとおりです:
- `string`: 「文字列」の場合は、作成されたヘッダー値でも同一内容です。
- `Array`: 「配列」の場合は、作成されたヘッダー値では、各項(要素)が `, ` で連結されます。
- `key-value`: 「キー値」では、各項目が「キー+スペース+値」から作成され、その後、作成されたヘッダー値では各項が `; ` で連結されます。
- `null` 「null 値」の場合、ヘッダーは無視されます。
### 設定例
```javascript title="src-tauri/tauri.conf.json"
{
//...
"app":{
//...
"security": {
//...
"headers": {
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "require-corp",
"Timing-Allow-Origin": [
"https://developer.mozilla.org",
"https://example.com",
],
"X-Content-Type-Options": null, // gets ignored
"Access-Control-Expose-Headers": "Tauri-Custom-Header",
"Tauri-Custom-Header": {
"key1": "'value1' 'value2'",
"key2": "'value3'"
}
},
// CSP がヘッダー項目内定義されていないことに注意してください。
"csp": "default-src 'self'; connect-src ipc: http://ipc.localhost",
}
}
}
```
:::note[(注記)]
`Tauri-Custom-Header` は、本番環境での使用を目的としたものではありません。
テストでは、`Access-Control-Expose-Headers` を適切に設定することを忘れないでください。
:::
この事例では、`Cross-Origin-Opener-Policy` と `Cross-Origin-Embedder-Policy` が、<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer" target="_blank">`SharedArrayBuffer ↗`</a> の使用を許可するように設定されています。
`Timing-Allow-Origin` は、リストに記載された Web サイトから読み込まれたスクリプトが、<a href="https://developer.mozilla.org/ja/docs/Web/API/Performance_API/Resource_timing" target="_blank">Resource Timing APIリソースタイミング ↗</a> を介して詳細なネットワーク・タイミング・データにアクセスすることを許可します。
「helloworld」の例では、設定は次のようになります
```http
access-control-allow-origin: http://tauri.localhost
access-control-expose-headers: Tauri-Custom-Header
content-security-policy: default-src 'self'; connect-src ipc: http://ipc.localhost; script-src 'self' 'sha256-Wjjrs6qinmnr+tOry8x8PPwI77eGpUFR3EEGZktjJNs='
content-type: text/html
cross-origin-embedder-policy: require-corp
cross-origin-opener-policy: same-origin
tauri-custom-header: key1 'value1' 'value2'; key2 'value3'
timing-allow-origin: https://developer.mozilla.org, https://example.com
```
### フレームワーク
一部の開発環境では、運用環境をエミュレートするための追加設定が必要です。
#### JavaScript/TypeScript
ビルド・ツール「**Vite**(ヴィート)」(**Qwik、React、Solid、Svelte、Vue** も含む)を実行するセットアップ・ツールには、必要なヘッダーを `vite.config.ts` に追加します。
```typescript title=vite.config.ts
import { defineConfig } from 'vite';
export default defineConfig({
// ...
server: {
// ...
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp',
'Timing-Allow-Origin':
'https://developer.mozilla.org, https://example.com',
'Access-Control-Expose-Headers': 'Tauri-Custom-Header',
'Tauri-Custom-Header': "key1 'value1' 'value2'; key2 'value3'",
},
},
});
```
場合によっては、`vite.config.ts` がフレームワーク設定ファイルに統合されているときがありますが、セットアップの内容は同じです。
フロントエンド・フレームワークが **Angular** の場合は、必要なヘッダーを `angular.json` に追加します。
```json title=angular.json
{
//...
"projects": {
//...
"insert-project-name": {
//...
"architect": {
//...
"serve": {
//...
"options": {
//...
"headers": {
"Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "require-corp",
"Timing-Allow-Origin": "https://developer.mozilla.org, https://example.com",
"Access-Control-Expose-Headers": "Tauri-Custom-Header",
"Tauri-Custom-Header": "key1 'value1' 'value2'; key2 'value3'"
}
}
}
}
}
}
}
```
同様に、**Nuxt** の場合は `nuxt.config.ts` に追記します。
```typescript title=nuxt.config.ts
export default defineNuxtConfig({
//...
vite: {
//...
server: {
//...
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp',
'Timing-Allow-Origin':
'https://developer.mozilla.org, https://example.com',
'Access-Control-Expose-Headers': 'Tauri-Custom-Header',
'Tauri-Custom-Header': "key1 'value1' 'value2'; key2 'value3'",
},
},
},
});
```
**Next.js** は Vite を利用しないため、アプローチが異なります。
詳しくは <a href="https://nextjs.org/docs/pages/api-reference/next-config-js/headers" target="_blank">こちら ↗</a> (英語版)をご覧ください。
ヘッダーは `next.config.js` で定義します。
```javascript title=next.config.js
module.exports = {
//...
async headers() {
return [
{
source: '/*',
headers: [
{
key: 'Cross-Origin-Opener-Policy',
value: 'same-origin',
},
{
key: 'Cross-Origin-Embedder-Policy',
value: 'require-corp',
},
{
key: 'Timing-Allow-Origin',
value: 'https://developer.mozilla.org, https://example.com',
},
{
key: 'Access-Control-Expose-Headers',
value: 'Tauri-Custom-Header',
},
{
key: 'Tauri-Custom-Header',
value: "key1 'value1' 'value2'; key2 'value3'",
},
],
},
];
},
};
```
#### Rust
**Yew** と **Leptos** では、ヘッダーを `Trunk.toml` に追記してください:
```toml title=Trunk.toml
#...
[serve]
#...
headers = {
"Cross-Origin-Opener-Policy" = "same-origin",
"Cross-Origin-Embedder-Policy" = "require-corp",
"Timing-Allow-Origin" = "https://developer.mozilla.org, https://example.com",
"Access-Control-Expose-Headers" = "Tauri-Custom-Header",
"Tauri-Custom-Header" = "key1 'value1' 'value2'; key2 'value3'"
}
```
<div style="text-align: right;">
【※ この日本語版は、「Mar 12, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,123 @@
---
title: セキュリティ
sidebar:
order: 1
label: Overview
i18nReady: true
---
import { CardGrid, LinkCard } from '@astrojs/starlight/components';
このセクションでは、Tauri の設計とエコシステムの中核をなす高レベルの概念とセキュリティ機能を説明することを目的としています。この概念とセキュリティ機能は、開発者であるあなた自身、作成するアプリケーション、およびそのユーザーのセキュリティをデフォルトで強化いたします。
また、「ベスト・プラクティス」最良の実践モデルに関するアドバイス、脆弱性をTauri チームに報告する方法、および詳細な概念説明への参考情報も言及されています。
:::note
Tauri アプリケーションのセキュリティは、Tauri 自体の全体的なセキュリティ、Rust および npm のすべての依存関係、あなた自身のコード、および最終的なアプリケーションを実行するデバイス、これらすべてのセキュリティの総和であることを覚えておくことが重要です。
Tauri チームはチームとしての役割に最善を尽くし、セキュリティ・コミュニティもその役割を果たしますので、あなた自身もいくつかある重要な「ベスト・プラクティス」のやり方に倣ってみてください。
:::
## 信頼境界線 Trust Boundaries
> 「信頼境界線/トラスト・バウンダリ」とは、コンピューター・サイエンスとセキュリティの分野で使われる用語で、プログラム・データまたは実行プログラムの「信頼」レベルが切り替わる境界線、あるいは、異なるセキュリティ・レベル<sup>※</sup> を持つ二つの動作主体(「セキュリティ・プリンシパル」)がデータやコマンドをやり取りする際の信頼レベル限界線、のことです。
> [^wikipedia-trust-boundary](英語版)
[^wikipedia-trust-boundary]: [https://en.wikipedia.org/wiki/Trust_boundary](https://en.wikipedia.org/wiki/Trust_boundary).
> > > 《訳注》 **セキュリティ・レベル** 原文 different **capabilities**(異なる**機能**の訳。具体的な意味内容が不明のため、Wikipedia 中国語版での表記「**信頼レベル**の異なる2つのシステムが・・・」Google翻訳によるとあるのに基づき「セキュリティ・レベル」と訳してあります。[セキュリティ・レベル](/ja/security/capabilities/) を参照。
Tauri のセキュリティ・モデルは、アプリケーションのコア用に記述された「Rust コード」部と、システム WebView が理解できる任意のフレームワークまたは言語で記述された「フロントエンド・コード」部に分かれています。
境界間でやり取りされるすべてのデータを検査し厳密に定義することは、「信頼境界の侵害」violationを防ぐために非常に重要です。もしデータが「アクセス制御なし」で境界線間を渡されると、攻撃者にとっては権限を昇格させて悪用することが簡単になります。
[IPC レイヤー](/ja/concept/inter-process-communication/) (プロセス間通信)は、この二つの信頼グループ間の通信のブリッジ(橋渡し)となり、境界が破られないようにしています。
![IPC Diagram](@assets/security/tauri-trust-boundaries.svg)
> > > 《訳注》 図中の用語
> > > **System WebView** システム・ウェッブビュー
> > > ・ Application Frontend アプリケーション・フロントエンド
> > > ・ Remote Sources & Assets リモート・ソースおよびアセット
> > > **IPC** プロセス間通信
> > > **Application Core** アプリケーション・コア
> > > ・ Tarui Core タウリ・コア部
> > > ・ Backend バックエンド
> > > ・ Plugins プラグイン
> > > ・ Local System ローカル・システム
プラグインまたはアプリケーション・コアによって実行されるコードは、利用可能なすべてのシステム・リソースに完全にアクセスでき、制約はありません。
WebView で実行されるコードは、公開されたシステム・リソースのみに、明確に定義された IPC レイヤーを介してアクセスできます。
コア・アプリケーション・コマンドへのアクセスは、アプリケーション設定で定義されたセキュリティ・レベルによって設定および制限されます。
個々のコマンド実装は、これもまた「セキュリティ・レベル設定」でも定義されている任意設定のきめ細かいアクセス・レベルを適用します。
それぞれのコンポーネントと境界適用の詳細については、以下を参照してください:
<CardGrid>
<LinkCard title="アクセス権" href="/ja/security/permissions/" />
<LinkCard title="スコープ" href="/ja/security/scope/" />
<LinkCard title="セキュリティ・レベル" href="/ja/security/capabilities/" />
<LinkCard title="ランタイム統制" href="/ja/security/runtime-authority/" />
</CardGrid>
Tauri では、開発者が独自のフロントエンド・スタックとフレームワークを選択できます。
このことは、Tauri が選択された個々のフロントエンド・スタックに対するセキュリティ強化ガイドを提供できていないということではなく、Tauri は攻撃対象領域を制御し封じ込めるための包括的な機能を提供しているということを意味しています。
<CardGrid>
<LinkCard
title="コンテンツ・セキュリティ・ ポリシーCSP"
href="/ja/security/csp/"
/>
<LinkCard
title="アイソレーション型"
href="/ja/concept/inter-process-communication/isolation/"
/>
</CardGrid>
## WebViews のバンドル”なし”
Tauri のアプローチは、オペレーティング・システム付属の WebView に依存し、WebView をアプリケーション・バイナリにバンドルしないことです。
これにはさまざまな理由がありますが、セキュリティの観点から最も重要な理由は、WebView のセキュリティ・パッチが公開されてからアプリケーションのエンドユーザーに展開されるまでに要する平均時間です。
![IPC Diagram](@assets/security/tauri-update-lag.svg)
> > > 《訳注》 図: WebView バンドル有無によるセキュリティ更新時間の差
観察したところでは、WebView パケットのメンテナーとオペレーティング・システム・パケットのメンテナーは、WebView をアプリケーションに直接バンドルするアプリケーション開発者よりも、セキュリティ・パッチを適用して Webview リリースを展開する速度が、平均して遥かに速いことがわかっています。
この観察には例外があり、理論的にはどちらの方法でも同様の時間枠内で実行できますが、それには各アプリケーションに対して付随的コストがより大きいインフラストラクチャの関与が必要になります。
Tauri アプリケーション開発者の経験上、バンドルには悪い面があります。それが本質的に安全でないとは考えているわけではありませんが、現在の設計仕様は、現実の既知の脆弱性を大幅に減らすためのトレードオフ(妥協点)なのです。
## エコシステム
Tauri の組織は、ただ単に Tauri リポジトリだけを提供・維持管理しているだけではなく、合理的で安全なマルチプラットフォームのアプリケーション・フレームワークを確実に提供するために、さらに先を行く努力しています。
開発プロセスのセキュリティ確保方法、適応および実装できる内容、アプリケーションが直面する可能性のある既知の脅威、今後の改善や強化の計画などについて詳しく知りたい場合は、以下のドキュメントをご覧ください:
<CardGrid>
<LinkCard title="エコシステム・セキュリティ" href="/ja/security/ecosystem/" />
<LinkCard
title="アプリケーション・ ライフサイクルでの脅威"
href="/ja/security/lifecycle/"
/>
<LinkCard title="これからの取り組み" href="/ja/security/future/" />
</CardGrid>
## 協調的な情報開示
Tauri またはその他のリポジトリにセキュリティ上の懸念や問題があると思われる場合には、**発見した事項について公にはコメントしない** でください。代わりに、直接、Tauri のセキュリティ・チームにご連絡ください。
推奨される報告方法は、影響を受けるリポジトリの [Github Vulnerability Disclosure](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability) Github 脆弱性報告)経由です。
Tauli のほとんどのリポジトリではこの連絡機能が有効になっていますが、よく判らない場合には [Tauri リポジトリ](https://github.com/tauri-apps/tauri/security/advisories/new) から送信してください。
あるいは、[security@tauri.app](mailto:security@tauri.app) まで電子メールでご連絡いただくこともできます。
現在、セキュリティ報奨金の予算はありませんが、場合によっては、限られたリソース内で協調的な情報開示に報奨を与えることも検討します。
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,158 @@
---
title: アプリケーション・ライフサイクルでの脅威
sidebar:
order: 9
i18nReady: true
---
Tauri アプリケーションは、アプリケーション・ライフサイクル(製品寿命)の様々な時点で作られた数多くの部分から構成されています。
ここでは、従来からある脅威と、それに対して**どのように対処すべきか**について説明します。
その個々の処理手順をすべて、以下の各セクション毎に説明します。
![Threat Stages During Development](@assets/concept/application-flow-simple.svg)
> > > Upstream [上流工程での脅威](#上流工程での脅威)
> > > Development [開発時の脅威](#開発時の脅威)
> > > Building [ビルド時の脅威](#ビルド時の脅威)
> > > Distribution [配布時の脅威](#配布時の脅威)
> > > Runtime [実行時の脅威](#実行時の脅威)
:::note[(注記)]
アプリケーション・ライフサイクルでの最も弱いリンク箇所が、基本的にはセキュリティ内容を決定する場所になります。
各段階での処理が、その後に続くすべての段階の前提と整合性を損ねる可能性がありますので、常に全体像を把握することが重要です。
:::
## 上流工程での脅威
Tauri はあなたのプロジェクトの直接的な拠り所であり、コミット、レビュー、プル・リクエスト、リリースの厳格な作成者の管理を行なっており、
依存関係を最新の状態に保ち、更新またはフォーク・修正を行なうための措置を講じることに最善を尽くしています。Tauri 以外で作成するプロジェクトではそれほど適切に管理されず、監査も一度も行なわれていないかもしれません。
{/* 原文は a direct dependency on 「直接依存」となっているが、文意不明のため「拠り所」と意訳 */}
他からのプロジェクトを統合する際には、その健全性を考慮してください。さもないと、知らないうちにアーキテクチャ由来の「負債」を抱えてしまう可能性があります。
### 自分のアプリケーションを最新の状態に保つ
アプリを「在野に」リリースする場合、Tauri が含まれたバンドルも出荷することになります。
Tauri に影響する脆弱性があれば、アプリケーションのセキュリティにも影響を及ぼす可能性があります。
Tauri を最新バージョンに更新することで、すでに重大な脆弱性にパッチが当てられ、アプリケーションで悪用されないようになるのです。
また、コンパイラ(`rustc`)とトランスパイラ(`nodejs`)も最新の状態に保ってください。というのも、セキュリティ上の問題が解決されていることがよくあるからです。
これは開発システム全般にも言えることです。
### 依存関係の評価
NPMNode Package Managerと Crates.io は多くの便利なパッケージを提供していますが、
信頼できるサードパーティのライブラリを選択するのはあなたの責任です。あるいは Rust で全部書き直してください。
既知の脆弱性の影響を受けていたり、メンテナンスされていない古いライブラリを使用すると、アプリケーションのセキュリティと心地よい一夜の眠りが危険に曝されることになるかもしれません。
このプロセスを自動化するために [`npm Audit`](https://docs.npmjs.com/cli/v10/commands/npm-audit) や [`cargo Audit`](https://crates.io/crates/cargo-audit) などのツールを利用し、セキュリティ・コミュニティの重要な取り組みに頼りましょう。
[`cargo-vet`](https://github.com/mozilla/cargo-vet) や [`cargo crev`](https://github.com/crev-dev/cargo-crev) のような Rust エコシステムの最近の傾向は、サプライチェーン攻撃の可能性をさらに低減するのに役立つでしょう。
自分が誰の肩の上に立っているか、すなわち、どの先人の知識を利用させて貰っているのか、を知るには、[`cargo supply chain`](https://github.com/rust-secure-code/cargo-supply-chain) ツールを使用してください。
私たちが強く推奨推奨している方法は、最善策として「リビジョンのハッシュ値hash revisions」を、次善の策としては「名前付きタグnamed tags」を使用して、git からの重要な依存関係のみを使用することです。
これは Rust だけでなく Node のエコシステムにも当てはまります。
## 開発時の脅威
開発者であるあなたは、開発環境に気を配っていることと思います。
使用しているオペレーティング・システム、ビルド・ツールチェーン、および関連する依存関係が最新の状態に保たれ、適切に保護されているかを確認するのはユーザーであるあなたの責任です。
私たち全員が直面している真のリスクは、「サプライチェーン攻撃」と呼ばれるもので、それは通常、あなたのプロジェクトの直接的な依存関係に対する攻撃であると考えられます。
しかしながら、開発マシンを直接標的とする攻撃が巷では増加しており、この問題に正面から取り組んで備えておきましょう。
### 開発サーバー
Tauri アプリケーションのフロントエンドは、さまざまな Web フレームワークを使用して開発できます。
これらのフレームワークはどれも、通常、独自の開発サーバーを提供しており、フロントエンド・アセットはオープン・ポート経由でローカル・システムやネットワークに公開されています。
これにより、フロントエンドを Webview またはブラウザ内で「ホットリロード」(アプリ実行中のコード変更適用)してデバッグできるようになります。
実際には、この接続はデフォルトでは大抵、暗号化も認証もされていません。
このことは組み込みの Tauri 開発サーバーにも当て嵌まり、あなたのフロントエンドとアセットがローカル・ネットワークに公開されます。さらに、これにより攻撃者は、攻撃者と同じネットワーク内の開発デバイスに攻撃者自身のフロントエンド・コードをプッシュできます。
どのような機能・内容が公開されているのかによりますが、最悪の場合、デバイスのセキュリティ侵害につながる可能性があります。
あなたの開発デバイスを安全に公開できる信頼できるネットワークでのみ開発を行なう必要があります。
それが不可能な場合は、開発サーバーがあなたの開発デバイスとの接続に、**相互**認証と暗号化mTLS など)を使用していることを**絶対に**確認してください。
> > > 《訳注》mTLS = mutual Transport Layer Security 相互TLS認証。
:::note[(注記)]
組み込みの Tauri 開発サーバーは、現時点では「相互認証」と「トランスポート暗号化」に対応していないため、信頼できないネットワークでは使用しないでください。
:::
### 開発マシンの強化
自分の開発システムを強化することについては、さまざまな要因と個人々々の脅威モデルによって異なりますが、一般的なアドバイスとして、以下のようなことをお勧めします:
- コーディングなどの日常的なタスクに管理者アカウントを使用しない
- 開発マシンで本番環境の秘密情報を使用しない
- 秘密情報をソースコードのバージョン管理で検証しない
- セキュリティ・ハードウェア・トークンなどを使用して、セキュリティ侵害のあるシステムの影響を軽減する
- 自分のシステムを最新の状態に保つ
- インストールするアプリケーションを最小限に抑える
より実用的な方法についての様々な情報は、[優れたセキュリティ強化コレクション](https://github.com/decalage2/awesome-security-hardening) (英語サイト)でご覧いただけます。
もちろん、自分の開発環境を仮想化して攻撃者を喰い止めることもできますが、それでは、開発マシンだけを標的にしたものではなく、あなたのプロジェクトそのものを標的とする攻撃には対処できません。
### ソース管理認証と承認の確実な実施
大多数の開発者と作業している場合と同様に、ソースコードのバージョン管理ツールとサービス・プロバイダーを利用することは、開発中の不可欠な手順です。
あなたのソースコードが権限のない者によって変更されないようにするためには、ソースコード・バージョン管理システムのアクセス制御を理解し、正しく設定することが重要です。
また、悪意のあるコミットが、セキュリティ侵害を受けていない、あるいは悪意を持たない貢献者によるものと誤認される状況を防ぐために、すべての(いつもの)貢献者に対して、コミットへの署名を要求することを検討してください。
## ビルド時の脅威
現代のシステム開発では、バイナリ成果物を作成するために「CI/CD」継続的インテグレーション継続的デリバリーと呼ばれるアプリケーション開発自動化プロセスを使用しています。
こうしたリモート・システム(およびサードパーティ所有のシステム)では、ソースコードやシークレットにアクセス可能で、生成されたバイナリがあなた自身のローカル・コードと同じであるかをあなたが検証可能な形で証明できない形でビルドを変更できてしまいますので、これらのシステムを完全に信頼できる必要があります。
つまり、信頼のおけるプロバイダーを頼りにするか、自らの管理されたハードウェアでこうしたシステムをホストする必要があります。
Tauri では、複数のプラットフォームでアプリを構築するための GitHub ワークフローを提供しています。
もし自分自身で CI/CD を構築し、サードパーティのツールに依存している場合は、あなたがバージョンを明示的に固定していないアクションには注意してください。
あなたは、配布先のプラットフォームに合わせて、作成したアプリのバイナリに署名する必要があります。
このやりかたはセットアップが複雑で、多少コストがかかる可能性がありますが、エンド・ユーザーはあなたのアプリが正式にあなたから発行されたものであるという証を求めています。
暗号化の秘密がハードウェア・トークンに適切に保存されている場合、セキュリティ侵害されたビルド・システムでは関連する署名キーを漏洩することはできませんが、悪意のあるリリースの署名に使用することはできます。
### 再現可能なビルド
ビルド時の「バックドア・インジェクション」(バックドア型攻撃)に対抗するには、ビルドを再現可能にする必要があります。そうすることで、自分の PC でビルドしたときでも、別の独立したプロバイダーでビルドしたときでも、ビルド・アセットがまったく同じであることを検証できます。
第一の問題は、Rust が完全に**信頼性のある**再現可能なビルドをデフォルトで生成していないことです。理論上はこれをサポートしていますが、まだバグがあり、最近のリリースでは中止になりました。
現在の状況は、Rust プロジェクトの [公開バグ・トラッカー](https://github.com/rust-lang/rust/labels/A-reproducibility) で追跡できます。
次に遭遇する問題は、多くの一般的なフロントエンド・バンドラーも再現可能な出力を生成しないことで、そのため、バンドルされたアセットが再現可能なビルドを破損する可能性があることです。
つまり、デフォルトでの再現可能なビルドに完全に頼ることはできず、残念ながら自分のビルド・システムに全幅の信頼を置くしかありません。
## 配布時の脅威
私たちは、アプリへのホット・アップデート(再起動不要の更新)をできる限り簡単かつ安全に配信できるように最善を尽くしました。
ただし、マニフェスト・サーバー、ビルド・サーバー、あるいはバイナリ・ホスティング・サービスの管理ができないと、すべてが台無しになります。
自分でシステムを構築する場合は、専門の OPS アーキテクトに相談して適切に構築してください。
> > > 《訳注》 OPS = Official Production Systemプロダクションシステム記述言語
もし、Tauri アプリの信頼できる配信サービスをお探しの場合、Tauri のパートナーである CrabNebula がクラウド・サービスを提供しています: [https://crabnebula.dev/cloud](https://crabnebula.dev/cloud)
## 実行時の脅威
私たちは Webview が安全ではないと考えており、信頼できないユーザーランド・コンテンツを読み込むという観点から、Webview からシステム API へのアクセスに関していくつかの保護を Tauri に実装することにしました。
> > > 《訳注》 **ユーザーランド** オペレーティング・システムの中核(カーネル)以外の部分。一般ユーザーの権限で操作できる領域。
[コンテンツ・セキュリティ・ポリシー](/ja/security/csp/)を使用すると、Webview が実行できる通信タイプを封鎖します。
さらに、[セキュリティ・レベル](/ja/security/capabilities/) 設定により、信頼できないコンテンツやスクリプトが Webview 内の API にアクセスするのを防ぐことができます。
また、[Tauri への情報提供](/ja/security/#協調的な情報開示)と同様の、脆弱性を報告するための簡単で安全な方法を設定することもお勧めします。
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,167 @@
---
title: アクセス権 permissions
sidebar:
order: 2
i18nReady: true
---
「アクセス権」Permissionsとは、明示化されたコマンド特権の内容説明です。
```toml
[[permission]]
identifier = "my-identifier"
description = "This describes the impact and more."
commands.allow = [
"read_file"
]
[[scope.allow]]
my-scope = "$HOME/*"
[[scope.deny]]
my-scope = "$HOME/secret"
```
これにより、Tauri アプリケーションのフロントエンドでコマンドにアクセスできるようになります。
また、「適用範囲」(スコープ)をコマンドに割り当て、どのコマンドが有効化されるのかを指定できます。
「アクセス権」では、特定のコマンドを有効化または無効化したり、「適用範囲」を定義したり、あるいはその両方を組み合わせたりすることができます。
「アクセス権」は、新しい「識別子」の下に一組のセットとしてグループ化できます。
これは「アクセス権セット」と呼ばれ、これにより、「適用範囲」関連のアクセス権を「コマンド」関連のアクセス権と組み合わせることができます。また、「操作」固有のアクセス権をより使いやすいセットにグループ化またはバンドルすることもできます
プラグイン開発者であれば、公開されているすべてのコマンドに対して、複数の定義済みで適切な名前を付与したアクセス権を配布できます。
アプリケーション開発者の場合は、既存のプラグイン・アクセス権を拡張したり、個人設定のコマンド用に定義したりできます。これらは、後で再利用したり、メインの設定ファイルを簡素化したりするために、ひとつのセットとしてグループ化または拡張できます。
## アクセス権識別子
「アクセス権識別子」は、アクセス権を再利用して一意の名前を持つことを保証するために使用されます。
:::tip
「**名前**」を用いて、`tauri-plugin-`というプレフィックス(接頭辞)を付けることなくプラグイン・クレート名を参照します。これは、「名前」が競合する可能性を減らすための「名前空間」として意図されています。アプリケーション自体のアクセス権を参照する場合は、必要ありません。
:::
- `<name>:default` : これは、アクセス権がプラグインまたはアプリケーションのデフォルトであることを示しています。
- `<name>:<command-name>` これは、アクセス権が個々のコマンド用であることを示しています。
プラグインのプレフィックス `tauri-plugin-` は、コンパイル時にプラグインの識別子の先頭に自動的に追加されるため、手動で指定する必要はありません。
識別子は ASCII 文字のアルファベット小文字 `[a-z]` に制限されており、識別子の最大長(文字数)は下記の定数により現在 `116` に制限されています。
```rust
const IDENTIFIER_SEPARATOR: u8 = b':';
const PLUGIN_PREFIX: &str = "tauri-plugin-";
// https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field
const MAX_LEN_PREFIX: usize = 64 - PLUGIN_PREFIX.len();
const MAX_LEN_BASE: usize = 64;
const MAX_LEN_IDENTIFIER: usize = MAX_LEN_PREFIX + 1 + MAX_LEN_BASE;
```
## 設定ファイル
Tauri **プラグイン** ディレクトリ構造の簡略化された例:
```sh
tauri-plugin
├── README.md
├── src
│ └── lib.rs
├── build.rs
├── Cargo.toml
├── permissions
│ └── <identifier>.json/toml
│ └── default.json/toml
```
デフォルトのアクセス権は、特別な方法で処理されています。というのも、Tauri CLI を使用して Tauri アプリケーションにプラグインを追加する限り、アプリケーション設定に自動的に追加されますので。
**アプリケーション** 開発者の場合も構造は同様です:
```sh
tauri-app
├── index.html
├── package.json
├── src
├── src-tauri
│ ├── Cargo.toml
│ ├── permissions
│ └── <identifier>.toml
| ├── capabilities
│ └── <identifier>.json/.toml
│ ├── src
│ ├── tauri.conf.json
```
:::note[(注記)]
アプリケーション開発者である場合、設定ファイルは `json` / `json5` または `toml` で記述できますが、「アクセス権」は `toml` 内でのみ定義可能です。
:::
## 実施例
`File System` プラグインからの「アクセス権」設定例:
```toml title="plugins/fs/permissions/autogenerated/base-directories/home.toml"
[[permission]]
identifier = "scope-home"
description = """This scope permits access to all files and
list content of top level directories in the `$HOME`folder."""
[[scope.allow]]
path = "$HOME/*"
```
> > > 《訳注》 上記 description の内容: この適用範囲は、`$HOME` フォルダー内のすべてのファイルとリスト内容へのアクセスを許可します。
```toml title="plugins/fs/permissions/read-files.toml"
[[permission]]
identifier = "read-files"
description = """This enables all file read related
commands without any pre-configured accessible paths."""
commands.allow = [
"read_file",
"read",
"open",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next"
]
```
> > > 《訳注》 上記 description の内容: これにより、事前に設定されたアクセス可能なパスなしで、すべてのファイル読み取り関連コマンドが有効になります。
```toml title="plugins/fs/permissions/autogenerated/commands/mkdir.toml"
[[permission]]
identifier = "allow-mkdir"
description = "This enables the mkdir command."
commands.allow = [
"mkdir"
]
```
> > > 《訳注》 上記 description の内容 これにより、「mkdir」コマンドが有効になります。
アプリで上記のプラグインアクセス権を拡張する実装例:
```toml title="my-app/src-tauri/permissions/home-read-extends.toml"
[[set]]
identifier = "allow-home-read-extended"
description = """ This allows non-recursive read access to files and to create directories
in the `$HOME` folder.
"""
permissions = [
"fs:read-files",
"fs:scope-home",
"fs:allow-mkdir"
]
```
> > > 《訳注》 上記 description の内容: これにより、ファイルへの非再帰的な読み取りアクセスが可能になり、`$HOME` フォルダー内にディレクトリを作成できるようになります。
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,36 @@
---
title: ランタイム統制 Runtime Authority
i18nReady: true
---
「ランタイム統制」権限は Tauri Core の一部です。
どのウィンドウがどのコマンドにアクセスできるのかを制御するために、実行時にすべての「アクセス権」、「セキュリティ・レベル設定」、「スコープ」(適用範囲)情報を確保し、コマンドにスコープ情報を渡します。
> > > 《訳注》 **ランタイム統制** 原文は Runtime Authority。実行時ランタイムでの処理に対する「支配権Authrity権限」のことと解釈されますが、「権限」と訳した場合、permissions/capabilities などの同様の用語と訳語上区別が付きにくいため、本稿では「統制(権)」と表記しています。
> > > 同様に、permissions許可する権限は「アクセス権」、capabilities実行する能力・機能は「セキュリティ・レベル設定」と文脈に応じて訳し分けてあります。
Webview から Tauri コマンドが呼び出されるたびに、「ランタイム統制」権限は、〈1〉「呼び出し要求」を受け取り、〈2〉要求されたコマンドを呼び出し元(オリジン)が実際に使用できるかを確認し、〈3〉オリジンがセキュリティ・レベル設定の対象内であるかどうかやスコープがそのコマンドに対して定義されており適用可能であるかどうかをチェックし、〈4〉そうした後で「呼び出し要求」に必要情報が挿入されると、〈5〉ようやく、「呼び出し要求」は適切な Tauri コマンドに渡されます。
オリジンにコマンドの呼び出しが許可されていない場合、「ランタイム統制」権限によって「呼び出し要求」が拒否され、Tauri コマンドは決して呼び出されません。
![IPC Diagram](@assets/concept/runtime-authority.svg)
> > > 《訳注》 図表内の用語
> > > Main Window 主ウィンドウ
> > > ・ invoke (message) 呼び出し(メッセージ)
> > > Command コマンド
> > > ・ invoke (message+scopes) 呼び出し(メッセージ+スコープ)
> > > **Runtime Authority** ランタイム統制
> > > ・ IPC Handler プロセス間通信ハンドラー
> > > ・ calling window and capability 呼び出しウィンドウとセキュリティ・レベルの確認
> > > **capability1** セキュリティ・レベル設定1
> > > ・ Commands コマンド類
> > > ・ Scopes スコープ設定fs::writeFile の適用範囲)
> > > ・ Scopes スコープ設定shell::execute の適用範囲)
> > > ・ Windows 各種ウィンドウ
> > > ・ Main Windows 主ウィンドウ
> > > ・ Splashscreen スプラッシュスクリーン起動時表示画面
<div style="text-align: right;">
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
</div>

View File

@@ -0,0 +1,132 @@
---
title: コマンド・スコープ Command Scopes
sidebar:
order: 3
i18nReady: true
---
「スコープ」適用範囲とは、Tauri コマンドに許可される動作(または許可されない動作)を細かく定義する方法です。
「スコープ」は「許可 `allow` スコープ」と「拒否 `deny` スコープ」に分類され、「拒否スコープ」は常に「許可スコープ」よりも優先されます。
この「スコープの型」は、[`serde`](https://docs.rs/serde/latest/serde/) のシリアル化可能な型(タイプ)のいずれかである必要があります。
これらのタイプは通例、プラグイン固有です。Tauri アプリケーションに実装されたスコープ付きコマンドの場合、スコープの型はアプリケーションで定義してコマンド実装で適用する必要があります。
たとえば、[`Fs`](https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/fs) プラグインでは、スコープを使用して特定のディレクトリとファイルを「許可」または「拒否」することができ、[`http`](https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/http) プラグインでは、スコープを使用してアクセスが「許可」される URL をフィルタリングすることができます。
「スコープ」はコマンドに渡され、取り扱いや適切な執行についてはコマンド自身が実装します。
:::caution
コマンド開発者は、スコープの回避が不可能であることを確実しておく必要があります。スコープ検証の実装では、その正確性を担保するために監査する必要があります。
:::
## 実施例
以下の事例は、[`Fs`](https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/fs) プラグインの「アクセス権」に基づくものです:
すべてのコマンドに対するこのプラグインの「スコープの型」は文字列で、これには [`glob`](https://docs.rs/glob/latest/glob/) 互換のパスが含まれます。
```toml title="plugins/fs/permissions/autogenerated/base-directories/applocaldata.toml"
[[permission]]
identifier = "scope-applocaldata-recursive"
description = '''
This scope recursive access to the complete `$APPLOCALDATA` folder,
including sub directories and files.
'''
[[permission.scope.allow]]
path = "$APPLOCALDATA/**"
```
> > > 《訳注》 上記 description の内容: このスコープは、サブディレクトリとファイルを含む完全な `$APPLOCALDATA` フォルダへの再帰アクセスです。
```toml title="plugins/fs/permissions/deny-webview-data.toml"
[[permission]]
identifier = "deny-webview-data-linux"
description = '''
This denies read access to the
`$APPLOCALDATA` folder on linux as the webview data and
configuration values are stored here.
Allowing access can lead to sensitive information disclosure and
should be well considered.
'''
platforms = ["linux"]
[[scope.deny]]
path = "$APPLOCALDATA/**"
[[permission]]
identifier = "deny-webview-data-windows"
description = '''
This denies read access to the
`$APPLOCALDATA/EBWebView` folder on windows as the webview data and
configuration values are stored here.
Allowing access can lead to sensitive information disclosure and
should be well considered.
'''
platforms = ["windows"]
[[scope.deny]]
path = "$APPLOCALDATA/EBWebView/**"
```
> > > 《訳注》 上記 description の内容Linux 用と Windows 用の記述に分かれています。内容はほぼ同一 このアクセス権設定により、WebView データと設定値がここに保存されるため、Linux 上Windows 上〕の `$APPLOCALDATA`$APPLOCALDATA/EBWebView/〕フォルダへの読み取りアクセスが「拒否」されます。アクセスを「許可」すると機密情報の漏洩につながる可能性があるため、十分に検討する必要があります。
上記の二つのスコープを使用すると、機密性の高い WebView データが含まれる Windows 上の `EBWebView` サブフォルダへのアクセスを防止しながら、`APPLOCALDATA` フォルダへのアクセスを許可できます。
これらをひとつのセットに統合することで、重複する構成が削減され、アプリケーション設定を調べる人にとって理解しやすくなります。
まず、「拒否」スコープが `deny-default` にマージされます:
```toml title="plugins/fs/permissions/deny-default.toml"
[[set]]
identifier = "deny-default"
description = '''
This denies access to dangerous Tauri relevant files and
folders by default.
'''
permissions = ["deny-webview-data-linux", "deny-webview-data-windows"]
```
> > > 《訳注》 上記 description の内容: これにより、危険な Tauri 関連ファイルおよびフォルダへのアクセスがデフォルトで「拒否」されます。
その後、「拒否」スコープと「許可」スコープがマージされます:
```toml
[[set]]
identifier = "scope-applocaldata-reasonable"
description = '''
This scope set allows access to the `APPLOCALDATA` folder and
subfolders except for linux,
while it denies access to dangerous Tauri relevant files and
folders by default on windows.
'''
permissions = ["scope-applocaldata-recursive", "deny-default"]
```
> > > 《訳注》 上記 description の内容 このスコープ・セットは、Linux 以外では `APPLOCALDATA` フォルダーとサブフォルダーへのアクセスを「許可」しますが、Windows ではデフォルトで危険な Tauri 関連ファイルとフォルダーへのアクセスを「拒否」します。
このような「スコープ」は、プラグインのグローバル・スコープを拡張することですべてのコマンドに使用することも、アクセス権内で有効なコマンドと組み合わせて使用​​する場合は選択したコマンドのみに使用することもできます。
`APPLOCALDATA` 内のファイルへの適切な読み取り専用ファイル・アクセス設定は次のようになります:
```toml
[[set]]
identifier = "read-files-applocaldata"
description = '''
This set allows file read access to the `APPLOCALDATA` folder and
subfolders except for linux,
while it denies access to dangerous Tauri relevant files and
folders by default on windows.'''
permissions = ["scope-applocaldata-reasonable", "allow-read-file"]
```
> > > 《訳注》 上記 description の内容 このセットは、Linux 以外の `APPLOCALDATA` フォルダとサブフォルダへのファイル読み取りアクセスを「許可」しますが、Windows ではデフォルトで危険な Tauri 関連ファイルとフォルダへのアクセスを「拒否」します。
上記の各事例は、「スコープ」の機能自体を強調するためだけのものです。プラグインまたはアプリケーションの各開発者は、ユース・ケース(利用者の機能要求)に応じて適切なスコープの組み合わせを検討する必要があります。
<div style="text-align: right;">
【※ この日本語版は、「Feb 28, 2025 英語版」に基づいています】
</div>