PASETO鍵ローテーション戦略
PASETOの署名・暗号鍵のローテーションのベストプラクティス。kidヒント、両受け入れ期間、失効パターン含む。
詳細な説明
PASETOでの鍵ローテーションは他のトークン形式と同じパターンに従いますが、PASETOのフッター + PASERK慣例により実装がよりクリーンになります。
ローテーションする理由:
漏洩や侵害された鍵の影響範囲を制限するために、署名/暗号鍵を定期的にローテーションします。一般的なローテーション周期:高価値鍵で90日、低トラフィック鍵で180〜365日。侵害が疑われたら直ちにローテーションしてください。
基本的なローテーションパターン:
- 新しい鍵を生成(例:v4.public用の
k4.publicとk4.secret)。 - 新しい公開鍵(またはラップされた対称鍵)をすべての検証者に配布;検証者は
kidでインデックスされた古い鍵と新しい鍵の両方を設定。 - 発行者を新しい鍵で署名するように切り替え、発行されるすべてのトークンのフッターに新しい
kidを入れる。 - 古いkidの未処理トークンがすべて期限切れになるよう少なくとも
max(token-lifetime)待つ。 - 検証者から古い鍵を削除する。
これが両受け入れパターンです:検証者は重複期間中両方の鍵を受け入れますが、発行者は常に1つだけ使います。
kid形式の選択:
「v2」のような人間が選んだ名前ではなく、決定論的識別子(PASERK k4.lid / k4.pid)を使ってください。決定論的IDは衝突耐性があり調整不要です。人間に優しい名前(prod-2026-q1)を使う必要があるなら、レジストリで強制して衝突を防いでください。
失効 vs 期限切れ:
PASETOには組み込みの失効機能はありません — 一度発行されたトークンは exp まで有効です。失効には(1) 非常に短い exp 値(例:アクセストークンに5〜15分、長期のリフレッシュトークンと組み合わせる)、または(2) 失効済み jti 値のサーバー側拒否リスト、のどちらかが必要です。ほとんどの本番システムは両方を組み合わせています:短期トークン + まれな即時失効ケース用の拒否リスト。
localとpublicのローテーション:
v*.local のローテーションは v*.public より難しいです。なぜなら対称鍵が発行も検証も両方するからです。良いニュース:PASETOのlocalトークンは通常単一の信頼ドメイン内で使われるため、切り替えをよりタイトに調整できます。悪いニュース:徐々に配布する公開鍵がない — すべての検証者が一度に新しい対称鍵を必要とします。
ユースケース
チームがv4.public署名鍵を四半期ごとにローテーション:各四半期のkidは新しい公開鍵のPASERK k4.pidで、検証者は1 max-token-lifetime重複期間前の四半期の鍵を保持します。