1. 介绍
随着云计算和 DevOps 的普及,密钥管理变成了一个重要的话题。 管理无数密钥手动费时乏效,而且容易出错。此外,为了防止密钥泄露,还需要将密钥存储在一个安全环境中。Vault 是 HashiCorp 公司开源的一个工具,它提供了一种安全的方式来管理和保护应用程序和服务的数据。
2. Golang和Vault
Vault 的 API 使用了标准的 RESTful 风格,它的代码库可以通过 REST API 访问。 Golang 是一种适合于 RESTful API 编写的编程语言。因此,Vault 与 Golang 结合使用是非常自然的。
3. 基于Vault的密钥管理
3.1 安装Vault
首先,在 Linux 系统上下载 Vault 软件包并解压缩:
wget https://releases.hashicorp.com/vault/1.4.1/vault_1.4.1_linux_amd64.zip
unzip vault_1.4.1_linux_amd64.zip
接下来,在 PATH 环境变量中添加 vault 的安装目录:
export PATH=$PATH:/path/to/vault
最后,启动 Vault 服务器:
vault server -dev
在开发模式下,Vault 服务器会启动并使用一个加密密钥进行加密,这种模式不适用于生产环境,生产环境中需要加入其他企业级功能,例如 SSL、身份验证等。
3.2 向Vault写入数据
写入数据到 Vault 的操作称为“写入秘密”,可以使用 Vault 的 REST API 或者 Vault 客户端工具(CLI)来执行。
在本示例中使用 CLI 写入秘密:
vault kv put secret/myapp/config username="myuser" password="mypassword"
这里将一个配置项(配置项名为 username,配置项密码为 password)保存在仓库 secret/myapp/config 中。此外,也可以使用 REST API 实现这个过程:
curl --header "X-Vault-Token: $VAULT_TOKEN" \
--request POST \
--data '{"username":"myuser", "password":"mypassword"}' \
http://localhost:8200/v1/secret/data/myapp/config?version=2
需要注意使用 token 验证身份,以便访问 Vault。 在执行此步骤前需要在环境变量中设置VAULT_TOKEN,或者使用 -H 参数指定 token。
3.3 从Vault读取数据
读取 Vault 中数据,同样可以使用 CLI 或者 REST API。接下来使用 CLI 读取示例中的数据:
vault kv get secret/myapp/config
结果是:
====== Metadata ======
Key Value
--- -----
created_time 2022-11-04T03:30:40.290926516Z
deletion_time n/a
destroyed false
version 1
====== Data ======
Key Value
--- -----
password mypassword
username myuser
可以看到 Vault 返回了配置值(包括返回时间和版本号)。
REST API 也可以使用获取数据:
curl --header "X-Vault-Token: $VAULT_TOKEN" \
--request GET \
http://localhost:8200/v1/secret/data/myapp/config
注意:REST API 请求中也要使用 token 以便验证身份。
3.4 使用Golang访问Vault
在 Go 语言中使用 Vault 客户端需要先安装 HashiCorp 公司开源的 Vault SDK:
go get github.com/hashicorp/vault/api
以下代码显示如何在 Golang 中读取示例中的数据:
package main
import (
"fmt"
"github.com/hashicorp/vault/api"
)
func main() {
client, err := api.NewClient(&api.Config{Address: "http://127.0.0.1:8200"})
if err != nil {
panic(err)
}
client.SetToken("mytoken")
secret, err := client.Logical().Read("secret/myapp/config")
if err != nil {
panic(err)
}
fmt.Println(secret.Data)
}
这里的 mytoken 是 Vault 中用于身份验证的 token。
4. 结论
Vault 提供了一个安全的,可扩展的方式来存储和管理数据,同时 Golang 作为一种适用于 RESTful API 编写的编程语言,自然地与 Vault 结合。此外,Vault 提供了现成的 SDK(例如 HashiCorp 公司开源的 Vault SDK)方便 Golang 开发者的使用。因此, Golang 和 Vault 的集成只会越来越广泛。