Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开源KMS之vault part6 kv secret engine

开源KMS之vault part6 kv secret engine

原创
作者头像
保持热爱奔赴山海
修改于 2025-06-27 12:50:16
修改于 2025-06-27 12:50:16
2430
举报
文章被收录于专栏:DevOpsDevOps

kv secret引擎

kv 机密引擎用于在 Vault 使用的物理存储中存储任意机密。键名必须始终是字符串。如果您直接通过命令行编写非字符串类型的值,它们将被转换为字符串。但是,您可以通过从 JSON 文件或使用 HTTP API 写入键值数据来保留非字符串类型的值。

注意:

1 路径名和键名没有被混淆或加密;只有在键上设置的值是加密的。不要将敏感信息存储为机密路径的一部分。

2与其他机密引擎不同,kv 机密引擎不会强制执行 TTL 过期。取而代之的是,lease_duration 提示消费者应该多久检查一次新值。

v1/v2版本的区别

v1/v2版本的比较https://developer.hashicorp.com/vault/tutorials/secrets-management/compare-kv-versions

其中一个很重要的改动就是 路径发生了变化,v2多了个data, 因此网上很多早期的中文文档直接拷过来运行会报错。

示例

启用kv v1版本引擎

#不指定则默认路径为kv,版本为kv-v1 (v1版本不支持历史版本的记录和回滚)

代码语言:txt
AI代码解释
复制
$ vault secrets enable kv 或vault secrets enable -path="kv" kv

TIPS:

如果要对v1版本启用版本记录,则可以使用命令 vault kv enable-versioning kv ,它会自动将其转为v2版本。

升级到 Version 2 后,以前用来访问数据的路径将不再适用。您将需要调整用户策略以添加对 Version 2 路径的访问。同样,一旦升级到 Version 2,用户/应用程序将需要更新他们与 kv 数据交互的路径。

代码语言:txt
AI代码解释
复制
$ vault write kv/my-secret my-value=abcd my-key=key1
$ vault kv put kv/my-secret my-value=s3cr3t 
$ vault read kv/my-secret 
Key  Value
--- -----
refresh_interval 768h
my-value s3cr3t

上面的输出结果中,没有带上Metadata信息,是因为v1版本引擎是没有这个功能。

也可以使用-output-curl-string参数,把http接口调用的方式打出来

代码语言:txt
AI代码解释
复制
$ vault kv get -output-curl-string kv/my-secret
输出结果如下
curl -H "X-Vault-Request: true" -H "X-Vault-Token: $(vault print token)" http://192.168.31.181:8200/v1/kv/my-secret 

使用http方式调用的结果如下

代码语言:txt
AI代码解释
复制
# curl -s -H "X-Vault-Request: true" -H "X-Vault-Token: $(vault print token)" http://192.168.31.181:8200/v1/kv/my-secret | jq .
{
 "request_id": "4b16601f-a3f7-8a45-553f-f582c20a76ab",
 "lease_id": "",
 "renewable": false,
 "lease_duration": 2764800,
 "data": {
 "my-key": "key1",
 "my-value": "abcd"
 },
 "wrap_info": null,
 "warnings": null,
 "auth": null
}

查看具体field的内容,可以使用-field参数

代码语言:txt
AI代码解释
复制
$ vault kv get -field=my-key kv/my-secret 
key1
$ vault kv get -field=my-value kv/my-secret 
abcd
$ vault write kv/aliyun_oss key1=["aaaa","bbbb"]
Success! Data written to: kv/aliyun_oss
$ vault read kv/aliyun_oss
Key Value
--- -----
refresh_interval 768h
key1 [aaaa,bbbb]
$ vault write kv/aliyun_oss key2=["AAA","BBBB"]
Success! Data written to: kv/aliyun_oss
$ vault read kv/aliyun_oss
Key Value
--- -----
refresh_interval 768h
key2 [AAA,BBBB]

启用kv v2版本引擎

更推荐使用v2版本的的写法如下:

# 指定路径为secret2,版本为kv-v2 (这里路径可以自由填写)

