返回更新列表
新发布Sep 2, 2026

vault v2.1.0

用于机密管理、加密即服务和特权访问管理的工具

分享

Vault build ci vault enterprise


请注意:我们非常重视Vault的安全性和用户的信任。如果您认为发现了Vault的安全问题,请通过[email protected]联系我们进行负责任的披露


Vault Logo

Vault 是一款用于安全访问机密(secrets)的工具。机密是您希望严格控制访问权限的任何内容,例如 API 密钥、密码、证书等。Vault 为所有机密提供统一接口,同时提供严格的访问控制并记录详细的审计日志。

现代系统需要访问大量机密:数据库凭据、外部服务的 API 密钥、面向服务架构通信的凭据等。了解谁在访问哪些机密已经非常困难且具有平台特异性。而要在此基础上实现密钥轮换、安全存储和详细审计日志,几乎不可能通过自定义解决方案完成。这正是 Vault 的用武之地。

Vault 的主要特性包括:

  • 安全的机密存储:Vault 可以存储任意的键值对。Vault 在将数据写入持久存储之前会对其进行加密,因此仅仅访问原始存储并不足以获取您的机密。Vault 可以写入磁盘、Consul 等。

  • 动态机密:Vault 可以为某些系统(如 AWS 或 SQL 数据库)按需生成机密。例如,当应用程序需要访问 S3 存储桶时,它会向 Vault 请求凭据,Vault 会按需生成具有有效权限的 AWS 密钥对。创建这些动态机密后,Vault 还会在租约到期后自动撤销它们。

  • 数据加密:Vault 可以加密和解密数据,而无需存储数据。这允许安全团队定义加密参数,开发人员可以将加密数据存储在诸如 SQL 数据库之类的位置,而无需设计自己的加密方法。

  • 租约和续期:Vault 为每个机密关联一个租约。在租约结束时,Vault 会自动撤销该机密。客户端可以通过内置的续期 API 续期租约。

  • 撤销:Vault 内置了对机密撤销的支持。Vault 不仅可以撤销单个机密,还可以撤销整个机密树,例如特定用户读取的所有机密,或特定类型的所有机密。撤销有助于密钥轮换以及在发生入侵时锁定系统。

文档、入门指南和认证考试

文档可在 Vault 网站 上获取。

如果您是 Vault 新手并希望开始使用安全自动化,请查看我们在 HashiCorp 学习平台上的入门指南。还有其他指南可供继续学习。

有关如何在应用程序中使用不同编程语言与 Vault 交互的示例,请参阅 vault-examples 仓库。还提供了一个开箱即用的示例应用程序

通过认证考试来展示您的 Vault 知识。请访问认证页面了解考试信息,并在 HashiCorp 学习平台找到学习资料

开发 Vault

如果您希望参与 Vault 本身或其任何内置系统的开发,首先需要在您的机器上安装 Go

对于本地开发,首先确保正确安装 Go,包括设置 GOPATH,然后将 GOBIN 变量设置为 $GOPATH/bin。确保 $GOPATH/bin 在您的路径中,因为某些发行版可能捆绑了旧版本的构建工具。

接下来,克隆此仓库。Vault 使用 Go Modules,因此建议您将仓库克隆到 GOPATH 之外。然后,您可以通过引导环境来下载所需的构建工具:

$ make bootstrap
...

要编译 Vault 的开发版本,请运行 makemake dev。这会将 Vault 二进制文件放在 bin$GOPATH/bin 文件夹中:

$ make dev
...
$ bin/vault
...

要编译包含 UI 的 Vault 开发版本,请运行 make static-dist dev-ui。这会将 Vault 二进制文件放在 bin$GOPATH/bin 文件夹中:

$ make static-dist dev-ui
...
$ bin/vault
...

要运行测试,请键入 make test。注意:这需要安装 Docker。如果退出状态为 0,则一切正常!

$ make test
...

如果您正在开发特定的包,可以通过指定 TEST 变量仅运行该包的测试。例如,以下命令将仅运行 vault 包的测试。

$ make test TEST=./vault
...

故障排除

如果您遇到像是 could not read Username for 'https://github.com' 的错误,您可能需要像这样调整您的 git 配置:

$ git config --global --add url."[email protected]:".insteadOf "https://github.com/"

导入 Vault

此仓库发布了两个可供其他项目导入的库:github.com/hashicorp/vault/apigithub.com/hashicorp/vault/sdk

请注意,此仓库还包含 Vault 产品本身,并且与大多数 Go 项目一样,Vault 使用 Go modules 来管理其依赖关系。实现此目的的文件是 go.mod。碰巧,该文件的存在使得从理论上来讲可以将 Vault 作为依赖项导入其他项目。其他一些项目习惯于这样做,以便利用为测试 Vault 本身而开发的测试工具。这从来不是,也永远不会是使用 Vault 项目的受支持方式。我们不太可能修复与将 github.com/hashicorp/vault 导入到您的项目失败相关的错误。

