GitLab Secrets Manager ADR 001: エンベロープ暗号化の使用
コンテキスト
GitLab Secrets Manager でシークレットを安全に保存するために、GitLab システムへのセキュリティ侵害が発生した場合でも、暗号化されていないシークレットが漏洩しないようなシステムが必要です。
決定事項
エンベロープ暗号化を使用します。GitLab Rails は暗号化されたシークレットを、暗号化されたデータキーとともに保存します。シークレットを復号化するために、GitLab Rails は GitLab Secrets Service を通じて GCP キーマネージャーに復号化リクエストを行い、復号化されたデータキーを取得する必要があります。データキーは次に暗号化されたシークレットを復号化するために使用されます。
sequenceDiagram
participant A as Client
participant B as GitLab Rails
participant C as GitLab Secrets Service
Note over B,C: Initialize vault for project/group/organization
B->>C: Initialize vault - create key pair
C->>B: Returns vault public key
B->>B: Stores vault public key
Note over A,C: Creating a new secret
A->>B: Create new secret
B->>B: Generate new symmetric data key
B->>B: Encrypts secret with data key
B->>B: Encrypts data key with vault public key
B->>B: Stores envelope (encrypted secret + encrypted data key)
B-->>B: Discards plain-text data key
B->>A: Success
Note over A,C: Retrieving a secret
A->>B: Get secret
B->>B: Retrieves envelope (encrypted secret + encrypted data key)
B->>C: Decrypt data key
C->>C: Decrypt data key using vault private key
C->>B: Returns plain-text data key
B->>B: Decrypts secret
B-->>B: Discards plain-text data key
B->>A: Returns secret結果
このアプローチにより、エンベロープを含む GitLab データベースにアクセスした攻撃者は、シークレットのコンテンツを復号化できません。必要な秘密鍵がそこには保存されていないためです。
また、各 vault に使用される非対称鍵ペアを安全に生成・保存する方法も検討する必要があります。
さらに、以下のリソースが必要です。
- 複数の非対称鍵ペア。プロジェクト、グループ、または組織に属する各 vault に固有の非対称鍵ペアが必要です。
- 複数の対称鍵。各シークレットに固有のキーが必要です。
代替案
シークレットの暗号化と復号化を GitLab Secrets Service で行いながら、暗号化されたデータを GitLab Rails に保存することを検討しました。しかし、これはシークレットと暗号化キーが GitLab Secrets Service に同時に存在する時間が生まれることを意味します。