代码语言:txt
AI代码解释
复制
$ vault secrets enable -path=secret2 kv-v2 
Success! Enabled the kv-v2 secrets engine at: secret2/

提交数据

代码语言:txt
AI代码解释
复制
$ vault kv put secret2/creds passcode=my-long-passcode
=== Secret Path ===
secret2/data/creds
======= Metadata =======
Key Value
--- -----
created_time 2024-05-31T14:41:40.468999103Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1

再提交一条

代码语言:txt
AI代码解释
复制
$ vault kv put secret2/creds2 name=wang passwd=123456

或者使用官方更推荐的v2版本的写法:

代码语言:txt
AI代码解释
复制
vault kv put -mount="secret2" creds2 name=wang passwd=123456

TIPS:

如果要给secret2/creds2 增加一个额外的键值对,推荐使用patch命令更简单

代码语言:txt
AI代码解释
复制
 vault kv patch secret2/creds2 ttl=48h

如果使用put命令的话,需要把当前已有的键值对的内容带上,否则原先内容会被覆盖掉

代码语言:txt
AI代码解释
复制
vault kv put secret2/creds2 ttl=48h name=wang passwd=123456

查看数据

代码语言:txt
AI代码解释
复制
$ vault kv get secret2/creds # 查看数据,也可以使用命令 vault kv get -mount=secret2 creds
=== Secret Path ===
secret2/data/creds
======= Metadata =======
Key Value
--- -----
created_time 2024-05-31T14:41:40.468999103Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
====== Data ======
Key Value
--- -----
passcode my-long-passcode

v2版的kv secret引擎,也支持-output-curl-string 的用法:

代码语言:txt
AI代码解释
复制
vault kv get -output-curl-string secret2/creds

查看元数据

代码语言:txt
AI代码解释
复制
$ vault kv metadata get  secret2/creds
==== Metadata Path ====
secret2/metadata/creds
========== Metadata ==========
Key Value
--- -----
cas_required false
created_time 2024-05-31T14:41:40.468999103Z
current_version 1
custom_metadata <nil>
delete_version_after 0s
max_versions 0
oldest_version 0
updated_time 2024-05-31T14:41:40.468999103Z
====== Version 1 ======
Key Value
--- -----
created_time 2024-05-31T14:41:40.468999103Z
deletion_time n/a
destroyed false

列出当前已经启用的secret引擎

代码语言:txt
AI代码解释
复制
$ vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_0483d594 per-token private secret storage
identity/ identity identity_e6e9cad4 identity store
kv-v1/ kv kv_96c66b00 n/a
kv-v2/ kv kv_e360150d n/a
kv/ kv kv_6a246684 n/a
secret/ kv kv_656758be n/a
secret2/ kv kv_ab34f63b n/a
sys/ system system_15c3e81c system endpoints used for control, policy and debugging
transit/ transit transit_ecc2cc10 n/a

禁用指定的secret引擎

代码语言:txt
AI代码解释
复制
$ vault secrets disable kv
$ vault secrets disable kv-v1
$ vault secrets disable kv-v2
$ vault secrets disable secret2

列出secret路径下的清单

代码语言:txt
AI代码解释
复制
$ vault kv list secret2

提交2条数据(注意如果都是写的secret/creds 则会造成值的覆盖)

代码语言:txt
AI代码解释
复制
$ vault kv put secret2/creds2 aliyun_oss=['ak-22222','secret-11111']
$ vault kv put secret2/creds aliyun_oss=['ak-22222','secret-11111']
$ vault kv put secret2/creds aliyun_oss=['ak-22222','secret-11111'] tencent_oss=['ak-22222','secret-11111'] huawei_oss=['ak-333','secret-444']

rollback 回滚到历史版本

代码语言:txt
AI代码解释
复制
TIPS: 如果操作失误,使用put方法造成了数据的覆盖,可以使用kv rollback 命令回滚到之前的版本,
例如:
vault kv put secret2/devops-uaa/ocr_key k=v 模拟首次提交数据
vault kv put secret2/devops-uaa/ocr_key k=ABCD 模拟第一次误操作
vault kv put secret2/devops-uaa/ocr_key k=SBA 模拟第二次误操作

