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 full-size slide

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

    View full-size 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 full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. こうなる

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

  28. TERMINAL
    > kubectl exec payroll --container payroll \
    -- cat /vault/secrets/database-config.txt
    postgresql://db-readonly-user:db-secret-password@postgres:5432/wizard
    Render されたTemplate

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

  33. 証明書まわりの機能

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. Tanzuならではの活用

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide