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

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

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. ⾃⼰紹介 • 伊藤 ⻯⼀ ( @amaya382) • さくらインターネット株式会社 技術本部 •

    k8s使ってます • 新規サービスのバックエンド環境として • Tellusの衛星データ処理基盤として • 好きなk8sツール: telepresence • 最近作ってるk8sツール: GitOpsでCIがPullReq作るためのアレ • 技術書典7で、「kubectlが使えるようになったところから 本番運⽤するために必要なことまとめ」の本書きます!!! 3
  2. 対象者とゴール 前提 • k8s・CI/CDの基本的な概念をある程度理解している 対象者 • GitOpsを本格的に利⽤するために必要なことを知りたい⼈ ゴール • SealedSecretを使うことで

    GitOpsでも秘匿情報を適切に扱えることを知る • どのような仕組みで実現されているか • どうすれば利⽤できるか • 類似ツールとの⽐較・使い分け 4 ⾊々あります
  3. 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ツール
  4. 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)
  5. 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動作開始
  6. 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. テストやビルド
  7. 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
  8. 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を作成
  9. 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)を確認・承認
  10. 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テスト
  11. 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の更新
  12. 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が更新を検知
  13. 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. 更新を反映
  14. 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ツール
  15. 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へ • ロードバランサが必要
  16. 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
  17. ⽤語の共有 • Secret: kind: Secret のManifest • 完全な◦◦: 特にテンプレートではなく実際の値を含むManifest •

    秘匿情報: ⼀例として、パスワードの⽂字列 • SSoT: Single Source of Truth 21
  18. 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
  19. 使い⽅ 25 Secrets key:secret SealedSecrets key:aKelVk 暗号化 SSoT/ ┣ deployment.yaml

    ┣ service.yaml ┗ secret.yaml SSoT/ ┣ deployment.yaml ┣ service.yaml ┗ sealedsecret.yaml ファイルツリー 暗号化 1. kubesealで暗号化
  20. 使い⽅ 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
  21. 使い⽅ 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==
  22. 使い⽅ 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リポジトリへ
  23. 使い⽅ 29 Secrets key:secret ローカルSSoT SealedSecrets key:aKelVk SSoT Gitリポジトリ (Manifestファイル群)

    CDツール Push(PR) 3. 暗号化された SealedSecretを SSoTにPush SealedSecrets Secrets
  24. 使い⽅ 31 CDツール Secrets SealedSecrets key:aKelVk 復号 key:secret 5. ⾃動的にSealedSecretが

    Secretに復号・展開される SSoT Gitリポジトリ (Manifestファイル群)
  25. ポイント • Pros • とにかくシンプル! • 暗号化に使う鍵を⼀切意識しなくて良い • ⾃動的な復号 •

    Pod等からは普通のSecretとして利⽤可能 • CDツールに依存しない • k8s上で完結 • Cons • 暗号化は⼿動 • テンプレートエンジンとの相性がやや悪い (詳細後述) 33 バックアップ⽤に 取得は可能
  26. インストール 37 CDツール Secrets SealedSecrets Secrets(system) sealed- secrets- controller CustomResource

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

    controller CustomResource Definitionの SealedSecret sealed-secrets- controller ⾃動的に⽣成 実際には applyするだけ
  28. 仕組み 41 Secrets key:secret SealedSecrets 1. kubesealで暗号化 CDツール SealedSecrets Secrets

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

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

    SealedSecrets Secrets Secrets(system) Publickey Privatekey 取得して暗号化に利⽤ kubeconfigの権限を利⽤ sealed- secrets- controller
  31. 仕組み 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リポジトリへ
  32. 仕組み 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
  33. 仕組み 46 CDツール Secrets 4. CDツールが SSoTの変更を検知。 SealedSecretを作成 SSoT Gitリポジトリ

    (Manifestファイル群) Secrets(system) Publickey Privatekey sealed- secrets- controller SealedSecrets key:aKelVk
  34. 仕組み 47 CDツール SSoT Gitリポジトリ (Manifestファイル群) Secrets SealedSecrets key:aKelVk Secrets(system)

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

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

    Publickey Privatekey key:secret sealed- secrets- controller 6. Podから普通に利⽤!
  37. 補⾜ • SealedSecretは、GitOpsでGitリポジトリに公開されてしまう SecretのManifestファイルを暗号化するための技術 • k8s上 (、etcd上)での暗号化を提供する技術ではない • k8s上で復号されたSecretは平⽂ •

    base64でエンコードされているだけ (可逆) • つまり、対象のSecretへのアクセス権限があれば⽣の秘匿情報を取得可能 • RBACで制限が必要 • Secretの実体があるetcdもデフォルトでは平⽂ • etcdをケアするには別途EncryptionConfiguration等が必要 50 重要!
  38. 実はちょっとつらい話もあります… 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 開発環境⽤ 本番環境⽤
  39. 実はちょっとつらい話もあります… 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==
  40. 実はちょっとつらい話もあります… SealedSecretとテンプレートエンジン • Workarounds • 1.完全なSealedSecretをSSoTに含めてしまう • 2. がんばる •

    テンプレートに設定を適⽤して完全なSecretを⽣成 →kubesealで暗号化 →⽣成されたSealedSecretのうち、暗号化された秘匿情報だけ抽出 →設定ファイルの秘匿情報の部分を暗号化されたもので上書き →SSoTへCommit • 3. 対応するor待つ • bitnami-labs/sealed-secrets#95 59
  41. 類似ツール kamus • 概要 • SealedSecretに近い挙動でGitOpsに特化したツール • Secretを作らず、init-containerで復号して利⽤可能 • Pros

    • SealedSecretの利点の多くを継承 • CloudKMSを利⽤可能 • CDツールに依存しない • Cons • SealedSecretと⽐較して、鍵を意識する必要がある • 公開鍵暗号に⾮対応 • テンプレートエンジンとの相性がやや悪い (SealedSecretと同様) 61 Soluto/kamus
  42. 類似ツール kubesec • 概要 • Secretの暗号化に特化したCLIツール • Push型向き • Pros

    • CloudKMSを利⽤可能 • Cons • CDツールが未対応 (Argo CDは⼀応対応可能) • テンプレートエンジンとの相性がやや悪い (SealedSecretと同様) 62 shyiko/kubesec
  43. 類似ツール HelmSecrets (sops) • 概要 • 暗号化機能を提供するHelmプラグイン • Pros •

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

    Pros • テンプレートエンジンとシームレスに動作 • Cons • CDツールの対応がWIP • e.g., argoprd/argo-cd#1789 • テンプレートエンジンがKustomizeに限定 64 kubernetes-sig/kustomize
  45. 類似ツール Hashicorp Vault • 概要 • k8s-nativeに動作する秘匿情報集中管理ツール (GitOpsとは無関係) • Secretを作らず、init-containerで復号して利⽤可能

    • Pros • k8sに閉じない、秘匿情報の集中管理が可能 • CloudKMSを利⽤可能 • CDツールに依存しない • Cons • GitOpsとの相性 • Manifestファイルと秘匿情報がバラバラに =SSoTとならない • k8sで完結せず、Vaultサーバを管理することが必要 65 hashicorp/vault
  46. 類似ツール git-crypt • 概要 • GitPush時に特定ファイルを暗号化 • Pros • 暗号化・復号は⾃動的

    • k8sに追加モジュールが不要 • Pod等からは普通のSecretとして利⽤可能 • Cons • CDツールが未対応(ArgoCDは⼀応対応可能) • テンプレートエンジンとの相性が悪い • 完全なSecretをリポジトリに含めることが必須 • 暗号化・復号⽤の鍵の共有⽅法が提供されていない • クライアントごとにgit-cryptの設定が必要 • 暗号化されたファイルはキーすら読めない 66 AGWA/git-crypt
  47. まとめ • SealedSecretとは、 「GitOpsにて、Manifestファイルのうち、 Secretを暗号化してGitリポジトリで管理するための仕組み」 • 他のツールよりシンプルに実現可能 • k8s上での暗号化はスコープ外 •

    今回はSealedSecretを中⼼に紹介したが、拘る必要はない • 要件に合わせて選択しましょう • kamusも流⾏りそう…? ご清聴ありがとうございました 68