另请参阅下面的“基于 Docker 的测试”部分。

验收测试

Vault 拥有全面的验收测试,覆盖了机密认证方法的大部分特性。

如果您正在处理机密或认证方法的某个特性,并希望验证其功能(以及是否破坏了其他功能),我们建议运行验收测试。

警告: 验收测试会创建/销毁/修改真实资源,在某些情况下可能会产生实际成本。如果存在 bug,理论上损坏的后端可能会留下孤立数据。因此,请自行承担运行验收测试的风险。至少,我们建议在您测试的任何后端的专用私有账户中运行它们。

要运行验收测试,请调用 make testacc

$ make testacc TEST=./builtin/logical/consul
...

TEST 变量是必需的,您应该指定后端所在的文件夹。建议使用 TESTARGS 变量来过滤到要测试的特定资源,因为一次性测试所有资源有时可能需要很长时间。

验收测试通常需要设置其他环境变量,例如访问密钥。测试本身应该尽早报错并告诉您要设置什么,因此这里不再赘述。

有关 Vault Enterprise 功能的更多信息,请访问 Vault Enterprise 网站

基于 Docker 的测试

我们创建了一种受 NewTestCluster 启发的实验性新测试机制。使用示例:

import (
  "testing"
  "github.com/hashicorp/vault/sdk/helper/testcluster/docker"
)

func Test_Something_With_Docker(t *testing.T) {
  opts := &docker.DockerClusterOptions{
    ImageRepo: "hashicorp/vault", // 或 "hashicorp/vault-enterprise"
    ImageTag:    "latest",
  }
  cluster := docker.NewTestDockerCluster(t, opts)
  
  client := cluster.Nodes()[0].APIClient()
  _, err := client.Logical().Read("sys/storage/raft/configuration")
  if err != nil {
    t.Fatal(err)
  }
}

或者用于企业版:

import (
  "testing"
  "github.com/hashicorp/vault/sdk/helper/testcluster/docker"
)

func Test_Something_With_Docker(t *testing.T) {
  opts := &docker.DockerClusterOptions{
    ImageRepo: "hashicorp/vault-enterprise",
    ImageTag:  "latest",
    VaultLicense: licenseString, // 不是路径,而是实际的许可证字节
  }
  cluster := docker.NewTestDockerCluster(t, opts)
}

以下是我们实际使用它的一个更现实的示例。DefaultOptions 使用 hashicorp/vault:latest 作为仓库和标签,但它也会查看环境变量 VAULT_BINARY。如果设置了,它会将 VAULT_BINARY 引用的本地文件复制到容器中。这在测试本地更改时非常有用。

您也可以设置 VAULT_LICENSE_CI 环境变量,而不是设置 VaultLicense 选项,这比将许可证提交到版本控制更好。

您还可以选择设置 COMMIT_SHA,它将被附加到我们构建的镜像名称中,作为调试的便利。

func Test_Custom_Build_With_Docker(t *testing.T) {
  opts := docker.DefaultOptions(t)
  cluster := docker.NewTestDockerCluster(t, opts)
}

github.com/hashicorp/vault/sdk/helper/testcluster 包中有各种辅助函数,例如以下测试将创建一个由 3 节点集群组成的对,并分别使用 PR 或 DR 复制链接它们,如果复制状态在传递的上下文过期之前未变为健康,则测试失败。

再次强调,按原样编写,这些测试依赖于本地拥有 Vault Enterprise 二进制文件,并且环境变量 VAULT_BINARY 指向该二进制文件,以及设置了 VAULT_LICENSE_CI

func TestStandardPerfReplication_Docker(t *testing.T) {
  opts := docker.DefaultOptions(t)
  r, err := docker.NewReplicationSetDocker(t, opts)
  if err != nil {
      t.Fatal(err)
  }
  defer r.Cleanup()

  ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
  defer cancel()
  err = r.StandardPerfReplication(ctx)
  if err != nil {
    t.Fatal(err)
  }
}

func TestStandardDRReplication_Docker(t *testing.T) {
  opts := docker.DefaultOptions(t)
  r, err := docker.NewReplicationSetDocker(t, opts)
  if err != nil {
    t.Fatal(err)
  }
  defer r.Cleanup()

  ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
  defer cancel()
  err = r.StandardDRReplication(ctx)
  if err != nil {
    t.Fatal(err)
  }
}

最后,这里有一个使用自定义二进制文件运行现有 OSS Docker 测试的示例:

$ GOOS=linux make dev
$ VAULT_BINARY=$(pwd)/bin/vault go test -run 'TestRaft_Configuration_Docker' ./vault/external_tests/raft/raft_binary
ok      github.com/hashicorp/vault/vault/external_tests/raft/raft_binary        20.960s

分类