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

k8sとVaultを組み合わせてシークレットをもっとセキュアに

Kazuto Kusama
December 07, 2021

 k8sとVaultを組み合わせてシークレットをもっとセキュアに

Kubernetes Novice Tokyo #15 で発表した資料です。
KubernetesとHashiCorp Vaultを組み合わせて良い感じにSecretの管理ができるんだよという話をしました

Kazuto Kusama

December 07, 2021
Tweet

More Decks by Kazuto Kusama

Other Decks in Technology

Transcript

  1. 大事なもの is 何 ▪ Cloud ProviderのAccess key/secretとか ▪ API Tokenとか

    ▪ DBのuser/passとか ▪ SSHの鍵とか ▪ TLSの証明書と鍵とか
  2. ちゃんと管理 is 何 AWSのAccess key/ secret access key データベースのメンテナンス用 User/Pass

    SSHのAuthorized keys *** / *** *** / *** それぞれがKeyを 手元で管理している メンテ用のuser/pass を共有している 各ユーザーの公開鍵 をauthorized_keysに 設定している
  3. ちゃんと管理 is 何 AWSのAccess key/ secret access key データベースのメンテナンス用 User/Pass

    SSHのAuthorized keys *** / *** *** / *** 間違えてgitに コミットしちゃった! 退職してもメンテ用パ スワードは内緒にね ! 退職した人の公開鍵 が登録されたまま つまり ちゃんと管理 できてない状態
  4. ちなみにk8sの場合、 どう管理するんでしたっけ? 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
  5. ちなみにk8sの場合、 どう管理するんでしたっけ? 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
  6. Secretのジレンマ ▪ Secretが大事なことは誰もが分かってる ▪ だから既存の自動化フローには載せず、特別対応 – 一部の人だけが手元で厳重に管理 – 権限を絞ったプライベートリポジトリで管理 –

    権限を絞ったSpreadsheetで管理 ▪ しかしこの特別対応こそが、Secret Sprawlを生みセキュリティを低 下させる – 人間が把握できる範囲には限界がある – 人間はミスをする
  7. 利用方法 or or Server CLI GUI API Interface Client Admin

    アプリ CI/CD さまざまな人/システムが、さま ざまな方法でアクセス
  8. 認証 Otka JWT/OIDC LDAP Azure AD AWS IAM GitHub Token

    etc… AppRole Kubernetes TLS Certs
  9. 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 -}}
  10. TERMINAL > kubectl exec payroll --container payroll \ -- cat

    /vault/secrets/database-config.txt postgresql://db-readonly-user:db-secret-password@postgres:5432/wizard Render されたTemplate
  11. External Secrets Operator ▪ 前述のKubernetes External Secrets (KES)は メンテナンスモードに ▪

    後継のExternal Secrets Operatorが登場 – https://github.com/external-secrets/external-secrets – Vaultにも対応 – まだ試したことないので誰か教えてください
  12. Cert-manager apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: vault-issuer namespace: sandbox

    spec: vault: path: pki_int/sign/example-dot-com server: https://vault.local caBundle: <base64 encoded CA Bundle PEM file> auth: ... apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: app-cert spec: dnsNames: - '*.example.local' issuerRef: kind: ClusterIssuer name: vault-issuer secretName: app-cert
  13. Encryption as a Service • データの暗号化/復号の中継地点 暗号化/復号 Application A Application

    B PII PII = Personal Identifiable Information PII 暗号化 復号 暗号鍵 PII PII データベース 書き込み 読み出し