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

相关推荐
漏洞文库-Web安全8 小时前
【CTF】关于md5总结
安全·web安全·网络安全·ctf·md5
漏洞文库-Web安全9 小时前
【CTF】buuctf web 详解(持续更新)
安全·web安全·网络安全·ctf·buuctf
cdprinter18 小时前
信刻物理隔离网络安全光盘摆渡一体机
安全·自动化
空白诗21 小时前
mdcat 在 HarmonyOS 上的构建与适配
后端·安全·华为·rust·harmonyos
红树林071 天前
渗透测试之sql注入--报错注入
数据库·sql·安全·web安全
Xudde.1 天前
Quick2靶机渗透
笔记·学习·安全·web安全·php
岁岁的O泡奶1 天前
DVWA_Vulnerability: Command Injection
经验分享·安全·web安全
羑悻的小杀马特1 天前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
我不是QI1 天前
周志华《机器学习—西瓜书》二
人工智能·安全·机器学习
简道云平台1 天前
缺货预警到底怎么做?终于有人把“安全库存”这件事讲清楚了
安全