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

HashiCorp VaultとTKG(TCE)でSecretを良い感じに管理する

HashiCorp VaultとTKG(TCE)でSecretを良い感じに管理する

ツナカン(TUNA-JP Conference) #3 で話した資料です。

Kazuto Kusama

June 26, 2022
Tweet

More Decks by Kazuto Kusama

Other Decks in Technology

Transcript

  1. Copyright © 2021 HashiCorp
    HashiCorp VaultとTKG(TCE)で
    Secretを良い感じに管理する

    View Slide

  2. Copyright © 2021 HashiCorp
    草間一人
    Sr. Solutions Engineer
    @jacopen
    Kazuto
    Kusama

    View Slide

  3. Secretってありますよね
    kind: Secret
    apiVersion: v1
    data:
    username: YWRtaW4=
    password: MWYyZDFlMmU2N2Rm
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: { ... }
    creationTimestamp: 2016-01-22T18:41:56Z
    name: mysecret
    namespace: default
    resourceVersion: "164619"
    uid: cfee02d6-c137-11e5-8d73-42010af00002
    type: Opaque

    View Slide

  4. Secretってありますよね
    kind: Secret
    apiVersion: v1
    data:
    username: YWRtaW4=
    password: MWYyZDFlMmU2N2Rm
    metadata:
    annotations:
    kubectl.kubernetes.io/last-applied-configuration: { ... }
    creationTimestamp: 2016-01-22T18:41:56Z
    name: mysecret
    namespace: default
    resourceVersion: "164619"
    uid: cfee02d6-c137-11e5-8d73-42010af00002
    type: Opaque
    “admin” “1f2d1e2e67df”
    Base64エンコードされているだけ。Git等に入れるのはNG

    View Slide

  5. せっかくGitOpsにしたのに
    Secret
    Secret

    View Slide

  6. せっかくGitOpsにしたのに
    Secret
    Secret
    間違えてgitに
    コミットしちゃった!
    あの鍵って誰が
    管理してるの?

    View Slide

  7. Secretのジレンマ
    ▪ Secretが大事なことは誰もが分かってる
    ▪ だから既存の自動化フローには載せず、特別対応
    – 一部の人だけが手元で厳重に管理
    – 権限を絞ったプライベートリポジトリで管理
    – 権限を絞ったSpreadsheetで管理
    ▪ しかしこの特別対応こそが、Secret Sprawlを生みセキュリティを低
    下させる
    – 人間が把握できる範囲には限界がある
    – 人間はミスをする

    View Slide

  8. ちゃんと管理しましょう!

    View Slide

  9. こういう管理ができればいい
    信頼できる
    シークレット
    管理基盤

    View Slide

  10. アイデンティティベースの
    シークレットと暗号化の管理システム
    OSSで提供されているほか、商用版のVault
    EnterpriseやHCP VaultというManaged Serviceも
    あります。

    View Slide

  11. こうなる

    View Slide

  12. 僕たちが欲しいもの
    シークレットを”ちゃん
    と管理”できること

    View Slide

  13. 僕たちが欲しいもの
    暗号化され安全に
    管理されている
    追加・削除がすぐ出
    来る

    View Slide

  14. 僕たちが欲しいもの
    誰が使っているか
    を特定できる
    利用者ごとにポリ
    シーを設定出来る
    Admin
    アプリ

    View Slide

  15. 僕たちが欲しいもの
    安全に
    使える
    効率的に
    使える

    View Slide

  16. k8sに限らず、ありとあらゆるケースで活用可能
    今回はk8s+Vaultの組み合わせを中心に紹介

    View Slide

  17. 利用方法
    or
    or
    Server
    ここで集中管理

    View Slide

  18. 利用方法
    or
    or
    Server
    CLI
    GUI
    API
    Interface
    Client
    Admin
    アプリ
    CI/CD
    さまざまな人/システムが、さま
    ざまな方法でアクセス

    View Slide

  19. デプロイ方法
    Helmを使ってk8sの中に
    セットアップ

    View Slide

  20. デプロイ方法
    k8sの外に建てたVaultと連携

    View Slide

  21. デプロイ方法
    HCP VaultだとHashiCorp
    ManagedなVaultが使える

    View Slide

  22. 認証 Otka
    JWT/OIDC
    LDAP
    Azure AD
    AWS IAM
    GitHub
    Token
    etc…
    AppRole
    Kubernetes
    TLS Certs

    View Slide

  23. シンプルな例 - KV Secrets Engine
    GUIもしくはCLIでVaultに値を保存
    vault kv put kv/secret/path foo=bar
    or
    GUI
    CLI
    foo=bar

    View Slide

  24. Kubernetesを経由してアプリに渡す
    foo=bar
    アプリ vault-agent
    foo=bar
    foo=bar
    init-container
    or
    Sidecar

    View Slide

  25. Kubernetesを経由してアプリに渡す
    Vault Agent InjectorをKubernetes
    上にセットアップ。Helmでインストー
    ル可能
    Mutating webhookでPodにInit
    containerやSidecarを追加してくれ

    View Slide

  26. CODE EDITOR
    {{- with secret "internal/data/database/config" -}}
    postgresql://{{ .Data.data.username }}:{{ .Data.data.password
    }}@postgres:5432/wizard
    {{- end -}}

    View Slide

  27. CODE EDITOR
    spec:
    template:
    metadata:
    annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/agent-inject-status: "update"
    vault.hashicorp.com/role: "internal-app"
    vault.hashicorp.com/agent-inject-secret-database-config.txt:
    "internal/data/database/config"
    vault.hashicorp.com/agent-inject-template-database-config.txt: |
    {{- with secret "internal/data/database/config" -}}
    postgresql://{{ .Data.data.username }}:{{ .Data.data.password
    }}@postgres:5432/wizard
    {{- end -}}

    View Slide

  28. TERMINAL
    > kubectl exec payroll --container payroll \
    -- cat /vault/secrets/database-config.txt
    postgresql://db-readonly-user:[email protected]:5432/wizard
    Render されたTemplate

    View Slide

  29. Kubernetesを経由してアプリに渡す
    (CSI Provider)
    foo=bar
    アプリ CSI Provider
    foo=bar
    foo=bar
    ボリュームとして
    Podにマウント

    View Slide

  30. Kubernetesを経由してアプリに渡す
    (CSI Provider)

    View Slide

  31. Kubernetesを経由してアプリに渡す
    (Kubernetes External Secrets)
    https://github.com/external-secrets/external-secrets
    External Secrets
    Controller
    Secrets
    foo=bar
    foo=bar
    kube-apiserver
    External
    Secrets

    View Slide

  32. External Secrets Operator
    ▪ 前述のKubernetes External Secrets (KES)は
    メンテナンスモードに
    ▪ 後継のExternal Secrets Operatorが登場
    – https://github.com/external-secrets/external-secrets
    – Vaultにも対応
    – まだ試したことないので誰か教えてください

    View Slide

  33. 証明書まわりの機能

    View Slide

  34. PKI
    ルート認証局
    X.509証明書
    ● Vault を中間認証局として設定
    ● 認証や暗号化通信に必要な署名済みの
    X.509証明書を動的に発行
    X.509証明書
    Signed
    X.509証明書
    Lease
    Lease
    Application A
    Application B
    中間認証局

    View Slide

  35. PKI
    ルート認証局
    X.509証明書
    Signed
    Application A
    Application B
    中間認証局
    Certificates Secret
    Certificates Secret

    View Slide

  36. Tanzuならではの活用

    View Slide

  37. こいつの扱いに困る!
    tanzu management-cluster create -f management.yaml

    View Slide

  38. consul-template
    Vault上の secrets/tkg/clusters/workload
    から値を持ってくる
    それをBase64エンコードする

    View Slide

  39. consul-template
    consul-template -template "/tmp/template.yaml:/tmp/cluster.yaml" -once

    View Slide

  40. 紹介しきれないので
    まずは触ってみて!
    $ vault server -dev

    View Slide

  41. Thank You
    [email protected]
    www.hashicorp.com

    View Slide