Skip to main content
Jenks Guo

ドキュメント / explanation

セキュリティとプライバシー

公開インターフェースと管理インターフェースができること、SSO、エージェント用サービス・トークン、監査ログとGitHubアクセスがどのように保護するか、そして訪問者データがどう扱われるかについて説明します。

2種類のアクセス

Public — どなたでも、認証不要です。REST API(/api/v1/*)、公開MCPサーバー(/mcp)、 CLIの公開コマンドおよび静的ファイルは読み取り専用です。これらは公開設計の公開コーパスのみを公開します。 ask_jenks とウェブサイトのチャットは言語モデルを呼び出しますので、濫用を防ぐためIPアドレスごとにレート制限されます。

Admin — Jenks と、Jenks がトークンを与えたAIエージェントです。/api/admin/*、/mcp/admin、 jenks admin … およびコンソールは、コンテンツファイルの検証・書き込み・削除、メディアファイルのアップロード・削除、dev から main への昇格ができます。強力ですので、3つの層で保護しています。

人のサインイン: SSO

コンソールは https://admin.jenksguo.xyz/admin(開発サイトは https://admin.dev.jenksguo.xyz/admin)にあります。Cloudflare Access がそれらのホストの前段にあり、許可されたGoogleアカウントでサインインするまで誰もコンソールに到達できません。ほかのすべてのアドレスの /admin はそこへリダイレクトされます。

Worker は Cloudflare のヘッダーを単純には信用しません。すべての管理リクエストで署名付きAccessトークン自体を検証します — Accessチームの公開鍵に対する署名、アプリケーションのオーディエンスタグ、発行者、有効期限 — さらにメールアドレスが管理者リストにある必要があります。

エージェント用サービス・トークン

AIエージェントはJenksのサインインを使いません。Jenksはコンソール(Access → New agent token)でエージェントごとにサービス・トークンを作成します:

  • 名前付き — 例: "Claude Code on MacBook"。監査ログに、どのエージェントが何をしたかが記録されます。
  • スコープ付き — content(コンテンツ、翻訳、サイト文言)、media(メディアライブラリ)、 publish(本番への直接書き込みと dev → main の昇格)。すべてのトークンは読み取り可能です。 publish がなければ、エージェントは dev に保存し、Jenks が変更を昇格します。
  • 有効期限つき — 30〜365日(既定は90日)。
  • 失効可能 — ワンクリックで、次のリクエストから有効です。
  • SSOに紐づく — Access でサインインした人物のみがトークンの作成・一覧・失効ができます。エージェントトークンが別のトークンを作ることはできません。トークン作成者が管理者でなくなった場合、そのトークンは無効になります。
  • ハッシュで保管 — トークンは作成時に一度だけ表示され、データベースにはそのSHA-256ハッシュのみが保存されます。

エージェントはトークンを Authorization: Bearer jgx_agt_… として https://jenksguo.pages.dev の /api/admin/* または /mcp/admin に送信します(管理ホストではAccessがプログラムを止めます)。ブラウザはそのようなヘッダーを自動送信しないため、悪意のあるページが流用することはできません。

監査ログ

すべての管理書き込み — および拒否された試行 — は記録されます: 誰(メールまたは agent:<name>)、どのツール、どのファイル、ブランチ、ホスト、結果またはエラー。トークンの作成と失効も記録されます。ファイル内容は決して記録しません。Jenks はコンソール(Access)でログを読みます。エージェントは自分のエントリ(admin_audit_log)のみを読めます。コンテンツ自体の変更履歴はGitの履歴が記録します。

緊急時用(ブレイクグラス)の管理トークン

初期の管理トークンは緊急時のために今も有効ですが、エージェントトークンは作成できません。これはmacOSのキーチェーン agent-env:JENKSGUO_ADMIN_TOKEN と暗号化されたWorkerシークレットとして保管され、時間一定比較で照合されます。漏えいの可能性がある場合はローテーションしてください: 新しい値をキーチェーンとWorkerシークレットに保存すると、古いものは直ちに無効になります。ローカル開発のみ(localhostでの wrangler dev)では、コンソールはこれでサインインできます: トークンは一度だけ HttpOnly のセッションクッキーに交換されます。

管理APIが触れられる範囲

書き込みは許可リストのコンテンツパスに限定されます — コーパスのエントリ、レンズ、スキル、コア文書、翻訳用用語集、そしてこのドキュメントです。コード、ワークフロー、シークレット、content/ の外のものは変更できません。すべての書き込みはまずコンテンツスキーマに対して検証されます。

メディアファイル

管理インターフェースからアップロードされた画像、動画、PDFはCloudflare R2バケットに保存され、/media/… から配信されます。アップロードされた瞬間からアドレスを知っていれば公開されますので、すべての訪問者向けの素材のみを置いてください。

  • ファイルタイプは名前ではなくバイト列から検出し、受け付けるのはウェブ用の画像・動画・PDF形式のみです(各25 MB)。
  • SVG画像はスクリプトやイベントハンドラを含む場合は拒否し、すべてのSVGはコンテンツセキュリティのサンドボックス内で配信されます。そのため、細工されたSVGを直接開いても、このサイト上でコードを実行することはできません。
  • コンテンツとは異なり、メディアはgit管理ではありません: 削除は恒久的です。公開中のコンテンツがそのファイルを使用している間は削除を拒否します。

GitHub へのアクセス

管理による書き込みは、発行に必要な権限のみを持つ、単一リポジトリにスコープされたきめ細かい個人用アクセストークンを使ってGitHub API経由のコミットになります。これは暗号化されたWorkerシークレットとして保管されます。すべての変更がコミットになるため:

  • gitの履歴がすべての変更を記録します — 何が、いつ、なぜ(コミットメッセージ。コミットトレーラーにはエージェント名)変わったか。
  • いつでも元に戻せます — 任意のファイルの任意の過去バージョンを復元できます。

リスクのある変更は dev ブランチでステージし、https://dev.jenksguo.xyz で確認してから本番サイトに反映できます。

訪問者のプライバシー

  • 広告トラッカーやマーケティングクッキーは使用しません。
  • チャットの会話は訪問者のブラウザ(sessionStorage)にのみ保持され、タブを閉じると消去されます。サイトはチャットの会話を保存しません。
  • チャットメッセージはCloudflare Worker経由で OpenRouter に送られ、そこでサードパーティの言語モデルにルーティングされます。訪問者には、機微な個人情報を共有しないようお願いしています。
  • 音声は訪問者がマイクをタップするまでオフで、10ターン後または実際の会話が検出されないと自動でオフになります。音声入力は可能な場合はブラウザ内蔵の音声認識を使用し、そうでない場合は音声をOpenRouterに送って文字起こしします。音声での応答はCloudflare Workers AI(Deepgram Aura-2、英語)またはOpenRouter(その他の言語)で生成し、端末の音声合成をフォールバックとして使います。録音や生成音声は保存しません。
  • Cloudflare はセキュリティとレート制限のために標準的なリクエストログを保持します。

コンテンツのプライバシー

content/ 配下はすべて公開です。Jenks の履歴書には電話番号、自宅住所、照会先連絡先が含まれていましたが、これらはいずれもコーパスには含めておらず、今後も追加してはなりません。他者に関する事実は、Jenks の役割を説明するために必要な範囲に限定します。

不具合の報告

詳細を添えて jenksguo@gmail.com にメールしてください。許可なく管理インターフェースをテストしないでください。

.mdこのページはAIの支援で翻訳されています。正式な肩書は英語のままです。