golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用

Golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用

Vaku简介

Vaku Logo

Vaku是一个CLI和API工具,用于在Vault Key/Value秘密引擎上执行路径和文件夹操作。Vaku扩展了现有的Vault CLI和API功能,允许您对文件夹执行相同的基于路径的列表/读取/写入/删除操作。Vaku还允许您搜索、复制和移动秘密和文件夹。

安装方法

Homebrew安装

brew install lingrino/tap/vaku

Scoop安装

scoop bucket add vaku https://github.com/lingrino/scoop-vaku.git
scoop install vaku

Docker安装

docker run ghcr.io/lingrino/vaku --help

二进制安装

从发布页面下载适合您操作系统/架构的最新二进制文件或deb/rpm包。

使用示例

CLI使用

Vaku CLI文档可以通过命令行使用vaku help [cmd]vaku [cmd] --help查看。

API使用

以下是使用Vaku API的Golang示例代码:

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/hashicorp/vault/api"
	"github.com/lingrino/vaku/v2/api"
)

func main() {
	// 创建标准Vault客户端
	vaultClient, err := api.NewClient(api.DefaultConfig())
	if err != nil {
		log.Fatal(err)
	}

	// 创建Vaku客户端
	vakuClient := vaku.NewClient()
	vakuClient.Client = vaultClient

	// 示例1: 列出文件夹中的所有路径
	ctx := context.Background()
	paths, err := vakuClient.PathList(ctx, "secret/data/path/to/folder")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Paths in folder: %v\n", paths)

	// 示例2: 读取文件夹中的所有秘密
	secrets, err := vakuClient.FolderRead(ctx, "secret/data/path/to/folder")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Secrets in folder: %v\n", secrets)

	// 示例3: 复制文件夹
	err = vakuClient.FolderCopy(ctx, "secret/data/source/folder", "secret/data/dest/folder")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Folder copied successfully")
}

测试

Vaku有完善的测试,仅使用标准的Go测试工具:

$ go test -cover -race ./...
ok  github.com/lingrino/vaku/v2      0.095s coverage: 100.0% of statements
ok  github.com/lingrino/vaku/v2/api 12.065s coverage: 100.0% of statements
ok  github.com/lingrino/vaku/v2/cmd  0.168s coverage: 100.0% of statements

贡献

欢迎任何形式的建议和贡献!如果您希望在Vaku中看到某些功能,请提交Issue或Pull Request。

Vaku提供了强大的文件夹操作功能,扩展了标准Vault CLI/API的能力,使秘密管理更加高效和灵活。


更多关于golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Vault文件夹操作功能的CLI和API插件库vaku的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用vaku实现Vault文件夹操作的Golang CLI和API插件库

vaku是一个用于HashiCorp Vault的Golang库,专门用于处理Vault中的文件夹操作。它提供了一套简洁的API来执行批量操作,如复制、移动、删除文件夹等。

安装vaku

go get github.com/lingrino/vaku/v2

基本使用示例

1. 初始化vaku客户端

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/hashicorp/vault/api"
	"github.com/lingrino/vaku/v2"
)

func main() {
	// 创建标准Vault客户端
	vaultClient, err := api.NewClient(api.DefaultConfig())
	if err != nil {
		log.Fatal(err)
	}

	// 使用Vault客户端创建vaku客户端
	vakuClient := vaku.NewClient(vaultClient)

	// 设置上下文
	ctx := context.Background()

	// 现在可以使用vakuClient执行操作...
}

2. 文件夹操作示例

列出文件夹内容

func listFolder(vakuClient *vaku.Client, path string) {
	entries, err := vakuClient.PathList(ctx, path)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Contents of %s:\n", path)
	for _, entry := range entries {
		fmt.Println(entry)
	}
}

复制文件夹

func copyFolder(vakuClient *vaku.Client, src, dst string) {
	err := vakuClient.PathCopy(ctx, src, dst)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Successfully copied %s to %s\n", src, dst)
}

