
前言
在现代应用中,密钥管理 和 敏感数据保护 是至关重要的,特别是在容器化和微服务架构中。为了确保数据的安全性和合规性,开发人员和运维人员需要一种高效、可靠的方式来存储和管理敏感信息。HashiCorp Vault 是一个强大的工具,专门用于管理和保护访问密钥、API 密钥、密码等敏感数据。
在 Kubernetes 环境中部署 HashiCorp Vault,不仅能保护存储的数据,还能简化密钥管理过程,自动化访问控制和审计,确保系统的安全性。本文将详细介绍如何在 Kubernetes 中部署 Vault,并探索其核心功能和高级配置。
一、HashiCorp Vault 架构原理
Vault 的核心功能是通过 密钥存储、动态凭证生成、加密服务 和 访问控制 来保护敏感数据。其架构包括几个主要的组件:
1. Vault 核心组件
-
• 密钥存储引擎(Secrets Engines):用于存储和管理敏感数据,如文件系统、数据库凭证、API 密钥等。Vault 提供了多种存储引擎,如 KV 引擎(键值存储)、数据库引擎(生成数据库凭证)、AWS 引擎(生成 AWS 凭证)等。 -
• 认证后端(Auth Backends):Vault 支持多种认证方式,包括 LDAP、Kubernetes、GitHub、AWS IAM 等,确保只有授权用户或服务才能访问 Vault。 -
• 加密与解密功能(Transit Engine):Vault 提供加密和解密服务,可以在不存储密钥的情况下对数据进行加密处理。这对敏感数据的加密传输和存储非常有用。 -
• 审计日志(Audit Logs):Vault 可以生成详细的审计日志,记录对 Vault 所有操作的访问和修改,帮助管理员跟踪操作。
2. Vault 的存储与高可用性
Vault 使用 Storage Backend 来存储所有数据。默认情况下,Vault 使用 File Backend 存储数据,但它也支持 Consul、MySQL、PostgreSQL 等多种后端存储方式。为提高高可用性,Vault 支持 高可用模式,通过 Raft Consensus Protocol 来保证数据一致性和容错能力。
二、在 Kubernetes 中部署 HashiCorp Vault
1. 安装 Helm 和 Vault Chart
首先,我们需要安装 Helm,这是 Kubernetes 的包管理工具,它可以帮助我们简化应用的安装过程。安装 Helm:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
然后添加 Vault 的 Helm 仓库并更新:
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
2. 部署 Vault
接下来,使用 Helm 部署 Vault。这里我们将部署 Vault 的 开发模式,适用于实验和开发环境。
kubectl create namespace vault
helm install vault hashicorp/vault --namespace vault --set "server.dev.enabled=true"
该命令会在 Kubernetes 中创建一个 Vault 实例,并启用开发模式。在开发模式下,Vault 使用内存存储,并且不需要初始化和 unseal(解封)。
3. 初始化 Vault
如果你使用的是生产模式,Vault 需要先初始化并解封(unseal)。初始化 Vault 会生成 root token 和 unseal keys。
kubectl exec -it vault-0 -n vault -- vault operator init
获取初始化输出,保存 unseal keys 和 root token,后续用于解封和访问 Vault。
4. 解封 Vault
初始化后,Vault 会进入封锁状态(sealed)。要解封 Vault,你需要提供至少 3 个 unseal keys。
kubectl exec -it vault-0 -n vault -- vault operator unseal <unseal_key_1>
kubectl exec -it vault-0 -n vault -- vault operator unseal <unseal_key_2>
kubectl exec -it vault-0 -n vault -- vault operator unseal <unseal_key_3>
5. 验证 Vault 是否可用
你可以通过 Vault 的 UI 或 CLI 访问 Vault。Vault 默认的 UI 地址是 http://<vault_pod_ip>:8200
。
也可以通过 CLI 验证 Vault 状态:
kubectl exec -it vault-0 -n vault -- vault status
三、Vault 核心功能和配置
1. 存储引擎(Secrets Engines)
Vault 提供了多种存储引擎来管理敏感数据。最常用的存储引擎是 KV 引擎,适用于存储简单的键值对。
创建 KV 存储引擎
vault secrets enable -path=secret kv
存储数据
vault kv put secret/my-secret username="admin" password="secret_password"
读取数据
vault kv get secret/my-secret
2. 动态凭证
Vault 支持 动态凭证,即可以根据需要动态生成数据库、AWS、GCP 等的凭证。举个例子,Vault 可以为数据库动态生成临时的用户名和密码,而这些凭证具有过期时间,自动失效,从而提升安全性。
启用数据库引擎
vault secrets enable database
配置 MySQL 数据库引擎
vault write database/config/my-mysql-database
plugin_name=mysql-database-plugin
allowed_roles="readonly"
connection_url="mysql://{{username}}:{{password}}@tcp(127.0.0.1:3306)/"
创建角色并生成动态凭证
vault write database/roles/readonly
db_name=my-mysql-database
creation_statements="GRANT SELECT ON *.* TO '{{name}}'@'%' IDENTIFIED BY '{{password}}'"
default_ttl="1h"
max_ttl="24h"
动态凭证可以用于访问数据库或其他系统,且不需要手动管理。
3. 加密与解密(Transit Engine)
Vault 提供 Transit Engine 来加密和解密数据,支持 对称加密 和 非对称加密。
启用加密引擎
vault secrets enable transit
创建加密密钥
vault write -f transit/keys/my-encryption-key
加密数据
vault write transit/encrypt/my-encryption-key plaintext=$(echo -n "sensitive-data" | base64)
解密数据
vault write transit/decrypt/my-encryption-key ciphertext=<ciphertext>
4. 身份和访问管理(IAM)
Vault 提供了强大的身份认证和访问控制功能,通过 Policy、Roles 和 Access Control Lists (ACLs) 来管理用户对密钥和数据的访问。
创建访问策略
path "secret/data/*" {
capabilities = ["create", "read", "update"]
}
启用 Kubernetes 认证
vault auth enable kubernetes
创建 Kubernetes 服务账户角色并允许访问 Vault:
vault write auth/kubernetes/config
kubernetes_host=<k8s_api_url>
kubernetes_ca_cert=@/path/to/ca.crt
四、Vault 高可用性配置与性能优化
1. 高可用性部署
Vault 的高可用性部署通常使用 Consul 作为存储后端,并通过 Raft 协议 实现主备节点之间的同步。
启用 Consul 后端
vault server -dev -config-file=config.hcl
在生产环境中,我们可以配置多个 Vault 节点,并通过 Raft 协议来保证一致性和容错。
2. 性能优化

原文始发于微信公众号(背带裤的云原生):在 Kubernetes 中使用 HashiCorp Vault 实现敏感数据管理与密钥加密
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/309848.html