$ vault kv get secret2/devops-uaa/ocr_key  查看当前错误信息所在的版本
========= Secret Path =========
secret2/data/devops-uaa/ocr_key
======= Metadata =======
Key Value
--- -----
created_time 2024-06-01T14:49:02.515857614Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 3
== Data ==
Key Value
--- -----
k SBA

指定版本号,查看最仅的版本的内容((输出结果中包括了created_time和具体的data信息,方便判断是否是要恢复的数据))
vault kv get -version=2 secret2/devops-uaa/ocr_key # 查看版本2的内容
vault kv get -version=1 secret2/devops-uaa/ocr_key # 查看版本1的内容

假设我们找到了版本1就是正取的数据,下面执行rollback命令回滚
$ vault kv rollback -version=1 secret2/devops-uaa/ocr_key # 回滚到版本1
Key Value
--- -----
created_time 2024-06-01T14:52:58.246139908Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 4

$ vault kv get secret2/devops-uaa/ocr_key # 查看当前版本的数据是否正确
========= Secret Path =========
secret2/data/devops-uaa/ocr_key
======= Metadata =======
Key Value
--- -----
created_time 2024-06-01T14:52:58.246139908Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 4
== Data ==
Key Value
--- -----
k v

查询指定路径下的值

代码语言:txt
AI代码解释
复制
$ vault kv get secret2/cred
=== Secret Path ===
secret2/data/creds
======= Metadata =======
Key Value
--- -----
created_time 2024-06-01T01:11:59.425429041Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 5
======= Data =======
Key Value
--- -----
aliyun_oss [ak-22222,secret-11111]
huawei_oss [ak-333,secret-444]
tencent_oss [ak-22222,secret-11111]

kv软删除 delete

注意: delete 命令删除 Key/Value 机密引擎指定路径上的数据。如果使用 K/V Version 2,它的版本化数据不会被完全删除,而是标记为已删除并且不会在正常的读取请求中返回。

代码语言:txt
AI代码解释
复制
$ vault kv delete secret2/cred2   # 如不带-versions= 参数表示删除最新版本
Success! Data deleted (if it existed) at: secret2/data/cred2

$ vault kv delete -versions=1 secret2/creds2
Success! Data deleted (if it existed) at: secret2/data/creds2

$ vault kv delete -versions=2 secret2/creds2 
Success! Data deleted (if it existed) at: secret2/data/creds2

$ vault kv delete -versions=3 secret2/creds2 
Success! Data deleted (if it existed) at: secret2/data/creds2

再次查询这个元素,可以看到值已经查不到了(默认查的是最新的version信息)

代码语言:txt
AI代码解释
复制
$ vault kv get secret2/creds2 
=== Secret Path ===
secret2/data/creds2
======= Metadata =======
Key Value
--- -----
created_time 2024-06-01T01:10:17.00797579Z
custom_metadata <nil>
deletion_time 2024-06-01T01:20:54.162242076Z
destroyed false
version 1

但是使用list接口还是能看到creds2这个元素的(还能看到creds2,是因为元数据还被存着)

代码语言:txt
AI代码解释
复制
$ vault kv list secret2
Keys
----
creds
creds2

如果要把元数据也删了,可以使用下面的命令

代码语言:txt
AI代码解释
复制
$ vault kv metadata delete secret2/creds2
Success! Data deleted (if it existed) at: secret2/metadata/creds2

再次查看,可以看到 creds2已经彻底没有了

代码语言:txt
AI代码解释
复制
$ vault kv list secret2
Keys
----
creds

TIPS:

kv list 命令返回指定位置的键名列表,文件夹的名字以 / 为后缀。输入值必须对应文件夹;列出一个文件路径不会返回值数据。请注意,不会对列出的键执行基于策略的过滤;不要在键名中编入敏感信息。无法通过此命令访问值本身。

注意: 文件夹的名称可以是多层级路径。例如生产环境的定义可以类似 secret2/devops-uaa/oss_key、secret2/devops-uaa/orc_key

