开源KMS之vault part6

2024-06-03 10:09:46 浏览数 (2)

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]

0 人点赞