HashCorpVault

此产品为配合dapr作为项目中秘钥数据存储使用

官方教程地址:https://developer.hashicorp.com/vault/tutorials/getting-started

官方文档地址:https://www.vaultproject.io/docs/what-is-vault

介绍

Vault 带有各种称为秘密引擎身份验证方法的可插入组件,允许您与外部系统集成。这些组件的目的是管理和保护您在动态基础设施中的秘密(例如数据库凭证、密码、API 密钥)。

应用服务常常需要存取各种各样的机密信息,比如,数据库的访问凭证,依赖的外部服务的TokenKey,服务之间的通信凭证等等。在每个这样的应用中都重复实现机密信息的存取、更新与吊销等管理操作相当繁重,而且容易出问题。HashiCorp公司的开源项目Vault就将这部分工作以独立服务方式来实现,需要机密信息操作的应用可以与Vault服务交互完成相应的操作。

Vault的应用场景非常广泛,如:

Vault架构非常清晰,如下图所示,主要分为三部分:

img

 

Vault服务部署启动后,处于”密封(sealed)”状态,此时不能提供服务。在该服务能接受请求前,需要初始化和”解封(unseal)”两个步骤。 Vault初始化时内部会生成一个加密密钥(Encryption Key), 这个密钥用于加密数据,对外是不可见的。Vault会再生成一个Master key来加密Encryption Key来保护它。Vault会使用Shamir密钥分享算法MasterKey分割成若干份KeyShares,而根据其中的若干份KeyShares可以计算出原来的MasterKey。默认配置的KeyShares5,还原所需要的份数为3。我们需要记录好所生成的KeyShares, Vault自身并不保存MasterKey。当我们忘记KeyShares后,我们就无法得到MasterKey, 从而数据也无法解密。

img

解封(Unseal)过程就是使用若干份KeyShares计算得到MasterKey, 解封之后,Vault就可以通过HTTP API对外提供服务了。

Vault接收到请求后需要先校验身份请求者身份信息,有多种Auth method可以选择,比如用户名/密码、Github帐号等等。支持的方法可以参考官方文档。身份校验通过后,Vault会根据身份所关联的策略检查该资源请求是否合法。root策略是内置的策略,它允许访问任何资源。Vault管理用户可以创建更细粒度的资源访问控制策略。除非在策略中明确允许访问某种资源,否则Vault会禁止访问。更深入了解策略可以参考官方文档

身份校验和策略检测都通过后,Vault会给该客户端分配一个Token。后续的请求都需要携带该token,类似于WEB访问的cookie机制。在Vault中,URL路径会关联一个Secrets Engine。Vault的路由组件会将特定的URL请求路由所关联的Secrets Engine来处理。

 

引擎 (Engines)

引擎概念:引擎就是存储、加密、解密数据的组件。

简单的引擎组件 kv引擎 不涉及加密解密,只是简单的存储和读取

`transit 引擎 加密存储数据,读取时解密

支持的引擎类型:

  • AWS
  • Consul
  • Cubbyhole
  • Database(多种)
  • Identity
  • Key/Value
  • Nomad
  • PKI
  • RabbitMQ
  • SSH
  • TOTP
  • Transit

 

Secret 类型

  1. Key-Value:

    简单的静态键值对,仅有版本化或非版本化区别,无过期概念

  2. 动态生成的凭据:

    由Vault根据客户端请求生成

  3. 加密密钥:

    用于使用客户端数据执行加密功能

    这个类型的秘密引擎处理加密,解密,签名等加密功能。所有这些操作都使用Vault内部生成和存储的加密密钥。除非明确告知,否则Vault将永远不会公开给定的加密密钥

    目前只有Transit引擎 支持,

 

 

策略

可设置策略,指定某个秘钥的权限

设置方式:

  1. 设置某个路径的权限策略
  2. 依据策略创建token
  3. 依据token访问数据

 

docker 安装--本地开发使用

创建文件夹 vaultcli 文件夹

创建 docker-compose.yaml 文件

创建config.hcl配置文件

Vault解密脚本.bat 此脚本在每次重启后进行解密使用

vault-UnsealKeys.txt 此内容为Vault解密Key需要将key复制到此文件中

docker-compose.yaml 文件

config.hcl 文件

将显示保管库的日志:

导出 VAULT_ADDR='http://0.0.0.0: 8200 '

根令牌:75de9b20-16fa-5a1e-2e9a-39c86caef504

需要上面的 2 条数据来导出根令牌和主机地址:

可访问的Url

web可视化界面 > http://127.0.0.1:8200

查看Vault状态地址 > http://127.0.0.1:8200/v1/sys/seal-status

 

vault常用命令

 

K8s安装


 

1.创建文件夹,拉取仓库

 

2.创建配置文件

创建 custom-values.yaml 配置文件

官方配置参数介绍:

https://www.vaultproject.io/docs/platform/k8s/helm/configuration#externalvaultaddr

官方安装配置:

https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-raft-deployment-guide?in=vault%2Fkubernetes#kubernetes-raft-deployment-guide

修改配置文件中的数据库地址

storage "mysql" { address = "192.165.10.102:3306" # 修改此处的数据库连接地址 username = "root" # 用户名 password = "sa123" # 密码 database = "vault" # 数据库名称 ha_enabled = "true"

 

注意:当服务器重启或服务重启,需要重新解密pod,否则无法使用

 

3.安装与初始化

4.创建引擎

 

image-20220720185034210

image-20220720185129313

 

5.创建数据

image-20220720191343383

 

创建的数据,需要根据需要的配置更改

6 .增加解封脚本

增加两个文件

unsealSH.sh 解封脚本

vault-UnsealKeys.txt 解封秘钥存储文件

执行文件命令

 

 

Dapr增加秘钥设置

创建秘钥管理文件

秘钥管理配置官方文档:

https://docs.dapr.io/reference/components-reference/supported-secret-stores/hashicorp-vault/

修改自定义秘钥管理地址和token

  • name: vaultAddr value: http://127.0.0.1:8200 #修改为vault地址
  • name: vaultToken value : "hvs.n9lOGM7LQXo8JtBogY64RXjA" #vault生成的token

 

修改redis-storage-class.yaml 配置 从vault读取

 

修改redis-pubsub.yaml配置 从vault读取