保存時の暗号化とは?保存されたデータの保護
保存時の暗号化は、データがストレージに置かれている間に保護し、ディスクへのアクセスを得た者がキーなしで内容を読めないようにします。
保存時の暗号化は、移動していないデータを対象とします。ディスク上のファイル、ストア内のsecret、bucket内のartifact、データベースの行などです。目標は、盗まれたり不適切にアクセスされたストレージが暗号文しか得られないようにすることです。CI/CDにおいて、保存時の暗号化は、基盤となるストレージが侵害されても保存されたsecretとbuildのartifactを安全に保つものです。
何から保護するか
保存時の暗号化は、ストレージ層への脅威から防御します。盗まれたディスク、露出したバックアップ、設定ミスのあるボリュームスナップショット、あるいはファイルシステムに到達した攻撃者などです。キーがなければデータは読めないため、ストレージの侵害がデータ侵害にはなりません。
どのように実装されるか
- ファイルシステムの下層でのフルディスクまたはボリューム暗号化。
- 特定フィールドのアプリケーションまたはデータベースレベルの暗号化。
- artifactを保持するbucketのためのobject storage暗号化。
キー管理が中心
保存時の暗号化は、それを保護するキーと同じ強さしかなく、通常はキー管理サービスに保持されます。一般的なパターンはエンベロープ暗号化です。データはdata keyで暗号化され、そのdata key自体はKMSに保管されたmaster keyで暗号化されます。
CI/CDにおける保存時の暗号化
CIのsecretストアは保存時に認証情報を暗号化し、jobに注入するときだけ復号します。artifactとcacheのストレージも暗号化すべきです。これは、侵害されたストレージbucketが、あなたのsecretやbuild出力を攻撃者に自動的に渡さないことを意味します。
その限界
保存時の暗号化は、データが復号されて使用中になると何もしません。secretを復号した実行中のjobは、それを平文でメモリに保持します。だからこそ、転送時の暗号化と強力なランタイムの分離と組み合わせる必要があります。
ランタイムとrunner
保存時の暗号化は保存されたsecretを保護しますが、復号された値はjobの間runnerに存在します。エフェメラルで分離されたrunner(Latchkeyのmanaged runnerなど)は、jobが終わるとその使用中の値を破棄し、保存時の暗号化が残すギャップを閉じます。
重要なポイント
- 保存時の暗号化は、保存されたデータをキーなしでは読めない状態に保ちます。
- 盗まれたディスク、露出したバックアップ、ストレージの設定ミスから防御します。
- 完全であるためには、転送時の暗号化とランタイムの分離と組み合わせる必要があります。