mirror of
https://github.com/NeuralNomadsAI/CodeNomad.git
synced 2026-11-01 03:20:37 +00:00
## Summary
- New **Support CodeNomad** help page (10 languages): what sponsorship
pays for, the funding policy (a contribution, not a purchase; never
required to download, use or update) and one button per funding channel
naming who receives the money.
- **Download page** ends with a short *Support development* section with
the same buttons; the help **header** gains a *Sponsor* link; the former
support page is retitled **Bug reports and source builds** (ids
unchanged) so the two are not confused.
- **App**: *Support CodeNomad* in Settings → Info (secondary button
between Updates and Diagnostics), in the Help menu after *CodeNomad
Help* (Electron and Tauri, English help-page fallback) and as a palette
command without a default shortcut. All open the localized help page.
- **Repository**: `.github/FUNDING.yml` lists the maintainer's GitHub
Sponsors profile and the Support page (the Sponsor button needs
*Settings → General → Features → Sponsorships*).
Channels live in `docs/help/funding.json` and render through a
`{{funding}}` directive allowed only on the download and sponsor pages,
so adding a channel needs no retranslation. Entries are validated (exact
keys, unique ids, `https://github.com/sponsors/<login>` only) and
escaped; a page using `{{funding}}` with no channel fails the build. CSP
unchanged.
Agreed with the co-maintainer before publishing.
## Validation
- `npm run test:help`: 31/31 (27 pages × 10 locales, funding validation
and placement).
- `node scripts/test-help-browser.mjs`: 47/47 (header overflow at 390 px
in en/he/ne/ja/zh-Hans, button geometry).
- `npm run typecheck`; unit tests help-url, hotkey-bindings,
menu-labels; browser tests help-command, server-info, view-menu-electron
(22/22); `cargo test` for the Tauri crate (291/291, including the
English sponsor fallback).
- Independent review: zero findings.
73 lines
12 KiB
Markdown
73 lines
12 KiB
Markdown
# 認証とセキュリティ
|
||
|
||
CodeNomad へのアクセスにより、OpenCode を通じてバックエンドホスト上で作業を実行できます。サーバーパスワード、ブラウザーセッション、ペアリング済み端末は、強力な認証情報として扱ってください。CodeNomad はマルチテナントの実行サンドボックスではありません。
|
||
|
||
## サーバーの認証方法を選ぶ {#authentication}
|
||
|
||
| 方法 | 寿命と範囲 |
|
||
| --- | --- |
|
||
| `--password` または `CODENOMAD_SERVER_PASSWORD` | そのバックエンドプロセスの実行時上書き。毎回の起動時に再指定が必要で、永続化されません。管理対象のパスワードファイルより優先します。 |
|
||
| 設定で指定したパスワード | アクティブな設定 YAML の隣の `auth.json` に、ソルト付き scrypt ハッシュを保存します。以後、実行時上書きがない起動で使用します。 |
|
||
| `--generate-token` | ローカルの使い捨て初期設定を有効にします。表示トークンは 60 秒有効です。再利用できる API トークンやリモートコントロールリンクではありません。 |
|
||
| リモートコントロールのペアリング | ホストから管理する独立した端末 Cookie 認証。[リモートコントロール](remote-control.md)を参照してください。 |
|
||
|
||
既定のユーザー名は `codenomad` です。保存済みの認証ファイルはそのユーザー名を保持し、`--username` だけを変更しても保存済みの識別情報は改名されません。パスワードの設定、初期設定モード、明示的な認証スキップのいずれもなければ、サーバーは起動を拒否します。
|
||
|
||
コマンド引数やシェル履歴へのパスワード埋め込みより、保護された環境変数/サービスの秘密情報を優先してください。それでも、プロセス環境や設定ディレクトリを調べられる人は、環境を侵害できる可能性があります。
|
||
|
||
## 永続パスワードを初期設定する {#bootstrap}
|
||
|
||
1. 実行時パスワード上書きなしでローカル起動します。先に証明書を設定せずループバックで初期設定するには、`codenomad --host 127.0.0.1 --https=false --http=true --generate-token --launch` を使用します。
|
||
2. バックエンドのマシンで、表示された **Local Connection URL** の `/auth/token` を開き、`CODENOMAD_BOOTSTRAP_TOKEN:` の後に表示された値を送信します。その出力を共有しないでください。
|
||
3. **設定 → リモートアクセス → 直接アクセス(ローカルネットワーク、上級者向け) → サーバーパスワード** を開きます。
|
||
4. **パスワードを設定** を選び、**新しいパスワード** と **パスワードの確認** に 8 文字以上を入力して、**パスワードを保存** を選びます。
|
||
5. 次回起動時は `--generate-token` を省き、直接接続には保存済みパスワードを使います。リモートアクセスを有効にする前に、[信頼された HTTPS](remote-access.md) を設定してください。ループバック HTTP の初期設定コマンドは、リモート配備用コマンドではありません。
|
||
|
||
初期設定は、ホスト自身のループバックリスナーからのみ受け付け、LAN クライアントやリモートコントロールの受信経路からは受け付けません。セットアップでは既定のループバックバインドを維持してください。期限切れ/使用済みトークンには、初期設定での新たな起動が必要です。永続パスワードが既にある場合、初期設定セッションでは代わりに **パスワードを変更** を選べます。
|
||
|
||
`auth.json` はアプリが管理します。ハッシュの手編集やファイルの公開はしないでください。パスワードが CLI/環境由来の場合、設定画面は置き換えを拒否します。既存の管理対象パスワードを使うには上書きなしで再起動し、新規設定にはローカル初期設定を使います。認証ファイルが読み書きできない場合は、認証無効化ではなく、OS の権限/パスを修正する必要があります。
|
||
|
||
## ブラウザーセッションと失効 {#sessions}
|
||
|
||
直接ログインは、バックエンドのメモリ内に不透明なセッションを作成し、`codenomad_session` Cookie(または設定した Cookie 名)を発行します。Cookie は `HttpOnly`、`SameSite=Lax`、範囲 `/` で、HTTPS 発行時は `Secure` です。ブラウザーセッション Cookie であり、バックエンドの再起動でメモリ内セッションは無効になります。要求されたら、その場で再認証し、失敗した変更操作を再送しないでください。
|
||
|
||
パスワード変更は、以後の認証情報チェックを変えますが、発行済みの直接セッションやリモートコントロール端末を無効化 **しません**。侵害が疑われる場合:
|
||
|
||
1. ネットワーク公開を制限し、ホストで新しいパスワードを設定するか、実行時の秘密情報を変更して再起動します。
|
||
2. バックエンドを再起動して、既存の直接セッションを無効化します。
|
||
3. **リモートコントロール → ペアリング済み端末** で、不明な端末を別途 **取り消す** 操作を行います。経路全体を即座に切断する必要があれば、リモートコントロールを停止します。
|
||
4. 影響したファイル、プロバイダーアカウント、OpenCode ネイティブのアクティビティを確認します。アクセスを止めても、受け付け済みの作業は巻き戻りません。
|
||
|
||
独自の未使用 30 日の期限切れと 5 分のペアリングリンクは、[リモートコントロール](remote-control.md)を参照してください。パスワード変更は端末失効ではなく、トンネル停止は端末削除ではありません。
|
||
|
||
## 通信とリスナーの公開を保護する {#transport}
|
||
|
||
直接リモートアクセスには、信頼された HTTPS を使用します。平文 HTTP は、その区間を観測できる人にパスワード、セッション Cookie、作業内容をさらします。リバースプロキシで TLS を終端する場合、バックエンドとの接続はループバックや保護されたネットワークに置いてください。プロキシの TLS は、公開された上流 HTTP 接続を暗号化しません。
|
||
|
||
`--dangerously-skip-auth`/`CODENOMAD_SKIP_AUTH` は、CodeNomad の直接リスナーのログインを無効にし、リクエストを認証済みと扱います。サーバーを安全に公開できるようにするもの **ではありません**。強制的な境界保護なしで到達できるリスナーは、到達できる全員にアクセスを与えます。VPN 接続だけでは、信頼できる VPN ユーザーと信頼できないユーザーを区別しません。すべてのアクセス経路を独立して設計・検証していない限り、認証を有効にしてください。このフラグを使っても、リモートコントロールにはペアリング済み端末が必要です。
|
||
|
||
[バインド表と TLS 手順](remote-access.md)、特にスタンドアロン HTTP 専用モードを確認してください。このモードは `--host` に従い、ループバック以外に平文を公開する場合があります。証明書エラーを検証の無効化で解決しないでください。
|
||
|
||
**`CODENOMAD_SKIP_AUTH=false` は、`--dangerously-skip-auth` を指定しない限り認証を有効に保ちます。** `1`、`true`、`yes`、`on` は認証のバイパスを有効にし、大文字・小文字と前後の空白は無視されます。`0`、`false`、`no`、`off`、空または空白のみの値、未定義の変数ではバイパスは無効のままです。それ以外の値では、CLI フラグを指定してもサーバーは起動しません。フラグは有効な無効化値より優先します。[CLI リファレンス](server.md#cli-reference)を参照してください。
|
||
|
||
## ホストの境界を理解する {#host-boundary}
|
||
|
||
`--workspace-root` は開けるワークスペースを制限し、`--unrestricted-root` は参照を緩和します。どちらも OS の隔離領域、コンテナー、ファイルシステムのサンドボックスではなく、許可されたネイティブツールの動作を制限しません。エージェント、シェルコマンド、プラグイン、MCP ツールは、実行ホストの権限と、それぞれ設定した認証情報で動作します。
|
||
|
||
[SideCar](browser-sidecars.md) は信頼された追加機能です。CodeNomad は自身のサインイン Cookie とペアリング済み端末の Cookie を SideCar サービスに渡しませんが、SideCar のページは CodeNomad と同じオリジンで読み込まれ、そのスクリプトはサインイン済みのセッションで操作できます。CodeNomad 自体と同程度に信頼できるサービスだけを登録してください。
|
||
|
||
実際の分離が必要なら、OS アカウント、コンテナー/VM、上流の権限設定を使用してください。1 つのタブしか見えないはずだという期待だけで、端末にアクセスを与えないでください。サーバー設定と共有 OpenCode サービスは、他の会話/プロジェクトに影響する場合があります。それぞれの境界について、[OpenCode のセットアップ](opencode.md)、[権限](permissions.md)、[拡張機能](extensions.md)を参照してください。
|
||
|
||
## 認証情報と診断情報を非公開にする {#privacy}
|
||
|
||
プロバイダー接続とグローバルな会話ストレージは OpenCode が管理します。CodeNomad は、対応する使用量連携のため、接続メタデータと選択した認証情報をサーバー側で読み取ります。ブラウザー API はプロバイダーの秘密値を返しません。外部管理の OAuth ログイン更新は管理元の責任であり、CodeNomad はその更新トークンを交換しません。[プロバイダー](providers.md)を参照してください。
|
||
|
||
| 情報 | 扱い |
|
||
| --- | --- |
|
||
| パスワード、初期設定トークン、ペアリングリンク、Cookie | Issue、スクリーンショット、シェルの記録、共有ログに貼り付けないでください。 |
|
||
| `auth.json`、TLS 秘密鍵、トンネル識別情報、設定の秘密情報 | OS 権限と暗号化バックアップで保護し、サポートのためにディレクトリ全体をアップロードしないでください。 |
|
||
| 会話テキスト、添付、ワークスペースパス、リモートアドレス | 人、プロジェクト、インフラを特定する場合があるため、共有前に確認・伏せ字にしてください。 |
|
||
| プロバイダーキーと音声の認証情報 | 意図した設定/認証管理元だけに入力し、どのプロバイダーにデータが送られるか確認します。[音声](voice.md)を参照してください。 |
|
||
| debug/trace ログとネットワークキャプチャ | 必要な分だけ収集し、ローカルで確認して報告前に伏せ字にします。下流ツールの出力に秘密がないとは想定しないでください。 |
|
||
|
||
**設定 → 情報 → バグを報告** は、リスナー、アドレス、パス、認証情報、会話内容を事前入力せず、範囲を限定した診断を準備します。自分で追加する内容も、送信前に確認してください。[不具合報告とソースビルド](support.md#report-a-bug)を参照してください。
|