logo 🤗

技术视野

聚焦科技前沿,分享技术解析,洞见未来趋势。在这里,与您一起探索人工智能的无限可能,共赴技术盛宴。

部署与简单使用

  1. 找到valut的docker hub地址:https://hub.docker.com/r/hashicorp/vault
  2. docker直接运行vault
docker run --cap-add=IPC_LOCK -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "7200h", "ui": true}' -p 8200:8200 --restart=always hashicorp/vault server
  • "storage": {"file": {"path": "/vault/file"} 文件存储位置在容器内部的/vault/file目录
  • "address": "0.0.0.0:8200"监听地址:8200
  • "tls_disable": true 代表关闭TLS证书
  • "default_lease_ttl": "168h" 代表默认过期时间168小时,即7天。
  • "max_lease_ttl": "7200h" 最大过期时间为300天
  • "ui": true 开启UI功能
  • docker-compose 部署vault(推荐), 参考项目使用 Docker 和 Traefik 搭建 Vault,如果提示端口被占用,请更换其它端口,我这边是8200端口被占用了,所以我换成了8300。
services:
  vault:
    image: hashicorp/vault
    volumes:
      - ./config:/vault/config:rw
      - ./file:/vault/file:rw
      - ./logs:/vault/logs
    cap_add:
      - IPC_LOCK
    environment:
      VAULT_LOCAL_CONFIG: '{"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8300", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "7200h", "ui": true}'
    restart: always
    ports:
      - 8300:8300
    command: server
  • command: server代表用生产方式启动,需要手动初始化数据。如果需要用开发模式(不推荐,dev模式下,重启后容器将无法启动),则将此行注释掉。
  • 运行下面的命令,可以看到有一个容器vault-vault-1启动了。
$ docker compose up -d            
[+] Running 1/1
 ✔ Container vault-vault-1  Started 
  1. 让我们进入容器vault-vault-1,手动初始化它的数据,参考教程:https://blog.51cto.com/u_16213368/11834334
docker exec -it vault-vault-1 sh
export VAULT_ADDR='http://127.0.0.1:8300'
vault operator init -key-shares=1 -key-threshold=1
  1. 输出结果如下,请记录一下下面的root_token和Unseal Key,这俩将保证你的数据安全,相当于双重验证:
Unseal Key 1: xxxxxxxxx/xxxxxxxxxxxxxxxxx=

Initial Root Token: hvs.xxxxxxxxxxxxxxxxxxx

Vault initialized with 1 key shares and a key threshold of 1. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 1 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated root key. Without at least 1 keys to
reconstruct the root key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.
  1. 打开http://[你的ip]:8300/ui这个链接,粘入root_token,登录UI系统。默认可以看到一个密码仓库,一个cubbyhole(dev模式下还有多一个sercet默认库)。
  2. 我们再cubyyhole里面新增一些新字段,假设我们要存一个数据库配置信息,那么我们可以添加4个字段hostportuserpassword,以及填上其对应的value,然后path路径我们可以随便命名,但是不能重复,这里我命名为/dev_db
  3. 让我来请求一下,获取刚刚填入的信息。
curl --header "X-Vault-Token: [你的root_token]" \
     http://[你的ip]:8300/v1/cubbyhole/dev_db
  • 请求结果如下,和我们填入的内容一致,说明成功。
{"request_id":"d5f580db-0198-1db7-ae0b-f9d93c2784f7","lease_id":"","renewable":false,"lease_duration":0,"data":{"host":"xxxxxxxxxxxx","password":"xxxxxxxxxxx","port":"3306","user":"root"},"wrap_info":null,"warnings":null,"auth":null,"mount_type":"cubbyhole"}

使用kv v2引擎

  • 不论是使用默认的 cubbyhole 储存仓库、还是使用最常见的 kv 储存仓库,默认数据是没有版本控制的,换言之,一旦出现错误的更新或者删除,原始数据遭到了复写,问题是不可逆的。
  • 所以 Vault 还提供了 名为 KV v2 的储存仓库,在这个模式之下,数据储存是有版本控制功能的,但是使用起来稍稍麻烦一些,接口文档也不是很清晰,所以这里单独聊一下,如何使用 v2 版本的 KV 进行数据储存。
  • 进入Secerts Engines,选择Enable new engine
  • 选择类型KV
  • 点击Method Options,确保version=2,然后再点击Enable engine,上面的Path的路径建议填入secret否则python sdk会无法调用,这点非常重要。。

  1. 点进去secret,和之前一样,创建一个/dev_db的数据库连接配置信息。
  2. 创建好后,可以点击Secret预览你创建的信息。默认的Overview可以看到当前Version为1,没有编辑按钮,只能Creat New,即创建新版本。
  3. 根据上面的API path,我们可以先试试获取数据
curl --header "X-Vault-Token: [你的root_token]" \
     http://[你的ip]:8300/v1/secret/data/dev_db
  • 获取结果
{"request_id":"4c22b29d-0f4f-b706-77e4-35ced0f0b8f9","lease_id":"","renewable":false,"lease_duration":0,"data":{"data":{"host":"xxxxxxxx","password":"xxxxxxxx","port":"3306","user":"root"},"metadata":{"created_time":"2025-03-24T04:59:33.046221783Z","custom_metadata":null,"deletion_time":"","destroyed":false,"version":1}},"wrap_info":null,"warnings":null,"auth":null,"mount_type":"kv"}
  1. 假设我们需要修改数据库连接信息,那么我们可以尝试新增一个version的dev_db。点击Creat new,比如上面我们的port对应的结果是3306字符串,我们需要改成数字,那么我们可以勾选一下Json安装以及Show diff按钮,然后点击save保存接口。
  2. 我们再获取一次结果。
curl --header "X-Vault-Token: [你的root_token]" \
     http://[你的ip]:8300/v1/secret/data/dev_db
  • 获取结果,可以看到目前version已经是2
{"request_id":"f9a8c534-e263-462d-fb40-2b36ebf76fd7","lease_id":"","renewable":false,"lease_duration":0,"data":{"data":{"host":"xxxxxxxx","password":"xxxxxx","port":3306,"user":"root"},"metadata":{"created_time":"2025-03-24T06:33:24.444266346Z","custom_metadata":null,"deletion_time":"","destroyed":false,"version":2}},"wrap_info":null,"warnings":null,"auth":null,"mount_type":"kv"}
  1. 我们可以进入ui界面,看看Secret,可以选择Version切换不同版本。
  2. 如果我们要用api来查看version1,我们可以加上一个查询参数version=1
curl --header "X-Vault-Token: [你的root_token]" \
     http://[你的ip]:8300/v1/secret/data/dev_db?version=1
  • 输出结果,可以看到正是version 1的内容,即端口是字符串而不是数字。
{"request_id":"3915eb3c-0ac2-2092-0c27-127987c4d562","lease_id":"","renewable":false,"lease_duration":0,"data":{"data":{"host":"xxxx","password":"xxxx","port":"3306","user":"root"},"metadata":{"created_time":"2025-03-24T04:59:33.046221783Z","custom_metadata":null,"deletion_time":"","destroyed":false,"version":1}},"wrap_info":null,"warnings":null,"auth":null,"mount_type":"kv"}
  1. 基本使用方法就到这里结束了(注意,上述部署只适合局域网部署,生产环境建议配置TLS证书)。

python sdk调用vault

  1. 项目地址:https://github.com/hvac/hvac,文档地址:https://python-hvac.org/en/stable/overview.html
  2. 安装模块
pip install "hvac[parser]"
  1. 运行python 代码,实现和我们上面一样的读取kv v2的当前version以及version=1的结果。
import hvac

client = hvac.Client(
    url='http://[host]:8300',
    token="[your root_token]"
)
is_authenticated = client.is_authenticated()
assert is_authenticated, print(is_authenticated)
# read secret data use kv with v2, like url http://[ip]:[port]/secret/dev_db
read_response = client.secrets.kv.read_secret_version(
    path='/dev_db',
    raise_on_deleted_version=False # to reduce warning
)
print(read_response)
# read secret data, use version 1
read_response_v1 = client.secrets.kv.read_secret_version(
    path='/dev_db',
    raise_on_deleted_version=False, # to reduce warning
    version=1
)
print(read_response_v1)
  • 输出结果如下,目测符合预期。
{'request_id': 'eb0c4fbf-890f-d317-522c-dfb82509bf61', 'lease_id': '', 'renewable': False, 'lease_duration': 0, 'data': {'data': {'host': 'xxxxxxxxxx', 'password': 'xxxxxx', 'port': 3306, 'user': 'root'}, 'metadata': {'created_time': '2025-03-24T06:33:24.444266346Z', 'custom_metadata': None, 'deletion_time': '', 'destroyed': False, 'version': 2}}, 'wrap_info': None, 'warnings': None, 'auth': None, 'mount_type': 'kv'}
{'request_id': '6f9e67ea-9acd-6042-0acf-958da32f3412', 'lease_id': '', 'renewable': False, 'lease_duration': 0, 'data': {'data': {'host': 'xxxxxx', 'password': 'xxxxxx', 'port': '3306', 'user': 'root'}, 'metadata': {'created_time': '2025-03-24T04:59:33.046221783Z', 'custom_metadata': None, 'deletion_time': '', 'destroyed': False, 'version': 1}}, 'wrap_info': None, 'warnings': None, 'auth': None, 'mount_type': 'kv'}

版权属于:tlntin
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2025年04月30日 12:09


42 文章数
5 分类数
43 页面数
已在风雨中度过 1年348天16小时20分
目录
来自 《使用docker部署企业级密码管理工具vault》
暗黑模式
暗黑模式
返回顶部
暗黑模式
暗黑模式
返回顶部