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

相关推荐
winkel_wang11 小时前
身份管理与安全 (Protect identities)
windows·安全
司徒轩宇13 小时前
Python secrets模块:安全随机数生成的最佳实践
运维·python·安全
会飞的鱼_12313 小时前
CentOS 7服务器初始化全攻略:从基础配置到安全加固
服务器·安全·centos
YJlio15 小时前
第17章|PowerShell 安全警报——高分学习笔记(运维实战向)
笔记·学习·安全
wanhengidc16 小时前
云手机会占用本地手机内存吗?
运维·服务器·网络·安全·智能手机
zzz1006621 小时前
CentOS 7 服务器初始化:从 0 到 1 的安全高效配置指南
服务器·安全·centos
绿算技术1 天前
绿算技术解密金融科技安全:高性能计算与存储驱动金融防火墙新时代
科技·安全·金融
m0_738120721 天前
CTFshow系列——命令执行web53-56
前端·安全·web安全·网络安全·ctfshow
WayneJoon.H1 天前
CTFSHOW | 其他篇题解(一)web396-web416
sql·安全·web安全·网络安全·php
cdprinter1 天前
安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!
网络·安全·web安全