1. 概述
随着分布式应用程序的不断增加,如何保护敏感数据成为一项重要的任务,而 Vault 是一个很好的解决方案。Vault 是一个 Go 语言编写的开源工具,提供了对秘密、密码和其他机密数据的中心化管理。在本文中,我们将了解如何使用 GoLang 和 Vault 构建高安全性的分布式应用程序。
2. 什么是Vault?
Vault 是一个令牌制、基于 HTTP 的 API、安全性高的服务。它用于加密、签名和保护敏感数据,例如 API 密钥、密码、证书和其他机密。Vault 可以轻松分配管理所有的机密,同时支持强制执行安全策略,允许您控制哪些人可以访问哪些机密。Vault 可以作为单独的应用程序运行或作为一个库集成到其他应用程序中。
3. 安装和配置Vault
3.1 安装Vault
首先,您需要从Vault 的官方网站上下载令牌。您还需要安装 unzip 工具,以便解压缩这个文件。
wget https://releases.hashicorp.com/vault/1.8.1/vault_1.8.1_linux_amd64.zip
sudo apt-get install unzip
下载好后,您需要将 vault 解压并将其移动到您的 PATH 目录中。
unzip vault_1.8.1_linux_amd64.zip
sudo mv vault /usr/local/bin/vault
3.2 配置Vault
Vault 是一个可通过 HTTP API 访问的服务器,因此,在进行任何操作之前,您需要先启动 Vault 服务器。
vault server -dev
启动Vault后,我们需要设置存储后端,Vault 有很多种存储后端,如 Consul、Etcd、DynamoDB、Redis 等等,您可以在官方文档中了解更多的存储后端。这里我们将使用内存存储后端。
vault secrets enable -path=secret/ kv-v2
我们在这里创建了一个名称为“secret”的密钥空间并启用了 kv v2 存储后端。
4. 创建GoLang应用程序
现在,我们已经安装并配置了Vault,接下来我们将创建一个简单的 GoLang 应用程序来与Vault进行交互。
4.1 安装Vault Go SDK
现在我们需要安装Vault Go SDK以在我们的Go应用程序中使用Vault API,您可以在官方网站上查看Vault Go SDK并下载它。您也可以使用命令行:
go get github.com/hashicorp/vault/api
4.2 配置Vault客户端
在我们的 Go 应用程序中,我们需要配置 Vault 客户端以连接Vault服务器。您可以在以下代码中更改值以根据 Vault 安装和配置更改:
package main
import (
"fmt"
"log"
"github.com/hashicorp/vault/api"
)
func main() {
url := "http://127.0.0.1:8200"
token := "dev-root-token"
secretsPath := "secret/data/username"
authToken := &api.Secret{
Token: token,
}
client, err := api.NewClient(&api.Config{
Address: url,
})
if err != nil {
log.Fatalf("Failed to create Vault client: %v\n", err)
}
client.SetToken(token)
secret, err := client.Logical().ReadWithData(secretsPath, map[string]interface{}{
"metadata": map[string]string{
"key": "value",
},
})
if err != nil {
log.Fatalf("Failed to read secret from Vault: %v\n", err)
}
fmt.Println(secret.Data)
}
5. 在Go应用程序中使用Vault
现在,我们已经安装了Vault Go SDK 和设置了 Vault 客户端,我们将在我们的 Go 应用程序中使用 Vault 读取机密。在这个例子中,我们假设我们有一个名称为“username”的机密,它可能是一个密码或一个 API 密钥。
5.1 获取Vault访问令牌
要从Vault读取机密,您需要向其提供访问令牌。有两种方法可以获取 Vault 访问令牌:静态令牌和动态令牌。静态令牌是在 Vault 配置文件中硬编码并由 Vault 使用的令牌。动态令牌是通过向Vault服务器发出请求并使用访问策略生成的。在这个例子中,我们将使用静态令牌。
token := "dev-root-token"
5.2 设置Vault客户端
接下来,我们需要配置 Vault 客户端以连接到我们在先前步骤中设置的 Vault 服务器。在以下代码中,我们设置 Vault API 地址并强制设置 Vault 客户端方案的 TLS 证书。
url := "http://127.0.0.1:8200"
client, err := api.NewClient(&api.Config{
Address: url,
})
if err != nil {
log.Fatalf("Failed to create Vault client: %v\n", err)
}
client.SetToken(token)
5.3 读取Vault机密
现在,我们已经设置了 Vault 客户端,让我们从 Vault 读取机密数据。在下面的代码中,我们指定机密数据所在的路径,并使用 Vault 用户的元数据来扩展机密存储。您可以根据需求在元数据中指定任意键和值。
secretsPath := "secret/data/username"
secret, err := client.Logical().ReadWithData(secretsPath, map[string]interface{}{
"metadata": map[string]string{
"key": "value",
},
})
if err != nil {
log.Fatalf("Failed to read secret from Vault: %v\n", err)
}
fmt.Println(secret.Data)
6. 结论
通过本文,我们了解了Vault是什么,以及如何使用 Go 和 Vault 构建分布式应用程序,其中Vault是用于管理敏感数据的中心化管理器。
我们首先了解了如何安装和配置 Vault,这是在我们的 Go 应用程序中使用 Vault 的第一步。然后我们创建了一个基本的 Go 应用程序,使用Vault Go SDK访问 Vault 客户端,并从 Vault 服务器读取敏感数据。 您可以通过学习其他 Vault 功能进一步增强该应用程序以提供更高的安全性。