ツナカン(TUNA-JP Conference) #3 で話した資料です。
Copyright © 2021 HashiCorpHashiCorp VaultとTKG(TCE)でSecretを良い感じに管理する
View Slide
Copyright © 2021 HashiCorp草間一人Sr. Solutions Engineer@jacopenKazutoKusama
Secretってありますよねkind: SecretapiVersion: v1data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rmmetadata:annotations:kubectl.kubernetes.io/last-applied-configuration: { ... }creationTimestamp: 2016-01-22T18:41:56Zname: mysecretnamespace: defaultresourceVersion: "164619"uid: cfee02d6-c137-11e5-8d73-42010af00002type: Opaque
Secretってありますよねkind: SecretapiVersion: v1data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rmmetadata:annotations:kubectl.kubernetes.io/last-applied-configuration: { ... }creationTimestamp: 2016-01-22T18:41:56Zname: mysecretnamespace: defaultresourceVersion: "164619"uid: cfee02d6-c137-11e5-8d73-42010af00002type: Opaque“admin” “1f2d1e2e67df”Base64エンコードされているだけ。Git等に入れるのはNG
せっかくGitOpsにしたのにSecretSecret
せっかくGitOpsにしたのにSecretSecret間違えてgitにコミットしちゃった!あの鍵って誰が管理してるの?
Secretのジレンマ▪ Secretが大事なことは誰もが分かってる▪ だから既存の自動化フローには載せず、特別対応– 一部の人だけが手元で厳重に管理– 権限を絞ったプライベートリポジトリで管理– 権限を絞ったSpreadsheetで管理▪ しかしこの特別対応こそが、Secret Sprawlを生みセキュリティを低下させる– 人間が把握できる範囲には限界がある– 人間はミスをする
ちゃんと管理しましょう!
こういう管理ができればいい信頼できるシークレット管理基盤
アイデンティティベースのシークレットと暗号化の管理システムOSSで提供されているほか、商用版のVaultEnterpriseやHCP VaultというManaged Serviceもあります。
こうなる
僕たちが欲しいものシークレットを”ちゃんと管理”できること
僕たちが欲しいもの暗号化され安全に管理されている追加・削除がすぐ出来る
僕たちが欲しいもの誰が使っているかを特定できる利用者ごとにポリシーを設定出来るAdminアプリ
僕たちが欲しいもの安全に使える効率的に使える
k8sに限らず、ありとあらゆるケースで活用可能今回はk8s+Vaultの組み合わせを中心に紹介
利用方法ororServerここで集中管理
利用方法ororServerCLIGUIAPIInterfaceClientAdminアプリCI/CDさまざまな人/システムが、さまざまな方法でアクセス
デプロイ方法Helmを使ってk8sの中にセットアップ
デプロイ方法k8sの外に建てたVaultと連携
デプロイ方法HCP VaultだとHashiCorpManagedなVaultが使える
認証 OtkaJWT/OIDCLDAPAzure ADAWS IAMGitHubTokenetc…AppRoleKubernetesTLS Certs
シンプルな例 - KV Secrets EngineGUIもしくはCLIでVaultに値を保存vault kv put kv/secret/path foo=barorGUICLIfoo=bar
Kubernetesを経由してアプリに渡すfoo=barアプリ vault-agentfoo=barfoo=barinit-containerorSidecar
Kubernetesを経由してアプリに渡すVault Agent InjectorをKubernetes上にセットアップ。Helmでインストール可能Mutating webhookでPodにInitcontainerやSidecarを追加してくれる
CODE EDITOR{{- with secret "internal/data/database/config" -}}postgresql://{{ .Data.data.username }}:{{ .Data.data.password}}@postgres:5432/wizard{{- end -}}
CODE EDITORspec: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 -}}
TERMINAL> kubectl exec payroll --container payroll \-- cat /vault/secrets/database-config.txtpostgresql://db-readonly-user:[email protected]:5432/wizardRender されたTemplate
Kubernetesを経由してアプリに渡す(CSI Provider)foo=barアプリ CSI Providerfoo=barfoo=barボリュームとしてPodにマウント
Kubernetesを経由してアプリに渡す(CSI Provider)
Kubernetesを経由してアプリに渡す(Kubernetes External Secrets)https://github.com/external-secrets/external-secretsExternal SecretsControllerSecretsfoo=barfoo=barkube-apiserverExternalSecrets
External Secrets Operator▪ 前述のKubernetes External Secrets (KES)はメンテナンスモードに▪ 後継のExternal Secrets Operatorが登場– https://github.com/external-secrets/external-secrets– Vaultにも対応– まだ試したことないので誰か教えてください
証明書まわりの機能
PKIルート認証局X.509証明書● Vault を中間認証局として設定● 認証や暗号化通信に必要な署名済みのX.509証明書を動的に発行X.509証明書SignedX.509証明書LeaseLeaseApplication AApplication B中間認証局
PKIルート認証局X.509証明書SignedApplication AApplication B中間認証局Certificates SecretCertificates Secret
Tanzuならではの活用
こいつの扱いに困る!tanzu management-cluster create -f management.yaml
consul-templateVault上の secrets/tkg/clusters/workloadから値を持ってくるそれをBase64エンコードする
consul-templateconsul-template -template "/tmp/template.yaml:/tmp/cluster.yaml" -once
紹介しきれないのでまずは触ってみて!$ vault server -dev
Thank You[email protected]www.hashicorp.com