移动文件夹

func moveFolder(vakuClient *vaku.Client, src, dst string) {
	err := vakuClient.PathMove(ctx, src, dst)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Successfully moved %s to %s\n", src, dst)
}

删除文件夹

func deleteFolder(vakuClient *vaku.Client, path string) {
	err := vakuClient.PathDelete(ctx, path)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Successfully deleted %s\n", path)
}

3. 构建CLI工具

下面是一个简单的CLI工具示例,使用cobra库:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/hashicorp/vault/api"
	"github.com/lingrino/vaku/v2"
	"github.com/spf13/cobra"
)

var (
	vakuClient *vaku.Client
	ctx        = context.Background()
)

func main() {
	// 初始化Vault客户端
	vaultClient, err := api.NewClient(api.DefaultConfig())
	if err != nil {
		log.Fatal(err)
	}
	vakuClient = vaku.NewClient(vaultClient)

	var rootCmd = &cobra.Command{Use: "vakutool"}

	// 列出命令
	var listCmd = &cobra.Command{
		Use:   "list [path]",
		Short: "List contents of a Vault path",
		Args:  cobra.ExactArgs(1),
		Run: func(cmd *cobra.Command, args []string) {
			listFolder(args[0])
		},
	}

	// 复制命令
	var copyCmd = &cobra.Command{
		Use:   "copy [src] [dst]",
		Short: "Copy a Vault path",
		Args:  cobra.ExactArgs(2),
		Run: func(cmd *cobra.Command, args []string) {
			copyFolder(args[0], args[1])
		},
	}

	// 添加子命令
	rootCmd.AddCommand(listCmd, copyCmd)

	// 执行命令
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func listFolder(path string) {
	entries, err := vakuClient.PathList(ctx, path)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Contents of %s:\n", path)
	for _, entry := range entries {
		fmt.Println(entry)
	}
}

func copyFolder(src, dst string) {
	err := vakuClient.PathCopy(ctx, src, dst)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Successfully copied %s to %s\n", src, dst)
}

高级功能

1. 搜索功能

func searchSecrets(vakuClient *vaku.Client, rootPath, searchTerm string) {
	results, err := vakuClient.PathSearch(ctx, rootPath, searchTerm)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Search results for '%s':\n", searchTerm)
	for path, matches := range results {
		fmt.Printf("%s: %v\n", path, matches)
	}
}

2. 批量读取/写入

func readAllSecrets(vakuClient *vaku.Client, path string) map[string]map[string]interface{} {
	secrets, err := vakuClient.PathReadAll(ctx, path)
	if err != nil {
		log.Fatal(err)
	}
	return secrets
}

func writeAllSecrets(vakuClient *vaku.Client, path string, secrets map[string]map[string]interface{}) {
	err := vakuClient.PathWriteAll(ctx, path, secrets)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Successfully wrote secrets to %s\n", path)
}

错误处理

vaku提供了详细的错误信息,建议使用如下方式处理错误:

func safeFolderOperation(vakuClient *vaku.Client, path string) {
	err := vakuClient.PathDelete(ctx, path)
	if err != nil {
		switch err.(type) {
		case *vaku.ErrPathNotFound:
			fmt.Printf("Path %s not found\n", path)
		case *vaku.ErrPathNoPermission:
			fmt.Printf("No permission to access %s\n", path)
		default:
			log.Fatal(err)
		}
		return
	}
	fmt.Printf("Operation on %s succeeded\n", path)
}

总结

vaku库为Vault文件夹操作提供了强大的功能,包括:

  • 文件夹的CRUD操作
  • 批量操作
  • 搜索功能
  • 详细的错误处理

通过结合cobra等CLI库,可以快速构建强大的Vault管理工具。在实际使用中,请确保正确处理Vault认证和权限问题。

回到顶部