Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitOpsでも秘匿情報をバッチリ扱う方法、SealedSecretとは? / How to manage credentials on GitOps

GitOpsでも秘匿情報をバッチリ扱う方法、SealedSecretとは? / How to manage credentials on GitOps

GitOpsで秘匿情報を扱う方法を紹介する資料です。SealedSecretというツールを中心に紹介しますが、それ以外のkamus, Hashicorp Vault, kubesealといった多くのツールも紹介します。
@Kubernetes Meetup Tokyo #21 - Cloud Native CI/CD

Ryuichi Ito

July 25, 2019
Tweet

More Decks by Ryuichi Ito

Other Decks in Technology

Transcript

  1. GitOpsでも秘匿情報を
    バッチリ扱う⽅法、
    SealedSecretとは?
    Ryuichi Ito (@amaya382)
    @Kubernetes Meetup Tokyo #21

    View Slide

  2. GitOpsでも秘匿情報を
    バッチリ扱う⽅法、
    SealedSecretとは?
    Ryuichi Ito (@amaya382)
    @Kubernetes Meetup Tokyo #21 刺客現る!?

    View Slide

  3. ⾃⼰紹介
    • 伊藤 ⻯⼀ ( @amaya382)
    • さくらインターネット株式会社 技術本部
    • k8s使ってます
    • 新規サービスのバックエンド環境として
    • Tellusの衛星データ処理基盤として
    • 好きなk8sツール: telepresence
    • 最近作ってるk8sツール: GitOpsでCIがPullReq作るためのアレ
    • 技術書典7で、「kubectlが使えるようになったところから
    本番運⽤するために必要なことまとめ」の本書きます!!!
    3

    View Slide

  4. 対象者とゴール
    前提
    • k8s・CI/CDの基本的な概念をある程度理解している
    対象者
    • GitOpsを本格的に利⽤するために必要なことを知りたい⼈
    ゴール
    • SealedSecretを使うことで
    GitOpsでも秘匿情報を適切に扱えることを知る
    • どのような仕組みで実現されているか
    • どうすれば利⽤できるか
    • 類似ツールとの⽐較・使い分け
    4
    ⾊々あります

    View Slide

  5. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    5
    Docker
    Registry
    アプリの更新



    イ要

    (PR作

    )
    Hook
    アプリイメージ更新
    開発者(Dev)
    デプロイ実⾏(PR承認)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール

    View Slide

  6. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    6
    Docker
    Registry
    アプリの更新
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    1. コードをPush (PR)

    View Slide

  7. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    7
    Docker
    Registry
    Hook
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    2. CI動作開始

    View Slide

  8. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    8
    Docker
    Registry
    Hook
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    2. CI動作開始
    2.1. テストやビルド

    View Slide

  9. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    9
    Docker
    Registry
    Hook
    アプリイメージ更新
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    2. CI動作開始
    2.1. テストやビルド
    2.2. ビルド成果物をPush

    View Slide

  10. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    10
    Docker
    Registry



    イ要

    (PR作

    )
    Hook
    アプリイメージ更新
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    2. CI動作開始
    2.1. テストやビルド
    2.2. ビルド成果物をPush
    2.3. 更新を反映するPRを作成

    View Slide

  11. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    11
    Docker
    Registry
    開発者(Dev)
    デプロイ実⾏(PR承認)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    3. 更新(PR)を確認・承認

    View Slide

  12. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    12
    Docker
    Registry
    開発者(Dev)
    デプロイ実⾏(PR承認)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    3. 更新(PR)を確認・承認
    3.1. SSoTのCIで
    e2eテスト

    View Slide

  13. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    13
    Docker
    Registry
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    4. SSoTの更新

    View Slide

  14. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    14
    Docker
    Registry
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    5. CDが更新を検知

    View Slide

  15. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    15
    Docker
    Registry
    開発者(Dev)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    5. CDが更新を検知
    5.1. 更新を反映

    View Slide

  16. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    16
    Docker
    Registry
    アプリの更新



    イ要

    (PR作

    )
    Hook
    アプリイメージ更新
    開発者(Dev)
    デプロイ実⾏(PR承認)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール

    View Slide

  17. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    17
    Docker
    Registry
    アプリの更新



    イ要

    (PR作

    )
    Hook
    アプリイメージ更新
    開発者(Dev)
    デプロイ実⾏(PR承認)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    • アプリAを2つ
    • データベースAを使う
    • アプリBを4つ
    • GET /users はアプリAへ
    • POST /comments はアプリBへ
    • ロードバランサが必要

    View Slide

  18. GitOpsのおさらい
    Gitを中⼼とした、k8sに特化したCI/CDの仕組み
    • Single Source of Truthとして、サービスの状況を1つのGitリポジトリに集約
    • 関⼼の分離 (CIとCD)
    18
    Docker
    Registry
    アプリの更新



    イ要

    (PR作

    )
    Hook
    アプリイメージ更新
    開発者(Dev)
    デプロイ実⾏(PR承認)
    運⽤者(Ops)
    アプリケーション
    Gitリポジトリ
    CIツール
    SSoT Gitリポジトリ
    (Manifestファイル群) CDツール
    • アプリAを2つ
    • データベースAを使う
    • アプリBを4つ
    • GET /users はアプリAへ
    • POST /comments はアプリBへ
    • ロードバランサが必要
    • DB_HOST=db-a-host
    • DB_USER=karen
    • DB_PASSWORD=secret-abc

    View Slide

  19. 19
    お気づきいただけただろうか…

    View Slide

  20. 20
    Gitリポジトリ上に秘匿情報が
    公開されてしまうことに…!

    View Slide

  21. ⽤語の共有
    • Secret: kind: Secret のManifest
    • 完全な○○: 特にテンプレートではなく実際の値を含むManifest
    • 秘匿情報: ⼀例として、パスワードの⽂字列
    • SSoT: Single Source of Truth
    21

    View Slide

  22. SealedSecretとは?
    bitnami-labs/sealed-secrets
    • GitOpsにて、Manifestファイルのうち、
    Secretを暗号化してGitリポジトリで管理するための仕組み
    • Secretの代わりにSealedSecretというリソースを利⽤
    • 秘匿情報は公開鍵で暗号化
    • apiVersion: v1 → apiVersion: bitnami.com/v1alpha
    • kind: Secret → kind: SealedSecret
    • data.{key}: base64{val} → spec.encryptedData.{key}: enc{val}

    昨⽇(7/24)v0.8.0がリリース
    22

    View Slide

  23. 23
    使い⽅

    View Slide

  24. 使い⽅ 24
    Secrets
    key:secret
    SealedSecrets
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ secret.yaml
    ファイルツリー

    View Slide

  25. 使い⽅ 25
    Secrets
    key:secret
    SealedSecrets
    key:aKelVk
    暗号化
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ secret.yaml
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ sealedsecret.yaml
    ファイルツリー
    暗号化
    1. kubesealで暗号化

    View Slide

  26. 使い⽅ 26
    Secrets
    key:secret
    SealedSecrets
    key:aKelVk
    暗号化
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ secret.yaml
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ sealedsecret.yaml
    ファイルツリー
    暗号化
    1. kubesealで暗号化
    apiVersion: v1
    kind: Secret
    metadata:
    name: my-secret
    data:
    user: YXlh
    password: c2VjcmV0LXh5eg==
    Secret

    View Slide

  27. 使い⽅ 27
    Secrets
    key:secret
    SealedSecrets
    key:aKelVk
    暗号化
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ secret.yaml
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ sealedsecret.yaml
    ファイルツリー
    暗号化
    1. kubesealで暗号化
    apiVersion: bitnami.com/v1alpha
    kind: SealedSecret
    metadata:
    name: my-secret
    spec:
    encryptedData:
    user: AgCZxTv...
    password: AgCe0PJ...
    Secret SealedSecret
    apiVersion: v1
    kind: Secret
    metadata:
    name: my-secret
    data:
    user: YXlh
    password: c2VjcmV0LXh5eg==

    View Slide

  28. 使い⽅ 28
    Secrets
    key:secret
    ローカルSSoT
    SealedSecrets
    key:aKelVk
    Commit
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ secret.yaml
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ sealedsecret.yaml
    ファイルツリー
    2. 暗号化された
    SealedSecretを
    Gitリポジトリへ

    View Slide

  29. 使い⽅ 29
    Secrets
    key:secret
    ローカルSSoT
    SealedSecrets
    key:aKelVk
    SSoT Gitリポジトリ
    (Manifestファイル群)
    CDツール
    Push(PR)
    3. 暗号化された
    SealedSecretを
    SSoTにPush
    SealedSecrets
    Secrets

    View Slide

  30. 使い⽅ 30
    CDツール
    Secrets
    SealedSecrets
    key:aKelVk
    4. CDツールが
    SSoTの変更を検知。
    SealedSecretを作成
    SSoT Gitリポジトリ
    (Manifestファイル群)

    View Slide

  31. 使い⽅ 31
    CDツール
    Secrets
    SealedSecrets
    key:aKelVk
    復号
    key:secret
    5. ⾃動的にSealedSecretが
    Secretに復号・展開される
    SSoT Gitリポジトリ
    (Manifestファイル群)

    View Slide

  32. 使い⽅ 32
    CDツール
    Secrets
    SealedSecrets
    key:aKelVk
    key:secret
    6. Podから普通に利⽤!
    SSoT Gitリポジトリ
    (Manifestファイル群)

    View Slide

  33. ポイント
    • Pros
    • とにかくシンプル!
    • 暗号化に使う鍵を⼀切意識しなくて良い
    • ⾃動的な復号
    • Pod等からは普通のSecretとして利⽤可能
    • CDツールに依存しない
    • k8s上で完結
    • Cons
    • 暗号化は⼿動
    • テンプレートエンジンとの相性がやや悪い (詳細後述)
    33
    バックアップ⽤に
    取得は可能

    View Slide

  34. 34
    インストール

    View Slide

  35. インストール 35
    CDツール
    Secrets
    Secrets(system)
    実際には
    applyするだけ

    View Slide

  36. インストール 36
    CDツール
    Secrets
    SealedSecrets
    Secrets(system)
    CustomResource
    Definitionの
    SealedSecret
    実際には
    applyするだけ

    View Slide

  37. インストール 37
    CDツール
    Secrets
    SealedSecrets
    Secrets(system)
    sealed-
    secrets-
    controller
    CustomResource
    Definitionの
    SealedSecret
    sealed-secrets-
    controller
    実際には
    applyするだけ

    View Slide

  38. インストール 38
    CDツール
    Secrets
    SealedSecrets
    Secrets(system)
    Publickey Privatekey
    sealed-
    secrets-
    controller
    CustomResource
    Definitionの
    SealedSecret
    sealed-secrets-
    controller ⾃動的に⽣成
    実際には
    applyするだけ

    View Slide

  39. 39
    仕組み

    View Slide

  40. 仕組み 40
    Secrets
    key:secret
    SealedSecrets
    CDツール
    SealedSecrets
    Secrets
    Secrets(system)
    Publickey Privatekey
    sealed-
    secrets-
    controller

    View Slide

  41. 仕組み 41
    Secrets
    key:secret
    SealedSecrets
    1. kubesealで暗号化
    CDツール
    SealedSecrets
    Secrets
    Secrets(system)
    Publickey Privatekey
    取得して暗号化に利⽤
    sealed-
    secrets-
    controller

    View Slide

  42. 仕組み 42
    Secrets
    key:secret
    SealedSecrets
    1. kubesealで暗号化
    CDツール
    SealedSecrets
    Secrets
    Secrets(system)
    Publickey Privatekey
    取得して暗号化に利⽤
    kubeconfigの権限を利⽤
    sealed-
    secrets-
    controller

    View Slide

  43. 仕組み 43
    Secrets
    key:secret
    SealedSecrets
    key:aKelVk
    暗号化
    1. kubesealで暗号化
    CDツール
    SealedSecrets
    Secrets
    Secrets(system)
    Publickey Privatekey
    取得して暗号化に利⽤
    kubeconfigの権限を利⽤
    sealed-
    secrets-
    controller

    View Slide

  44. 仕組み 44
    Secrets
    key:secret
    ローカルSSoT
    SealedSecrets
    key:aKelVk
    Commit
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ secret.yaml
    SSoT/
    ┣ deployment.yaml
    ┣ service.yaml
    ┗ sealedsecret.yaml
    ファイルツリー
    2. 暗号化された
    SealedSecretを
    Gitリポジトリへ

    View Slide

  45. 仕組み 45
    Secrets
    key:secret
    ローカルSSoT
    SealedSecrets
    key:aKelVk
    SSoT Gitリポジトリ
    (Manifestファイル群)
    CDツール
    Push(PR)
    3. 暗号化された
    SealedSecretを
    SSoTにPush
    SealedSecrets
    Secrets
    Secrets(system)
    Publickey Privatekey
    sealed-
    secrets-
    controller

    View Slide

  46. 仕組み 46
    CDツール
    Secrets
    4. CDツールが
    SSoTの変更を検知。
    SealedSecretを作成
    SSoT Gitリポジトリ
    (Manifestファイル群)
    Secrets(system)
    Publickey Privatekey
    sealed-
    secrets-
    controller
    SealedSecrets
    key:aKelVk

    View Slide

  47. 仕組み 47
    CDツール
    SSoT Gitリポジトリ
    (Manifestファイル群)
    Secrets
    SealedSecrets
    key:aKelVk
    Secrets(system)
    Publickey Privatekey
    sealed-
    secrets-
    controller
    5. sealed-secrets-
    controllerが
    SealedSecretを
    Secretに復号・展開 取得して復号に利⽤

    View Slide

  48. 仕組み 48
    CDツール
    SSoT Gitリポジトリ
    (Manifestファイル群)
    Secrets
    SealedSecrets
    key:aKelVk
    Secrets(system)
    Publickey Privatekey
    key:secret
    sealed-
    secrets-
    controller
    5. sealed-secrets-
    controllerが
    SealedSecretを
    Secretに復号・展開 取得して復号に利⽤
    復号

    View Slide

  49. 仕組み 49
    CDツール
    SSoT Gitリポジトリ
    (Manifestファイル群)
    Secrets
    SealedSecrets
    key:aKelVk
    Secrets(system)
    Publickey Privatekey
    key:secret
    sealed-
    secrets-
    controller
    6. Podから普通に利⽤!

    View Slide

  50. 補⾜
    • SealedSecretは、GitOpsでGitリポジトリに公開されてしまう
    SecretのManifestファイルを暗号化するための技術
    • k8s上 (、etcd上)での暗号化を提供する技術ではない
    • k8s上で復号されたSecretは平⽂
    • base64でエンコードされているだけ (可逆)
    • つまり、対象のSecretへのアクセス権限があれば⽣の秘匿情報を取得可能
    • RBACで制限が必要
    • Secretの実体があるetcdもデフォルトでは平⽂
    • etcdをケアするには別途EncryptionConfiguration等が必要
    50
    重要!

    View Slide

  51. 実はちょっとつらい話もあります…
    k8sでよく使われるテンプレートエンジン
    • Helm
    • Kustomize
    • (R.I.P. Ksonnet)
    51

    View Slide

  52. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    52

    View Slide

  53. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    53
    user: karen
    password: secret-abc
    apiVersion: v1
    kind: Secret
    metadata:
    name: my-secret
    data:
    user: {{ .Values.user | b64enc }}
    password: {{ .Values.password | b64enc }}
    ManifestTemplate 環境別設定
    user: aya
    password: secret-xyz
    開発環境⽤
    本番環境⽤

    View Slide

  54. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    54
    完全なManifest
    apiVersion: v1
    kind: Secret
    metadata:
    name: my-secret
    data:
    user: YXlh
    password: c2VjcmV0LXh5eg==

    View Slide

  55. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    55

    View Slide

  56. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    56
    apiVersion: bitnami.com/v1alpha
    kind: SealedSecret
    metadata:
    name: my-secret
    spec:
    encryptedData:
    user: AgCZxTv...
    password: AgCe0PJ...
    完全なSecret 完全なSealedSecret
    apiVersion: v1
    kind: Secret
    metadata:
    name: my-secret
    data:
    user: YXlh
    password: c2VjcmV0LXh5eg==

    View Slide

  57. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    57

    View Slide

  58. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • GitOpsでのテンプレートエンジン
    • 汎⽤的な「Manifestのテンプレート」と「環境別の設定ファイル」から成る
    • 秘匿情報は「環境別の設定ファイル」に保持
    • CDツールは、これらをCD側で組み合わせて完全なManifestを作成・適⽤
    • SealedSecret振り返り
    • 完全なSecretを完全なSealedSecretに暗号化してGitリポジトリへ
    58
    ミスマッチ

    View Slide

  59. 実はちょっとつらい話もあります…
    SealedSecretとテンプレートエンジン
    • Workarounds
    • 1.完全なSealedSecretをSSoTに含めてしまう
    • 2. がんばる
    • テンプレートに設定を適⽤して完全なSecretを⽣成
    →kubesealで暗号化
    →⽣成されたSealedSecretのうち、暗号化された秘匿情報だけ抽出
    →設定ファイルの秘匿情報の部分を暗号化されたもので上書き
    →SSoTへCommit
    • 3. 対応するor待つ
    • bitnami-labs/sealed-secrets#95
    59

    View Slide

  60. 60
    類似ツール

    View Slide

  61. 類似ツール
    kamus
    • 概要
    • SealedSecretに近い挙動でGitOpsに特化したツール
    • Secretを作らず、init-containerで復号して利⽤可能
    • Pros
    • SealedSecretの利点の多くを継承
    • CloudKMSを利⽤可能
    • CDツールに依存しない
    • Cons
    • SealedSecretと⽐較して、鍵を意識する必要がある
    • 公開鍵暗号に⾮対応
    • テンプレートエンジンとの相性がやや悪い (SealedSecretと同様)
    61
    Soluto/kamus

    View Slide

  62. 類似ツール
    kubesec
    • 概要
    • Secretの暗号化に特化したCLIツール
    • Push型向き
    • Pros
    • CloudKMSを利⽤可能
    • Cons
    • CDツールが未対応 (Argo CDは⼀応対応可能)
    • テンプレートエンジンとの相性がやや悪い (SealedSecretと同様)
    62
    shyiko/kubesec

    View Slide

  63. 類似ツール
    HelmSecrets (sops)
    • 概要
    • 暗号化機能を提供するHelmプラグイン
    • Pros
    • テンプレートエンジンとシームレスに動作
    • 暗号化した状態のファイルを直接編集可能
    • CloudKMSを利⽤可能
    • Cons
    • テンプレートエンジンがHelmに限定
    • CDツールが未対応 (ArgoCDは⼀応対応可能)
    63
    futuresimple/helm-secrets

    View Slide

  64. 類似ツール
    Kustomize SecretGeneratorPlugins
    • 概要
    • 暗号化機能を提供するKustomizeプラグイン
    • (廃⽌されかけたが復活)
    • Pros
    • テンプレートエンジンとシームレスに動作
    • Cons
    • CDツールの対応がWIP
    • e.g., argoprd/argo-cd#1789
    • テンプレートエンジンがKustomizeに限定
    64
    kubernetes-sig/kustomize

    View Slide

  65. 類似ツール
    Hashicorp Vault
    • 概要
    • k8s-nativeに動作する秘匿情報集中管理ツール (GitOpsとは無関係)
    • Secretを作らず、init-containerで復号して利⽤可能
    • Pros
    • k8sに閉じない、秘匿情報の集中管理が可能
    • CloudKMSを利⽤可能
    • CDツールに依存しない
    • Cons
    • GitOpsとの相性
    • Manifestファイルと秘匿情報がバラバラに =SSoTとならない
    • k8sで完結せず、Vaultサーバを管理することが必要
    65
    hashicorp/vault

    View Slide

  66. 類似ツール
    git-crypt
    • 概要
    • GitPush時に特定ファイルを暗号化
    • Pros
    • 暗号化・復号は⾃動的
    • k8sに追加モジュールが不要
    • Pod等からは普通のSecretとして利⽤可能
    • Cons
    • CDツールが未対応(ArgoCDは⼀応対応可能)
    • テンプレートエンジンとの相性が悪い
    • 完全なSecretをリポジトリに含めることが必須
    • 暗号化・復号⽤の鍵の共有⽅法が提供されていない
    • クライアントごとにgit-cryptの設定が必要
    • 暗号化されたファイルはキーすら読めない
    66
    AGWA/git-crypt

    View Slide

  67. 67
    まとめ

    View Slide

  68. まとめ
    • SealedSecretとは、
    「GitOpsにて、Manifestファイルのうち、
    Secretを暗号化してGitリポジトリで管理するための仕組み」
    • 他のツールよりシンプルに実現可能
    • k8s上での暗号化はスコープ外
    • 今回はSealedSecretを中⼼に紹介したが、拘る必要はない
    • 要件に合わせて選択しましょう
    • kamusも流⾏りそう…?
    ご清聴ありがとうございました
    68

    View Slide