シークレットローテーションとは? 漏れる前に認証情報を入れ替える
シークレットローテーションとは、認証情報をスケジュールに沿って新しいものに入れ替えることで、攻撃者が持っているかもしれないコピーを静かに動作しなくすることです。
決して変わらないシークレットは、一度漏れれば永遠に動作するシークレットです。ローテーションはそれを断ち切ります。トークン、キー、パスワードを定期的に入れ替えることで、盗まれた認証情報が有用である期間に上限を設け、漏洩を失効させます。難しいのは、古い値に依存するシステムを壊さずにローテーションすることです。
なぜローテーションが重要か
漏洩はしばしば静かに起こります。キーがログやバックアップ、元従業員のラップトップに残り、誰も気づきません。ローテーションは漏洩が起こることを前提とし、その寿命を限定します。30 日のローテーションは、漏洩が決して検出されなくても、盗まれたキーが 1 か月以内に無効になることを意味します。
手動と自動のローテーション
手動のローテーションはミスを起こしやすく、省略されがちです。シークレットマネージャーが駆動する自動ローテーションは、新しい値を生成し、コンシューマーを更新し、古いものを人手の介入なしに廃止します。頻繁なローテーションを現実的にするのは自動化です。
重複の問題
ローテーションが即座に切り替わることはめったにありません。一定の窓の間、実行中のジョブが失敗しないよう、古い認証情報と新しい認証情報の両方が有効でなければなりません。マネージャーはこれをバージョン管理されたシークレットで処理します。新しいものを公開し、コンシューマーに拾わせ、重複期間の後に古いものを失効させます。
CI pipeline でのローテーション
pipeline は値をキャッシュするのではなく、常にジョブ開始時に現在のシークレットを取得すべきです。そうすれば、ローテーションが起きたとき、次の実行が pipeline の変更なしで自動的に新しい認証情報を拾います。hardcode されたシークレットや長くキャッシュされたシークレットは、ローテーションを完全に無効化します。
最も強力な形: ローテーション不要
ジョブごとに新しく発行され、ジョブ終了時に破棄される認証情報は、実質的に継続的にローテーションされています。ジョブごとの OIDC トークンは、ローテーションポリシーを必要とするほど長く生きることがないため、ephemeral な認証情報が最終形なのです。
重要なポイント
- ローテーションは、スケジュールに沿って入れ替えることで、漏れた認証情報が有用である期間に上限を設ける。
- 自動化されたバージョン管理付きのローテーションは、ジョブを壊さずに重複期間を処理する。
- pipeline は実行ごとに生きたシークレットを取得すべきであり、ジョブごとの認証情報は継続的にローテーションされる。