このインベントリを使用して、ランタイム環境に属する値、データベースで生成される値、プラグインが保存する値を判断してください。各セクションでは、ローテーションが稼働中のサイトにどのように影響するかを説明します。
Node.js では、ホスティングプラットフォームのシークレットマネージャーにランタイムシークレットを置き、プロセス開始時に process.env に入るようにします。Worker の場合は wrangler secret put を使用します。astro.config.mjs、wrangler.jsonc、import.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_ID、EMDASH_OAUTH_GOOGLE_CLIENT_SECRET(またはプレフィックスなしのエイリアス) |
| GitHub サインイン | EMDASH_OAUTH_GITHUB_CLIENT_ID、EMDASH_OAUTH_GITHUB_CLIENT_SECRET(またはプレフィックスなしのエイリアス) |
| マーケットプレイス公開(CI) | EMDASH_MARKETPLACE_TOKEN |
| Turnstile(コメント) | EMDASH_TURNSTILE_SECRET_KEY(または TURNSTILE_SECRET_KEY) |
| S3 互換ストレージ | S3_ACCESS_KEY_ID、S3_SECRET_ACCESS_KEY、S3_ENDPOINT、S3_BUCKET、S3_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.json(XDG_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_DID、EMDASH_PUBLISHER_HANDLE、EMDASH_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 キーを置換 | プロバイダーでローテーション、プラグインの管理設定で再入力 |