hashicorp/vault
GitHub: hashicorp/vault
业界领先的企业级密钥管理平台,为现代基础设施提供统一的机密存储、动态凭据生成、加密服务和访问审计能力。
Stars: 35136 | Forks: 4606
# Vault [](https://github.com/hashicorp/vault/actions/workflows/build.yml) [](https://github.com/hashicorp/vault/actions/workflows/ci.yml) [](https://www.hashicorp.com/products/vault/?utm_source=github&utm_medium=banner&utm_campaign=github-vault-enterprise)
**请注意**:我们非常重视 Vault 的安全和用户的信任。如果您认为在 Vault 中发现了安全问题,请_通过 [security@hashicorp.com](mailto:security@hashicorp.com) 联系我们进行负责任的披露_。
- 网站:[developer.hashicorp.com/vault](https://developer.hashicorp.com/vault)
- 公告列表:[Google Groups](https://groups.google.com/group/hashicorp-announce)
- 讨论论坛:[Discuss](https://discuss.hashicorp.com/c/vault)
- 文档:[https://developer.hashicorp.com/vault/docs](https://developer.hashicorp.com/vault/docs)
- 教程:[https://developer.hashicorp.com/vault/tutorials](https://developer.hashicorp.com/vault/tutorials)
- 认证考试:[https://developer.hashicorp.com/certifications/security-automation](https://developer.hashicorp.com/certifications/security-automation)
- 文档源码:[https://github.com/hashicorp/web-unified-docs](https://github.com/hashicorp/web-unified-docs)
Vault 是一种用于安全访问机密信息的工具。机密信息是指任何您希望严格控制访问权限的内容,例如 API 密钥、密码、证书等。Vault 为任何机密信息提供统一的接口,同时提供严格的访问控制并记录详细的审计日志。
现代系统需要访问大量的机密信息:数据库凭据、外部服务的 API 密钥、面向服务架构通信的凭据等。了解谁正在访问哪些机密信息已经非常困难且因平台而异。如果没有自定义解决方案,加上密钥轮换、安全存储和详细审计日志几乎是不可能的。这就是 Vault 的用武之地。
Vault 的主要功能包括:
* **安全的机密存储**:Vault 可以存储任意的键/值对。Vault 在将数据写入持久存储之前对其进行加密,因此仅访问原始存储并不足以访问您的机密信息。Vault 可以写入磁盘、[Consul](https://www.consul.io) 等。
* **动态机密信息**:Vault 可以为某些系统(例如 AWS 或 SQL 数据库)按需生成机密信息。例如,当应用程序需要访问 S3 存储桶时,它会向 Vault 请求凭据,Vault 将按需生成具有有效权限的 AWS 密钥对。创建这些动态机密信息后,Vault 还会在租约到期后自动将其撤销。
* **数据加密**:Vault 可以在不存储数据的情况下对其进行加密和解密。这使安全团队能够定义加密参数,开发人员可以将加密数据存储在 SQL 数据库等位置,而无需设计自己的加密方法。
* **租约和续订**:Vault 将**租约**与每个机密信息相关联。租约结束时,Vault 会自动撤销该机密信息。客户端可以通过内置的续订 API 续订租约。
* **撤销**:Vault 内置支持机密信息撤销。Vault 不仅可以撤销单个机密信息,还可以撤销机密信息树,例如特定用户读取的所有机密信息或特定类型的所有机密信息。撤销有助于密钥轮换以及在发生入侵时锁定系统。
## 文档、入门指南和认证考试
文档可在 [Vault 网站](https://developer.hashicorp.com/vault/docs)上找到。
如果您是 Vault 新手并希望开始安全自动化,请查看 HashiCorp 学习平台上的[入门指南](https://learn.hashicorp.com/collections/vault/getting-started)。还有[其他指南](https://learn.hashicorp.com/vault)供您继续学习。
有关如何使用不同编程语言从应用程序内部与 Vault 交互的示例,请参见 [vault-examples](https://github.com/hashicorp/vault-examples) 仓库。还提供了一个开箱即用的[示例应用程序](https://github.com/hashicorp/hello-vault-go)。
通过认证考试展示您的 Vault 知识。访问[认证页面](https://www.hashicorp.com/certification/#hashicorp-certified-vault-associate)了解考试信息,并在 HashiCorp 学习平台上查找[学习资料](https://learn.hashicorp.com/collections/vault/certification)。
## 开发 Vault
如果您希望致力于 Vault 本身或其任何内置系统的开发,您首先需要在机器上安装 [Go](https://www.golang.org)。
对于本地开发,首先确保已正确安装 Go,包括设置 [GOPATH](https://golang.org/doc/code.html#GOPATH),然后将 [GOBIN](https://pkg.go.dev/cmd/go#hdr-Environment_variables) 变量设置为 `$GOPATH/bin`。确保 `$GOPATH/bin` 位于您的路径中,因为某些发行版捆绑了旧版本的构建工具。
接下来,克隆此仓库。Vault 使用 [Go Modules](https://github.com/golang/go/wiki/Modules),因此建议您将仓库克隆到 GOPATH ***之外***。
然后,您可以通过引导您的环境来下载任何必需的构建工具:
```
$ make bootstrap
...
```
要编译 Vault 的开发版本,请运行 `make` 或 `make 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."git@github.com:".insteadOf "https://github.com/"
```
### 导入 Vault
此仓库发布了两个可由其他项目导入的库:`github.com/hashicorp/vault/api` 和 `github.com/hashicorp/vault/sdk`。
请注意,此仓库还包含 Vault(产品),并且与大多数 Go 项目一样,Vault 使用 Go Modules 来管理其依赖项。执行此操作的机制是 [go.mod](./go.mod) 文件。实际上,该文件的存在也使得理论上可以将 Vault 作为依赖项导入到其他项目中。一些其他项目已经这样做了,以便利用为测试 Vault 本身而开发的测试工具。这不是,也从来不是使用 Vault 项目的受支持方式。我们不太可能修复与无法将 `github.com/hashicorp/vault` 导入您的项目相关的错误。
另请参阅下面的“基于 Docker 的测试”部分。
### 验收测试
Vault 拥有全面的[验收测试](https://en.wikipedia.org/wiki/Acceptance_testing),涵盖了机密信息 和认证 方法的大部分功能。
如果您正在开发机密信息或认证方法的功能,并希望验证其是否正常运行(并且没有破坏其他任何东西),我们建议运行验收测试。
**警告**:验收测试会创建/销毁/修改*真实资源*,在某些情况下可能会产生实际费用。如果存在错误,从技术上讲,损坏的后端可能会留下残留数据。因此,请自行承担运行验收测试的风险。至少,我们建议在您正在测试的任何后端的私有账户中运行它们。
要运行验收测试,请调用 `make testacc`:
```
$ make testacc TEST=./builtin/logical/consul
...
```
`TEST` 变量是必需的,您应该指定后端所在的文件夹。建议使用 `TESTARGS` 变量筛选到要测试的特定资源,因为一次测试所有资源有时会花费很长时间。
验收测试通常需要设置其他环境变量,例如访问密钥。测试本身应该会及早报错并告诉您要设置什么,因此此处不作记录。
有关 Vault Enterprise 功能的更多信息,请访问 [Vault Enterprise 站点](https://www.hashicorp.com/products/vault/?utm_source=github&utm_medium=referral&utm_campaign=github-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", // or "hashicorp/vault-enterprise"
ImageTag: "latest",
}
cluster := docker.NewTestDockerCluster(t, opts)
defer cluster.Cleanup()
client := cluster.Nodes()[0].APIClient()
_, err := client.Logical().Read("sys/storage/raft/configuration")
if err != nil {
t.Fatal(err)
}
}
```
或者对于 Enterprise:
```
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, // not a path, the actual license bytes
}
cluster := docker.NewTestDockerCluster(t, opts)
defer cluster.Cleanup()
}
```
这是一个我们在实践中如何使用它的更现实的例子。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)
defer cluster.Cleanup()
}
```
在 `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
```
Vault 是一种用于安全访问机密信息的工具。机密信息是指任何您希望严格控制访问权限的内容,例如 API 密钥、密码、证书等。Vault 为任何机密信息提供统一的接口,同时提供严格的访问控制并记录详细的审计日志。
现代系统需要访问大量的机密信息:数据库凭据、外部服务的 API 密钥、面向服务架构通信的凭据等。了解谁正在访问哪些机密信息已经非常困难且因平台而异。如果没有自定义解决方案,加上密钥轮换、安全存储和详细审计日志几乎是不可能的。这就是 Vault 的用武之地。
Vault 的主要功能包括:
* **安全的机密存储**:Vault 可以存储任意的键/值对。Vault 在将数据写入持久存储之前对其进行加密,因此仅访问原始存储并不足以访问您的机密信息。Vault 可以写入磁盘、[Consul](https://www.consul.io) 等。
* **动态机密信息**:Vault 可以为某些系统(例如 AWS 或 SQL 数据库)按需生成机密信息。例如,当应用程序需要访问 S3 存储桶时,它会向 Vault 请求凭据,Vault 将按需生成具有有效权限的 AWS 密钥对。创建这些动态机密信息后,Vault 还会在租约到期后自动将其撤销。
* **数据加密**:Vault 可以在不存储数据的情况下对其进行加密和解密。这使安全团队能够定义加密参数,开发人员可以将加密数据存储在 SQL 数据库等位置,而无需设计自己的加密方法。
* **租约和续订**:Vault 将**租约**与每个机密信息相关联。租约结束时,Vault 会自动撤销该机密信息。客户端可以通过内置的续订 API 续订租约。
* **撤销**:Vault 内置支持机密信息撤销。Vault 不仅可以撤销单个机密信息,还可以撤销机密信息树,例如特定用户读取的所有机密信息或特定类型的所有机密信息。撤销有助于密钥轮换以及在发生入侵时锁定系统。
## 文档、入门指南和认证考试
文档可在 [Vault 网站](https://developer.hashicorp.com/vault/docs)上找到。
如果您是 Vault 新手并希望开始安全自动化,请查看 HashiCorp 学习平台上的[入门指南](https://learn.hashicorp.com/collections/vault/getting-started)。还有[其他指南](https://learn.hashicorp.com/vault)供您继续学习。
有关如何使用不同编程语言从应用程序内部与 Vault 交互的示例,请参见 [vault-examples](https://github.com/hashicorp/vault-examples) 仓库。还提供了一个开箱即用的[示例应用程序](https://github.com/hashicorp/hello-vault-go)。
通过认证考试展示您的 Vault 知识。访问[认证页面](https://www.hashicorp.com/certification/#hashicorp-certified-vault-associate)了解考试信息,并在 HashiCorp 学习平台上查找[学习资料](https://learn.hashicorp.com/collections/vault/certification)。
## 开发 Vault
如果您希望致力于 Vault 本身或其任何内置系统的开发,您首先需要在机器上安装 [Go](https://www.golang.org)。
对于本地开发,首先确保已正确安装 Go,包括设置 [GOPATH](https://golang.org/doc/code.html#GOPATH),然后将 [GOBIN](https://pkg.go.dev/cmd/go#hdr-Environment_variables) 变量设置为 `$GOPATH/bin`。确保 `$GOPATH/bin` 位于您的路径中,因为某些发行版捆绑了旧版本的构建工具。
接下来,克隆此仓库。Vault 使用 [Go Modules](https://github.com/golang/go/wiki/Modules),因此建议您将仓库克隆到 GOPATH ***之外***。
然后,您可以通过引导您的环境来下载任何必需的构建工具:
```
$ make bootstrap
...
```
要编译 Vault 的开发版本,请运行 `make` 或 `make 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."git@github.com:".insteadOf "https://github.com/"
```
### 导入 Vault
此仓库发布了两个可由其他项目导入的库:`github.com/hashicorp/vault/api` 和 `github.com/hashicorp/vault/sdk`。
请注意,此仓库还包含 Vault(产品),并且与大多数 Go 项目一样,Vault 使用 Go Modules 来管理其依赖项。执行此操作的机制是 [go.mod](./go.mod) 文件。实际上,该文件的存在也使得理论上可以将 Vault 作为依赖项导入到其他项目中。一些其他项目已经这样做了,以便利用为测试 Vault 本身而开发的测试工具。这不是,也从来不是使用 Vault 项目的受支持方式。我们不太可能修复与无法将 `github.com/hashicorp/vault` 导入您的项目相关的错误。
另请参阅下面的“基于 Docker 的测试”部分。
### 验收测试
Vault 拥有全面的[验收测试](https://en.wikipedia.org/wiki/Acceptance_testing),涵盖了机密信息 和认证 方法的大部分功能。
如果您正在开发机密信息或认证方法的功能,并希望验证其是否正常运行(并且没有破坏其他任何东西),我们建议运行验收测试。
**警告**:验收测试会创建/销毁/修改*真实资源*,在某些情况下可能会产生实际费用。如果存在错误,从技术上讲,损坏的后端可能会留下残留数据。因此,请自行承担运行验收测试的风险。至少,我们建议在您正在测试的任何后端的私有账户中运行它们。
要运行验收测试,请调用 `make testacc`:
```
$ make testacc TEST=./builtin/logical/consul
...
```
`TEST` 变量是必需的,您应该指定后端所在的文件夹。建议使用 `TESTARGS` 变量筛选到要测试的特定资源,因为一次测试所有资源有时会花费很长时间。
验收测试通常需要设置其他环境变量,例如访问密钥。测试本身应该会及早报错并告诉您要设置什么,因此此处不作记录。
有关 Vault Enterprise 功能的更多信息,请访问 [Vault Enterprise 站点](https://www.hashicorp.com/products/vault/?utm_source=github&utm_medium=referral&utm_campaign=github-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", // or "hashicorp/vault-enterprise"
ImageTag: "latest",
}
cluster := docker.NewTestDockerCluster(t, opts)
defer cluster.Cleanup()
client := cluster.Nodes()[0].APIClient()
_, err := client.Logical().Read("sys/storage/raft/configuration")
if err != nil {
t.Fatal(err)
}
}
```
或者对于 Enterprise:
```
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, // not a path, the actual license bytes
}
cluster := docker.NewTestDockerCluster(t, opts)
defer cluster.Cleanup()
}
```
这是一个我们在实践中如何使用它的更现实的例子。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)
defer cluster.Cleanup()
}
```
在 `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
```
标签:API密钥, DNS解析, EVTX分析, EVTX分析, Go语言, HashiCorp, IAM, JSONLines, KMS, PAM, Secrets Management, SSH密钥, Streamlit, Vault, 令牌管理, 加密服务, 动态秘密, 子域名突变, 安全合规, 密码存储, 底层编程, 开源项目, 敏感数据, 数据加密, 日志审计, 特权访问管理, 程序破解, 网络代理, 访问控制, 证书管理, 请求拦截, 身份识别与访问管理, 运维工具, 零信任