前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开源KMS之vault part6

开源KMS之vault part6

原创
作者头像
保持热爱奔赴山海
发布2024-06-03 10:09:46
580
发布2024-06-03 10:09:46

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
复制
$ 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
复制
$ 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
复制
$ 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
复制
# 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
复制
$ 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
复制
$ vault secrets enable -path=secret2 kv-v2 
Success! Enabled the kv-v2 secrets engine at: secret2/

提交数据

代码语言:txt
复制
$ 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
复制
$ vault kv put secret2/creds2 name=wang passwd=123456

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

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

TIPS:

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

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

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

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

查看数据

代码语言:txt
复制
$ 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
复制
vault kv get -output-curl-string secret2/creds

查看元数据

代码语言:txt
复制
$ 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
复制
$ 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
复制
$ vault secrets disable kv
$ vault secrets disable kv-v1
$ vault secrets disable kv-v2
$ vault secrets disable secret2

列出secret路径下的清单

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

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

代码语言:txt
复制
$ 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
复制
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
复制
$ 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
复制
$ 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
复制
$ 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
复制
$ vault kv list secret2
Keys
----
creds
creds2

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

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

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

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

TIPS:

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

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

代码语言:txt
复制
$ 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
复制
$ vault kv destroy -versions=1 secret2/creds2 # 永久删除键 "creds2" 的 version 1
Success! Data written to: secret2/destroy/creds2

kv delete 命令

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

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

kv undelete 命令

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

代码语言:txt
复制
$ 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • kv secret引擎
    • v1/v2版本的区别
      • 示例
        • 启用kv v1版本引擎
        • 启用kv v2版本引擎
    相关产品与服务
    密钥管理系统
    密钥管理系统(Key Management Service,KMS)是一款安全管理类服务,可以让您轻松创建和管理密钥,保护密钥的保密性、完整性和可用性,满足用户多应用多业务的密钥管理需求,符合合规要求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档