代码语言:txt
AI代码解释
复制
$ vault kv put secret2/devops-uaa/ocr_key k=v
$ vault kv put secret2/devops-uaa/oss_key k=v
$ vault kv list secret2/devops-uaa
Keys
----
ocr_key
oss_key

kv destroy永久删除

代码语言:txt
AI代码解释
复制
$ vault kv destroy -versions=1 secret2/creds2 # 永久删除键 "creds2" 的 version 1
Success! Data written to: secret2/destroy/creds2

kv delete 命令

从 Vault 中删除指定路径上的机密和配置。删除操作的具体实现是委托给具体路径上挂载的后端实现的

代码语言:txt
AI代码解释
复制
$ vault kv delete -versions=2 secret2/creds2
Success! Data deleted (if it existed) at: secret2/data/creds2

kv undelete 命令

撤销对 K/V 存储中指定路径上的指定版本的数据删除。它可以恢复数据,允许它在获取请求时返回。

代码语言:txt
AI代码解释
复制
$ vault kv undelete -versions=2 secret2/creds2 # 恢复版本2的数据
Success! Data written to: secret2/undelete/creds2
$ vault kv get -version=2 secret2/creds2  # 再次查看版本2的数据
=== Secret Path ===
secret2/data/creds2
======= Metadata =======
Key Value
--- -----
created_time 2024-06-01T01:38:13.705283411Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 2
======= Data =======
Key Value
--- -----
aliyun_oss [ak-22222,secret-11111]

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
开源KMS之vault part7
tips: policy的命令行 删除方法: vault policy delete my-policy
保持热爱奔赴山海
2024/06/03
1690
开源KMS之vault part4 database secret engine [MySQL]
2 注册一个数据库实例到vault,名称为 my-mysql-database 【注意这里用到一个高权限的账号,需要能创建账号、删除账号、调整授权】
保持热爱奔赴山海
2024/06/02
2210
开源KMS之vault part13 alicloud secret engine的使用
在alicloud中创建一个用户 ,名称类似于 hashicorp-vault ,并在“用户授权策略”部分直接将新的自定义策略应用到该用户(我这里直接给hashicorp-vault账号开了admin权限,实际生产使用需要给更严苛的权限,不要过大)。
保持热爱奔赴山海
2025/06/27
990
开源KMS之vault part10
https://developer.hashicorp.com/vault/docs/commands/audit
保持热爱奔赴山海
2024/06/04
2350
在 Kubernetes 上部署使用 Vault
很多时候我们可能都是直接将应用程序的密码或者 API Token 之类的私密信息直接暴露在源代码中的,显然直接暴露这些私密信息不是一个好的方式。在 Kubernetes 系统中提供了一个 Secret 对象来存储私密的数据,但是也只是简单的做了一次 Base64 编码而已,虽然比直接暴露要好点了,但是如果是一些安全性要求非常高的应用直接用 Secret 显然也还是不够的。本文就将来介绍如何使用 HashiCorp Vault 在 Kubernetes 集群中进行秘钥管理。
我是阳明
2020/06/15
2.6K0
在 Kubernetes 上部署使用 Vault
K8S与Vault集成,进行Secret管理
Vault 是用于处理和加密整个基础架构秘钥的中心管理服务。Vault 通过 secret 引擎管理所有的秘钥,Vault 有一套 secret 引擎可以使用。
没有故事的陈师傅
2021/02/01
3.3K0
开源密码存储引擎 Vault 的安装与使用
vault 是一款 HCP 推出的密钥管理引擎,用来集中存储集群运行过程中所需要的秘密信息,例如数据库的访问凭证、密码、密钥等。它保证了存储与通信过程的保密性,这对于我们无处不在的敏感信息的数据安全显然是十分必要的。
用户3147702
2022/12/21
4K0
开源密码存储引擎 Vault 的安装与使用
开源KMS之vault part5 database secret engine
https://lonegunmanb.github.io/essential-vault/6.%E6%9C%BA%E5%AF%86%E5%BC%95%E6%93%8E/6.3.Database_MSSQL.html
保持热爱奔赴山海
2024/06/03
2410
开源KMS之vault part9
https://developer.hashicorp.com/vault/docs/secrets/transit
保持热爱奔赴山海
2024/06/03
3110
21 Mar 2022 在argocd中使用vault管理secret
可以看到,这里的username和password字段都是占位符,不是一个有效的value。借助vault,可以将该secret部署到集群时自动替换相应的secret信息,达到如下效果:
俊采
2023/10/17
3410
Kubernetes 的小秘密——从 Secret 到 Bank Vault
Kubernetes 提供了 Secret 对象用于承载少量的机密/敏感数据,在实际使用中,有几种常规或者非常规的方式能够获取到 Secret 的内容:
崔秀龙
2024/04/15
3580
Kubernetes 的小秘密——从 Secret 到 Bank Vault
开源KMS之vault part2
使用需要 vault operator unseal 命令来执行解封。至少需要 3 个秘钥来解封。
保持热爱奔赴山海
2024/06/02
2140
使用 Vault 与 Kubernetes 为密码提供强有力的保障
Kubernetes 已经成为了容器编排方案的行业标准,而来自 HashiCorp 的 Vault 则是密码管理的标准。那问题来了: 怎样将这两项技术结合使用从而可以让你在 Kubernetes 的应用程序中使用来自于 Vault 中心实例的密码呢?
LinuxSuRen
2020/04/17
1.7K0
在 Kubernetes 读取 Vault 中的机密信息
在 Kubernetes 中,我们通常会使用 Secret 对象来保存密码、证书等机密内容,然而 kubeadm 缺省部署的情况下,Secret 内容是用明文方式存储在 ETCD 数据库中的。能够轻松的用 etcdctl 工具获取到 Secret 的内容。通过修改 --encryption-provider-config 参数可以使用静态加密或者 KMS Server 的方式提高 Secret 数据的安全性,这种方式要求修改 API Server 的参数,在托管环境下可能没有那么方便,Hashicorp Vault 提供了一个变通的方式,用 Sidecar 把 Vault 中的内容加载成为业务容器中的文件。
崔秀龙
2021/04/25
2.5K0
开源KMS之vault part3
一些机密引擎只是存储和读取数据——就像是加密存储数据的 Redis/Memcached 那样。另一些机密引擎会连接到其他服务并按需生成动态凭证。还有一些机密引擎提供加密即服务、totp 生成、证书等等。
保持热爱奔赴山海
2024/06/02
3150
12 Jan 2022 openshift安装vault
将vault的helm repo克隆到本地,并checkout到最新版本v0.18.0:
俊采
2023/10/17
2290
开源KMS之vault part14 PKI secret engine实现自建证书颁发体系
官方文档 https://developer.hashicorp.com/vault/tutorials/pki/pki-engine?variants=vault-deploy%3Aselfhosted
保持热爱奔赴山海
2025/06/28
2090
在 Kubernetes 上部署 Secret 加密系统 Vault
HashiCorp Vault 是一个基于身份的 Secret 和加密管理系统。Secret 是您想要严格控制访问的内容,例如 API 加密密钥、密码或证书。Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全地存储和管理对机密和其他敏感数据的访问、严格控制和可审计。
我的小碗汤
2023/03/19
1.1K0
在 Kubernetes 上部署 Secret 加密系统 Vault
开源KMS之vault part1
vault 是HashiCorp出品的一款久经考验的机密管理软件,HashiCorp家的terraform也很有名,改天有空再写terraform相关的。
保持热爱奔赴山海
2024/06/02
5430
关于 Kubernetes 的 Secret 并不安全这件事
K8s 提供了 Secret 资源供我们来保存、设置一些敏感信息,比如 API endpoint 地址,各种用户密码或 token 之类的信息。在没有使用 K8s 的时候,这些信息可能是通过配置文件或者环境变量在部署的时候设置的。
iMike
2021/12/18
1.3K0
关于 Kubernetes 的 Secret 并不安全这件事
相关推荐
开源KMS之vault part7
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档