シークレットとキーの管理

このページ

このインベントリを使用して、ランタイム環境に属する値、データベースで生成される値、プラグインが保存する値を判断してください。各セクションでは、ローテーションが稼働中のサイトにどのように影響するかを説明します。

Node.js では、ホスティングプラットフォームのシークレットマネージャーにランタイムシークレットを置き、プロセス開始時に process.env に入るようにします。Worker の場合は wrangler secret put を使用します。astro.config.mjswrangler.jsoncimport.meta.env にシークレット値を置かないでください。Vite はビルド時の値をサーバーバンドルに埋め込む場合があります。

概要

シークレットソース保存場所キー紛失時の影響
EMDASH_ENCRYPTION_KEYオペレーター (emdash secrets generate)環境 / Worker シークレットのみ現在のデータに影響なし。EmDash はフォーマットのみチェック
プレビューシークレット自動生成(環境変数オーバーライド)options テーブル (emdash:preview_secret)発行済みプレビューリンクが無効に。新規は問題なし
IP ソルト自動生成(環境変数オーバーライド)options テーブル (emdash:ip_salt)コメントレート制限の連続性がリセット
セッションと API トークンセッション/トークンごとに生成セッションストア / データベース(ハッシュのみ)影響なし — プレーンテキストは保存されない
OAuth プロバイダー資格情報あなた(Google/GitHub コンソール)環境そのプロバイダーでのサインインが停止(置換まで)
Turnstile シークレットあなた(Cloudflare ダッシュボード)環境コメント CAPTCHA 検証が失敗
S3 資格情報あなた(ストレージプロバイダー)ランタイム環境メディアのアップロード/ダウンロードが失敗(置換まで)
プラグインシークレットあなた(管理設定 UI)データベース(プラグイン設定/ストレージ)管理画面で再入力
CLI 資格情報emdash login / emdash plugin publish デバイスフロー~/.config/emdash/auth.json(モード 0600)デバイスフローを再実行
レジストリ CLI 資格情報emdash-plugin atproto OAuth~/.emdash/oauth/~/.emdash/credentials.json(モード 0600)再ログイン。ID は PDS に存在

暗号化キー

EMDASH_ENCRYPTION_KEY は現在、プラグインシークレットやその他の保存データを暗号化していません。変数が設定されている場合、EmDash は起動時にそのフォーマットをチェックします。不正な値はオペレーター向けのログメッセージを生成しますが、サイトはリクエストの処理を続けます。

次のコマンドは正しくフォーマットされた値を生成します。デプロイメントがこの変数を使用する場合、ランタイム環境または Worker シークレットとして保存してください。

npx emdash secrets generate
# emdash_enc_v1_<43文字の base64url>

# Cloudflare:
wrangler secret put EMDASH_ENCRYPTION_KEY

フォーマットは emdash_enc_v1_ に続いて 32 バイトのランダムデータをパディングなし base64url としたものです。値はオペレーターが提供し、データベースには保存されません。紛失してもデータ復旧への影響はありません(保存データが依存していないため)。

生成されたサイトシークレット

2 つのシークレットは初回使用時に自動生成され、options テーブルに永続化されるため、リクエスト、デプロイメント、isolate 間で安定しています。生成はアトミックです — 同時のコールドスタートは 1 つの値に収束します。

プレビューシークレット

プレビュー URL に署名します(HMAC)。emdash:preview_secret として保存。32 バイトのランダムデータ、base64url。

  • オーバーライド: 複数のプロセス間で同じシークレットが必要な場合、または監査目的で固定したい場合は EMDASH_PREVIEW_SECRET(レガシーエイリアス: PREVIEW_SECRET)を設定します。環境変数は常に保存値より優先されます。
  • ローテーション: emdash:preview_secret の行を削除(または環境変数を変更)して再デプロイします。影響: 以前発行されたプレビューリンクが検証されなくなります。他には何も壊れません — 次のプレビューリクエスト時に新しいシークレットが生成(または環境変数から読み取り)されます。
  • 紛失した場合: 回復不能なものはありません。プレビューリンクは設計上、短命です。

プレビュー URL の構築と検証についてはプレビューガイドを参照してください。

IP ソルト

コメントのレート制限に使用されるコメント投稿者の IP アドレスの SHA-256 ハッシュ(コメントの ip_hash)にソルトを追加します。emdash:ip_salt として保存。サイト固有のため、ハッシュは EmDash インストール間で相関できません。

  • オーバーライド: EMDASH_IP_SALT を設定します。後方互換性のため、EMDASH_AUTH_SECRET / AUTH_SECRET も参照されます — 歴史的にそれらからソルトを導出していたインストールは安定したハッシュを保持します。
  • ローテーション: 環境変数を変更するか emdash:ip_salt の行を削除します。影響: 新しいコメント送信は異なる値にハッシュされるため、全員のレート制限カウントが再開始されます。既存のコメントとその保存済みハッシュは影響を受けません。
  • 紛失した場合: データ損失はありません。レート制限の連続性のみがリセットされます。

セッションと API トークン

  • セッションは Astro のセッションストア(Cloudflare では Workers KV、Node ではファイルシステム)を使用します。Cookie は不透明なセッション ID を運びます。管理すべき署名シークレットはありません。サインアウトしてセッションを終了するか、セッションストア(例: KV ネームスペース)をクリアして全員に再サインインを強制します。
  • API トークンec_pat_ec_oat_ec_ort_ プレフィックス)は不透明な 256 ビットのランダム値です。SHA-256 ハッシュのみが保存されます。プレーンテキストは作成時に一度だけ表示されます。管理画面で取り消して再作成することでローテーションします。
  • 招待、マジックリンク、リカバリートークンは単一目的で、auth_tokens に SHA-256 ハッシュとして保存され、期限付きです(招待 7 日、マジックリンク 15 分)。

プロアクティブにバックアップやローテーションすべきものはありません。データベースリークはハッシュのみを公開し、すべてのトークンは管理画面から取り消しまたは再発行できます。

ユーザー提供のサービス資格情報

外部サービスの資格情報は環境から読み取られ、データベースには書き込まれません。プロバイダーでローテーションし、変数を更新し、再デプロイします。

サービス変数
Google サインインEMDASH_OAUTH_GOOGLE_CLIENT_IDEMDASH_OAUTH_GOOGLE_CLIENT_SECRET(またはプレフィックスなしのエイリアス)
GitHub サインインEMDASH_OAUTH_GITHUB_CLIENT_IDEMDASH_OAUTH_GITHUB_CLIENT_SECRET(またはプレフィックスなしのエイリアス)
マーケットプレイス公開(CI)EMDASH_MARKETPLACE_TOKEN
Turnstile(コメント)EMDASH_TURNSTILE_SECRET_KEY(または TURNSTILE_SECRET_KEY
S3 互換ストレージS3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEYS3_ENDPOINTS3_BUCKETS3_REGION

Cloudflare では wrangler secret put で設定します。ローカル開発では .env に入れます。Wrangler は .dev.vars または .env のいずれかを読み取り、両方は読みません。.dev.vars が存在する場合に優先されます。バインディング経由の R2 はアクセスキー変数を必要としません(バインディングがランタイムアクセスを付与するため)。メディアストレージを参照してください。

プラグインシークレット

プラグインが type: "secret" で宣言する設定(メールプロバイダーの API キー、フォーム CAPTCHA など)は管理 UI で入力され、データベースに保存されます — options テーブルの plugin:<id>:settings:<key> またはプラグインのキーバリューストレージに。保存されたシークレットが管理 UI に返されるかはプラグイン次第です。適切に実装されたプラグインはシークレット自体ではなく「値が設定されています」フラグのみを返します(バンドルされたフォームプラグインはこれを行います)。

  • ローテーション: プロバイダーでキーをローテーションし、プラグインの設定ページに新しい値を貼り付けます。即座に有効になります。
  • 紛失した場合: 管理画面で値を再入力します。他に依存するものはありません。

CLI 資格情報

emdash CLI は 2 種類の資格情報を保持し、どちらも ~/.config/emdash/auth.jsonXDG_CONFIG_HOME を尊重)にオーナーのみの権限(0600)で作成されます:

  • サイトトークンemdash login は OAuth デバイスフローで EmDash インスタンスに認証し、インスタンス URL をキーとして結果のトークンを保存します。emdash logout で削除されます。呼び出しごとに --token または EMDASH_TOKEN が保存トークンをオーバーライドします。
  • マーケットプレイストークンemdash plugin publish は GitHub デバイスフローで EmDash マーケットプレイスに認証し、marketplace:<origin> をキーとして結果の JWT を保存します。CI 公開では代わりに EMDASH_MARKETPLACE_TOKEN を設定します — 保存された資格情報より優先されます。

ファイルの紛失は無害です。emdash login(またはデバイスフローを再実行する emdash plugin publish)を再度実行してください。

プラグインレジストリ CLI 資格情報

別の emdash-plugin CLI(パッケージ @emdash-cms/plugin-cli)は実験的な AT Protocol レジストリをターゲットとしています。そこでの公開は AT Protocol のアイデンティティ(パブリッシャー DID)に紐付いています — サイト自体は公開資格情報を保持せず、インストールはその DID に帰属するリリースレコードのチェックサムに対してアーティファクトを検証します。

  • atproto OAuth で認証します。OAuth セッション/ステート blob は ~/.emdash/oauth/ にあり、パブリッシャーのアイデンティティ(DID、ハンドル、PDS)は ~/.emdash/credentials.json にキャッシュされます。どちらもオーナーのみの権限で書き込まれます。
  • CI では EMDASH_PUBLISHER_DIDEMDASH_PUBLISHER_HANDLEEMDASH_PUBLISHER_PDS でアイデンティティを提供します。EMDASH_REGISTRY_URL はレジストリホストをオーバーライドします。CI からの自動 publish にはランナー上の ~/.emdash/oauth/ の OAuth セッションファイルが引き続き必要です — 環境変数だけでは OAuth セッションを運べません。
  • 公開アクセスのローテーションまたは取り消しは AT Protocol アカウント(例: アプリパスワード)で行い、EmDash ではありません。Atmosphere 認証を参照してください。

ローテーションクイックリファレンス

やりたいこと手順
すべてのプレビューリンクを無効化emdash:preview_secret オプション行を削除(または環境変数オーバーライドを変更)
コメントレート制限のハッシュをリセットEMDASH_IP_SALT を変更(または emdash:ip_salt オプション行を削除)
漏洩した API トークンを取り消す管理 → ユーザー → API トークン → 取り消し、代替を作成
すべてのセッションを終了セッションストアをクリア(Workers KV ネームスペース / セッションディレクトリ)
プロバイダー資格情報を置換プロバイダーでローテーション、環境変数を更新、再デプロイ
プラグイン API キーを置換プロバイダーでローテーション、プラグインの管理設定で再入力