Vault实战(二)-Vault开发

1 依赖包

复制代码
package main

import (
    "github.com/hashicorp/vault/api"
)

2 vault go-client

复制代码
var addr string = http://127.0.0.1:8200

//初始化client
func NewVaultClient() (*api.Client, error) {
    config := &api.Config{
        Address: addr,
    }

    return api.NewClient(config)
}

3 设置Vault地址和令牌

复制代码
client.SetAddress("http://127.0.0.1:8200")
client.SetToken("TOKEN")

4 身份验证

复制代码
func ValidateUser(username,pwd string) error {
    // 进行身份验证
    _, err = client.Logical().Write("auth/userpass/login/<USERNAME>", map[string]interface{}{
        "password": "<PASSWORD>",
    })
    if err != nil {
        fmt.Println("Failed to authenticate:", err)
        return err 
    }

    fmt.Println("Authentication successful!")
    return nil 
}

5 设置密码

复制代码
func StorePassword(path, key,password string) error {
    data := map[string]interface{}{
        key: password,
    }

    _, err := client.Logical().Write("secret/data/" + path, data) // 将密码存储到Vault中
    if err != nil {
        return err
    }

    return nil
}

6 获取密码信息

复制代码
//获取密码信息
func getDatabasePassword() (string, error) {
    client, err := getVaultClient()
    if err != nil {
        return "", err
    }

    secret, err := client.Logical().Read("secret/data/database")
    if err != nil {
        return "", err
    }

    password := secret.Data["password"].(string)
    return password, nil
}

7 登录并获取访问令牌

复制代码
func GetVaultToken(client *api.Client) (string, error) {
    options := map[string]interface{}{
        "role_id":   os.Getenv("VAULT_ROLE_ID"),
        "secret_id": os.Getenv("VAULT_SECRET_ID"),
    }

    response, err := client.Logical().Write("auth/approle/login", options)
    if err != nil {
        return "", err
    }

    token, ok := response.Auth.ClientToken
    if !ok {
        return "", errors.New("failed to retrieve token from Vault")
    }

    return token, nil
}

8 使用访问令牌

复制代码
func GetSecretFromVault(client *api.Client, secretPath string) (string, error) {
    secret, err := client.Logical().Read(secretPath)
    if err != nil {
        return "", err
    }
    if secret == nil {
        return "", errors.New("secret not found")
    }
    data, ok := secret.Data["data"].(map[string]interface{})
    if !ok {
        return "", errors.New("invalid secret format")
    }

    key, ok := data["key"].(string)
    if !ok {
        return "", errors.New("key not found in secret")
    }   

    return key, nil
}

9 加密与解密

复制代码
    // 加密数据
    secret, err := client.Logical().Write("transit/encrypt/my-key", map[string]interface{}{
        "plaintext": "Hello, World!",
    })
    if err != nil {
        fmt.Println("Failed to encrypt data:", err)
        os.Exit(1)
    }

    // 解密数据
    plaintext, err := client.Logical().Write("transit/decrypt/my-key", map[string]interface{}{
        "ciphertext": secret.Data["ciphertext"].(string),
    })
    if err != nil {
        fmt.Println("Failed to decrypt data:", err)
        os.Exit(1)
    }

10 动态凭证管理

复制代码
    // 创建动态凭证
    secret, err := client.Logical().Write("database/creds/my-role", nil)
    if err != nil {
        fmt.Println("Failed to create dynamic credential:", err)
        os.Exit(1)
    }

    // 使用凭证连接数据库
    fmt.Println("Connecting to database with dynamic credential:", secret.Data["username"].(string), secret.Data["password"].(string))

参考文档:文章搜索_php中文网

相关推荐
lubiii_1 天前
网络安全渗透测试第一步信息收集
安全·web安全·网络安全
你的人类朋友1 天前
🔒什么是HMAC
后端·安全·程序员
阿部多瑞 ABU1 天前
《基于国产Linux的机房终端安全重构方案》
linux·安全
小刘鸭地下城1 天前
内容安全策略(CSP)深度指南:从基础配置到高级防护
安全
内心如初1 天前
应急响应事件处理(网络安全体系架构与应急响应的前置知识)
安全·web安全
Teamhelper_AR1 天前
AR眼镜:化工安全生产的技术革命
安全·ar
zz-zjx1 天前
堡垒机安全架构:从零搭建企业级防护(单节点版)
安全·ssh·安全架构
纪元A梦2 天前
Redis最佳实践——安全与稳定性保障之高可用架构详解
redis·安全·架构
一枚前端小能手2 天前
🛡️ Token莫名其妙就泄露了?JWT安全陷阱防不胜防
前端·javascript·安全
lypzcgf2 天前
Coze源码分析-资源库-创建知识库-基础设施/存储/安全
安全·go·coze·coze源码分析·智能体平台·ai应用平台·agent开发平台