kubeasz与HashiCorp Vault集成:Kubernetes密钥管理与动态凭证实践
你是否还在为Kubernetes集群中的密钥管理而烦恼?手动创建和分发密钥不仅效率低下,还存在密钥泄露的风险。本文将详细介绍如何使用kubeasz集成HashiCorp Vault,实现Kubernetes密钥的自动化管理和动态凭证的安全实践,让你轻松应对密钥管理的挑战。读完本文,你将掌握Vault的部署、配置以及与Kubernetes的集成方法,实现密钥的安全存储、动态生成和自动轮换。
为什么需要密钥管理解决方案
在Kubernetes集群中,密钥(Secret)的管理是一个至关重要的环节。传统的密钥管理方式存在以下痛点:
- 静态密钥风险:手动创建的密钥长期有效,一旦泄露将造成严重安全隐患。
- 密钥分发困难:跨命名空间、跨集群的密钥分发需要复杂的手动操作。
- 密钥轮换复杂:密钥轮换需要手动更新所有相关资源,容易出错。
- 缺乏审计跟踪:无法有效跟踪密钥的使用情况和访问记录。
HashiCorp Vault是一款功能强大的密钥管理工具,它可以帮助我们解决上述问题,提供安全的密钥存储、动态凭证生成和细粒度的访问控制。
kubeasz简介
kubeasz是一款基于Ansible的Kubernetes安装与运维管理工具,提供自动化部署、集群管理、配置管理等功能。它具有以下特点:
- 基于Ansible,易于上手和扩展。
- 支持离线安装,适合内网环境。
- 支持多种Kubernetes版本,满足不同场景需求。
- 提供丰富的集群管理功能,如节点管理、容器管理、存储管理等。
kubeasz的证书管理模块(docs/setup/01-CA_and_prerequisite.md)已经为我们创建了CA证书和各种kubeconfig文件,为集成Vault奠定了基础。
HashiCorp Vault部署
准备工作
在开始之前,确保你已经使用kubeasz成功部署了一个Kubernetes集群。我们将使用Helm来部署Vault,因此需要先安装Helm:
# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 添加HashiCorp仓库
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
部署Vault
使用以下命令部署Vault:
# 创建命名空间
kubectl create namespace vault
# 部署Vault
helm install vault hashicorp/vault --namespace vault \
--set "server.dev.enabled=true" \
--set "injector.enabled=true"
这里我们使用开发模式部署Vault,仅用于测试环境。在生产环境中,你需要配置Vault的持久化存储和高可用模式。
初始化Vault
Vault部署完成后,需要进行初始化:
# 进入Vault pod
kubectl exec -it -n vault vault-0 -- sh
# 初始化Vault
vault operator init
# 解封Vault(需要使用初始化时生成的解封密钥)
vault operator unseal <unseal-key-1>
vault operator unseal <unseal-key-2>
vault operator unseal <unseal-key-3>
# 登录Vault
vault login <root-token>
Vault与Kubernetes集成
启用Kubernetes认证
Vault支持多种认证方式,我们将使用Kubernetes认证方式,允许Pod通过Service Account令牌来认证Vault:
# 启用Kubernetes认证
vault auth enable kubernetes
# 配置Vault与Kubernetes集成
vault write auth/kubernetes/config \
kubernetes_host="https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT"
创建角色和策略
创建一个策略,允许访问特定路径的密钥:
# 创建策略
vault policy write k8s-secrets - <<EOF
path "secret/data/k8s/*" {
capabilities = ["read"]
}
EOF
# 创建角色,绑定策略和Service Account
vault write auth/kubernetes/role/k8s-secrets \
bound_service_account_names=vault-secret-reader \
bound_service_account_namespaces=default \
policies=k8s-secrets \
ttl=24h
创建Service Account
在Kubernetes中创建一个Service Account,并授予访问Vault的权限:
# 创建Service Account
kubectl create serviceaccount vault-secret-reader
# 创建Role和RoleBinding
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: vault-secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: vault-secret-reader
subjects:
- kind: ServiceAccount
name: vault-secret-reader
roleRef:
kind: Role
name: vault-secret-reader
apiGroup: rbac.authorization.k8s.io
EOF
动态凭证实践
存储静态密钥
首先,我们在Vault中存储一个静态密钥:
# 启用kv Secrets引擎
vault secrets enable -path=secret kv-v2
# 存储密钥
vault kv put secret/k8s/demo-db username="db-user" password="db-password"
创建Vault Agent注入配置
创建一个Pod,使用Vault Agent注入密钥:
apiVersion: v1
kind: Pod
metadata:
name: vault-demo
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-inject-secret-db-creds: "secret/data/k8s/demo-db"
vault.hashicorp.com/role: "k8s-secrets"
vault.hashicorp.com/service-account: "vault-secret-reader"
spec:
serviceAccountName: vault-secret-reader
containers:
- name: app
image: nginx
应用上述配置:
kubectl apply -f vault-demo-pod.yaml
验证密钥注入
检查Pod中的密钥是否被正确注入:
# 进入Pod
kubectl exec -it vault-demo -- sh
# 查看注入的密钥
cat /vault/secrets/db-creds
你应该能够看到Vault中存储的数据库用户名和密码。
动态数据库凭证
Vault还支持动态生成数据库凭证。以下是一个使用PostgreSQL的示例:
# 启用数据库 Secrets引擎
vault secrets enable database
# 配置PostgreSQL连接
vault write database/config/postgresql \
plugin_name=postgresql-database-plugin \
connection_url="postgresql://{{username}}:{{password}}@postgres:5432/postgres?sslmode=disable" \
allowed_roles="pg-app" \
username="postgres" \
password="postgres"
# 创建角色,定义动态凭证的权限和TTL
vault write database/roles/pg-app \
db_name=postgresql \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"
更新Pod注解,注入动态凭证:
metadata:
annotations:
vault.hashicorp.com/agent-inject-secret-pg-creds: "database/creds/pg-app"
kubeasz中的密钥管理
kubeasz提供了证书和密钥管理的功能,通过Ansible角色实现。例如,roles/deploy/tasks/main.yml负责创建CA证书和各种kubeconfig文件。这些证书和密钥可以与Vault集成,实现更安全的管理。
证书创建流程
kubeasz创建证书的流程如下:
- 创建CA配置文件 ca-config.json.j2
- 创建CA证书签名请求 ca-csr.json.j2
- 生成CA证书和私钥
- 生成各种组件的证书和kubeconfig文件
这些步骤确保了Kubernetes集群中各个组件之间的安全通信。
与Vault集成的优势
将kubeasz创建的证书和密钥存储在Vault中,可以带来以下优势:
- 集中管理:所有密钥和证书都存储在Vault中,便于统一管理和审计。
- 动态生成:Vault可以动态生成证书和密钥,减少静态密钥的风险。
- 自动轮换:Vault支持密钥和证书的自动轮换,提高安全性。
- 细粒度访问控制:通过Vault的策略,可以精确控制谁可以访问哪些密钥。
总结
本文介绍了如何使用kubeasz和HashiCorp Vault集成,实现Kubernetes密钥的安全管理和动态凭证的生成。通过这种集成,我们可以解决传统密钥管理方式的痛点,提高Kubernetes集群的安全性。
在实际应用中,你需要根据自己的需求调整Vault的配置,例如启用持久化存储、配置高可用模式、设置更精细的策略等。同时,kubeasz的Ansible角色可以进一步扩展,实现Vault的自动化部署和配置。
希望本文对你有所帮助,如果你有任何问题或建议,请随时在项目的GitHub仓库中提出。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



