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中文网

相关推荐
网安小白的进阶之路5 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-2
网络·安全·web安全·系统安全·交换机
安全系统学习5 小时前
网络安全之RCE分析与利用详情
服务器·网络·安全·web安全·系统安全
武汉唯众智创5 小时前
网络安全实训室建设方案全攻略
网络·安全·web安全·网络安全·网络安全实训室·网络安全实验室
weixin_472339465 小时前
网络安全攻防:文件上传漏洞的深度解析与防御实践
安全·web安全
雪兽软件5 小时前
2025 年网络安全与人工智能发展趋势
人工智能·安全·web安全
小黄人20256 小时前
自动驾驶安全技术的演进与NVIDIA的创新实践
人工智能·安全·自动驾驶
CS创新实验室7 小时前
筑牢 AIGC 安全防线:警惕提示词注入攻击
安全·大模型·aigc·提示词·提示词注入
宝山哥哥8 小时前
网络信息安全学习笔记1----------网络信息安全概述
网络·笔记·学习·安全·网络安全
电池保护板测试仪厂家9 小时前
电池充放电容量检测:守护电动出行设备动力核心的安全防线
科技·安全·能源·制造·零售·交通物流
深盾科技11 小时前
.NET 安全之 JIT 保护技术深度解析
安全·.net