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.加密即服务 ↩