キーローテーションとは何か?スケジュールに沿って認証情報を置き換える
キーローテーションとは、暗号鍵や認証情報を定期的に置き換える実践であり、これによって漏洩した単一のキーの有効な寿命が限定されます。
キーローテーションは、キーをスケジュールに沿って廃止し、新しいものに置き換えることで、漏洩した認証情報が与えうる被害を制限します。定期的にローテーションされるキーは、攻撃者にとって次のローテーションまでしか役に立たず、永久には役立ちません。CI/CDでは、ローテーションは署名キー、APIキー、クラウド認証情報に適用され、その究極の形はジョブごとにローテーションする認証情報を使うことです。
なぜキーをローテーションするのか
認証情報は、あなたが決して検知できないような形で漏洩します。ログ、バックアップ、退職した従業員のラップトップなどです。ローテーションは、漏洩したキーが有効であり続ける期間に上限を設けるため、検知されない露出が無期限のアクセスにつながることはありません。
何がローテーションされるのか
- artifactやcommitに使われる署名キー。
- サービス向けのAPIキーや個人アクセストークン。
- クラウドアクセスキーやデータベース認証情報。
downtimeなしでローテーションを行う
優れたローテーションは、切り替えの途中で何も壊れないように、古いキーと新しいキーを短期間だけ重ねます。新しいキーを発行し、利用者を更新してから、古いキーを廃止します。これを自動化することで、そもそもチームがローテーションを恐れる原因となる障害を回避できます。
CI/CDにおけるキーローテーション
パイプラインは、ローテーションする認証情報を消費するとともに、ローテーション自体を駆動することもできます。CIを通じてローテーションを自動化することで、それが忘れられた手作業の雑務になるのを防ぎます。ただし、最も強力なパターンは、常設のキーを完全に避けることです。
限界まで突き詰めたローテーション
OIDCを介してジョブごとに新しく発行される認証情報は、実質的に毎回の実行でローテーションされ、数分で失効します。ローテーションすべき長命のキーは、そもそも何も残らないため存在しません。これは、パイプラインアクセスにおけるローテーション問題への最もクリーンな答えです。
ローテーションとrunner
ジョブごとの認証情報は、そのジョブの間だけrunner上に存在します。隔離されたエフェメラルなrunner(Latchkeyのマネージドrunnerなど)では、ジョブが終わると認証情報は消えるため、絶え間ないローテーションがスケジュールされたタスクではなく自然な状態になります。
重要なポイント
- キーローテーションは、キーを定期的に置き換えることで、漏洩した認証情報が有用であり続ける期間に上限を設けます。
- 古いキーと新しいキーを重ねることで、downtimeなしのローテーションが可能になります。
- ジョブごとのOIDC認証情報は、常設のキーなしに、実質的に毎回の実行でローテーションされます。