Golang在安全领域中的应用:基于Vault的密钥管理

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 的集成只会越来越广泛。

后端开发标签