Vault 介绍及安装配置
环境信息
- Kubernetes 1.24
- Vault 1.14.0
Vault 简介
Vault 架构及基础概念
Vault 的架构图如下 [1]
从以上架构图可以看到,几乎所有的 Vault 组件都被统称为 Barrier (屏障)
Vault 架构可以大体分为三个部分: [7]
Sotrage Backend- 存储后端Barrier- 屏障层HTTPS API- API 接口
常用概念
Storage Backend - Vault 自身不存储数据,因此需要一个存储后端( Storage Backend ),存储后端对 Vault 来说是不受信任的,只用来存储加密数据。 [8]
Initialization - Vault 在首次启动时需要初始化( Initialization ),这一步会生成一个 Master Key (加密密钥)用于加密数据,只有加密完成的数据才能保存到 Storage Backend
Unseal - Vault 启动后,因为不知道 Master Key (加密密钥)所以无法解密数据(可以访问 Storage Backend 上的数据),这种状态被称为 Sealed (已封印),在能解封( Unseal )数据之前,Vault 无法进行任何操作。 Unseal 是获取 Master Key 明文的过程,通过 Master Key 可以解密 Encryption Key 从而可以解密存储的数据 [6]
Master Key - Encryption Key (用来加密存储的数据,加密密钥和加密数据被一同存储) 是被 Master Key (主密钥) 保护(加密),必须提供 Master Key ,Vault 才能解密出 Encryption Key ,从而完成数据解密操作。 Master Key 与其他 Vault 数据被存放在一起,但使用另一种机制进行加密: 解封密钥 ,解封密钥默认使用 沙米尔密钥分割算法 生成 Key Shares [9]
Key Shares - 默认情况下,Vault 使用 沙米尔密钥分割算法 将 Master Key 的解封密钥分割成五个 Key Shares (分割密钥),必须要提供其中任意的三个 Key Shares 才能重建 Master Key ,以完成 Unseal (解封)操作
Key Shares(分割密钥)的总数,以及重建Master Key(主密钥)最少需要的分割密钥数量,都是可以调整的。 沙米尔密钥分割算法 也可以关闭,这样主密钥将被直接提供给管理员,管理员可直接使用它进行解封操作。
认证系统及权限系统处理流程
在解密出 Encryption Key 后,Vault 就可以处理客户端请求了。 HTTPS API 请求进入后的整个流程都由 Vault Core 管理, Core 会强制进行 ACL 检查,并确保 Audit logging (审计日志)完成记录。
客户端首次连接 Vault 时,需要首先完成身份认证,Vault 的 Auth Method 模块有很多的身份认证方法可选
- 用户友好的认证方法,适合管理员使用,包括:
user/password、云服务商、ldap等,在创建用户的时候,需要为用户绑定Policy,给予适合的权限 - 应用友好的方法,适合应用程序使用,包括:
public/private keys、token、kubernetes、jwt等
身份验证请求经 Core 转发给 Auth Method 进行认证, Auth Method 判定请求身份是否有效并返回关联的策略( ACL Policies )的列表。
ACL Policies 由 Policy Store 负责管理与存储, Core 负责进行 ACL 检查,ACl 的默认行为是 Deny ,意味着除非明确配置 ACL Policy 允许某项操作,否则该操作将被拒绝。
在通过 Auth Method 进行认证,并返回了没有问题的 ACL Policies 后, Token Store 会生成并管理一个新的 Token ,这个 凭证 会返回给客户端,用于客户端后续请求的身份信息。 Token 都存在一个 lease (租期)。 Token 关联了相关的 ACL Policies ,这些策略将被用于验证请求的权限。
请求经过验证后,将被路由到 Secret Engine ,如果 Secret Engine 返回了一个 secret , Core 将其注册到 Expiration Manager ,并给它附件一个 Lease ID , Lease ID 被客户端用于更新( renew )或者吊销( revoke )它得到的 secret 。如果客户端允许租约( lease ) 到期, Expiration Manager 将自动吊销( revoke ) 这个 secret
Secret Engine
Secret Engine 是保存、生成或者加密数据的组件,非常灵活。有的 Secret Engin 只是单纯的存储与读取数据,比如 kv (键值存储)就可以看作一个加密的 Redis。而其他的 Secret Engine 则可能连接到其他的服务并按需生成动态凭证等。
Kubernetes 中安装 Vault
官方建议使用 Helm Chart 在 Kubernetes 安装 Vault [2]
安装 Vault
添加
Hashicorp的 Helm 仓库并检查hashicorp/vault的 Charthelm repo add hashicorp https://helm.releases.hashicorp.com
"hashicorp" has been added to your repositories
helm search repo hashicorp/vault
NAME CHART VERSION APP VERSION DESCRIPTION
hashicorp/vault 0.24.0 1.13.1 Official HashiCorp Vault Chart
helm search repo hashicorp/vault -l
NAME CHART VERSION APP VERSION DESCRIPTION
hashicorp/vault 0.25.0 1.14.0 Official HashiCorp Vault Chart
hashicorp/vault 0.24.1 1.13.1 Official HashiCorp Vault Chart
hashicorp/vault 0.24.0 1.13.1 Official HashiCorp Vault Chart
hashicorp/vault 0.23.0 1.12.1 Official HashiCorp Vault Chart
hashicorp/vault 0.22.1 1.12.0 Official HashiCorp Vault Chart
hashicorp/vault 0.22.0 1.11.3 Official HashiCorp Vault Chart安装 Vault
安装最新版本的 Vault。Vault 安装是有几种模式,分别对应不同的使用场景
Dev mode- Helm Chart 将会运行一个 Vault Server ,Storage Backend会使用 Memeory,仅用于学习环境 [3]Standalone mode- Helm Chart 默认运行的模式,将会安装一个 Vault Server,使用文件存储后端。HA mode- Helm Chart 将会安装 3 个 Vault Servers ,使用已有的 Consul Storage Backend,建议 Consul 也使用 Consul Helm Chart 安装。 [4]
以下命令安装 Vault,默认安装为最新版本,使用
Standalone模式。helm install vault hashicorp/vault
安装指定版本的 Vault
helm install vault hashicorp/vault --version 0.24.0
以下命令安装 Vault,默认安装为最新版本,使用
Dev模式。helm install vault hashicorp/vault \
--set "server.dev.enabled=true"
初始化 Vault
Vault Helm Chart 安装了 Standalone 或者 HA 模式后,需要进行初始化操作,初始化操作会产生 Share Keys 、 Master Key 、 Encryption Key 。
kubectl exec -it vault-0 -- vault operator init |
初始化命令会产生 Share Keys 和 Root Token ,默认至少使用 3 个 Share Keys 才能恢复 Master Key
使用 3 个 Share Keys (默认的阈值为 3 个 Share Keys 恢复 Master Key ) 对 Vault Server 进行解封操作( Unseal )
kubectl exec -ti vault-0 -- vault operator unseal |
Sealed 状态为 false 时,表示解封完成,Vault 即可开始处理请求。
配置 UI 访问
使用 Vault Helm Chart 部署后,会自动创建针对 UI (端口 8200) 的 Service
apiVersion: v1 |
要 Kubernetes 集群外部访问 UI,只需要配置对应的 Ingress Nginx 即可
apiVersion: networking.k8s.io/v1 |
配置之后,访问 UI 域名,即可打开 Vault UI,使用初始化时生产的 Master Key 即可登陆 UI (登陆 Method 选择 Token )
Vault 管理
查看 Vault 状态
vault status 命令可以查看 Vault 状态
vault status |
vault status 命令输出显示,当前 Vault 已完成初始化,并处于 Unsealed 解封状态 Sealed false ,Seal 使用的是 Shamir 密钥分割算法,需要提供 5 条 Share Keys 中的 3 条才能解封出 Master Key。Storage Backend 使用 file 类型。 [6]
secrets 管理
启用 secrets
启用 transit 引擎 [11]
vault secrets enable transit |
Vault 模拟了一个文件系统,各个 Secret Engine 启用后默认被挂载到 Secret Engine 名称路径下,以上示例启用 transit 加密引擎后,默认挂载点是 transit/ [11]
同一个 Secret Engine 可以被挂载到不同的路径,每个路径下的数据都彼此独立。
列出启用的 Secret Engine
以下命令列出系统上已经启用的 Secret Engine 及信息(挂载路径、类型等)
vault secrets list |
创建密钥
vault write -f transit/keys/orders |
Vault 服务配置说明
除非使用 dev 模式运行,否则 Vault 服务使用配置文件进行配置,配置文件使用 HCL 或者 JSON 格式。 [10]
在 Kubernetes 上使用 Standalone 模式运行, Storage Backend 使用 file 的 Vault 服务默认配置文件如下
disable_mlock = true |
常见错误
pod has unbound immediate PersistentVolumeClaims
使用 Vault Helm Chart 部署 Vault 后,Pod 状态为 Pending
kubectl get pods -o wide |
检查 Pod 的相信描述信息, Pending 的原因为没有绑定到合适的 PV: 0/5 nodes are available: 5 pod has unbound immediate PersistentVolumeClaims
$ kubectl describe pod vault-0 |
检查 Vault 的 Pod 的 StatefuleSet 配置信息,可以看到其需要一个 PV。根据 PVC 的需求创建 PV 后,Pod 状态变为 Running
kubectl edit statefulsets vault |
参考链接
脚注
- 1.Vault High-Level Overview ↩
- 2.Installing Vault ↩
- 3.Dev mode ↩
- 4.HA mode ↩
- 5.Initialize and unseal Vault ↩
- 6.Vault 中文手册 ↩
- 7.Vault的架构 ↩
- 8.基本概念 ↩
- 9.封印与解封 ↩
- 10.Vault 配置文件 ↩
- 11.加密即服务 ↩