一、关于Vault
Vault是HashiCorp推出的企业级密钥管理工具,用来集中存储集群运行过程中所需要的秘密信息,例如数据库的访问凭证、密码、密钥等,专为集中保护、控制和审计敏感信息访问而设计
其核心价值体现在四大方面:
- 集中化秘密存储:安全管理API密钥、数据库密码、SSL证书等敏感信息,替代分散在代码或配置文件中的明文存储,从源头降低泄露风险;
- 细粒度访问控制:基于策略(Policy)实现"最小权限"管理,支持多身份认证(Token、LDAP、OAuth2、MFA等),确保只有授权实体能访问特定秘密;
- 动态凭证生成:为数据库、云服务等自动生成短期有效、自动过期的临时凭证,大幅降低长期凭证泄露的安全隐患;
全链路审计追踪:记录所有秘密访问、修改、删除操作,生成不可篡改的审计日志,满足合规审计需求(如等保、SOC2)。 - 其显著特点是安全优先(内存锁定防数据泄露)、灵活适配(支持多存储后端与秘密类型)、可扩展(集群部署支撑大规模场景),已成为企业解决秘密管理痛点的标准工具。
二、安装Docker及Docker Compose
略
三、下载安装Vault镜像
# docker pull hashicorp/vault:latest
四、部署Vault 单机服务
4.1、创建宿主机目录
# mkdir -p /opt/vault/{file,config,logs}
- file:存储持久化数据
- config:存放配置文件
- logs:存储审计日志
4.2、创建docker-compose.yml (生产模式)
# cat /opt/vault/docker-compose.yml
version: '3.8'
services:
vault:
privileged: true
image: hashicorp/vault:latest
container_name: vault-service
command: [ 'vault', 'server', '-config=/vault/config' ]
cap_add: [IPC_LOCK]
ports:
- "8200:8200"
volumes:
- ./file:/vault/file
- ./logs:/vault/logs
environment:
VAULT_DEV_ROOT_TOKEN_ID: "myroot"
VAULT_LOCAL_CONFIG: '{"backend": {"file": {"path": "/vault/file"}}, "listener": {"tcp":{"address": "0.0.0.0:8200", "tls_disable": 1}}, "ui":true, "default_lease_ttl": "168h", "max_lease_ttl": "720h", "disable_mlock": "true"}'
VAULT_ADDR: "http://127.0.0.1:8200"
配置解释:
- volumes:挂载本地目录,实现数据持久化(./file 为存储路径)。
- ports:自定义端口 8200(避免冲突)。
- command: server:生产模式启动(需手动初始化)。开发模式(不推荐)可移除此行,但重启后可能失败。
- disable_mlock": "true" 设置此参数是因为启动内存锁定权限不足,测试环境,用此参数可以解决
执行启动:
# cd /opt/vault && docker compose up -d
查看状态
# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
vault-service "docker-entrypoint.s…" vault running 0.0.0.0:8200->8200/tcp
4.3、初始化与Unseal(关键操作)
Vault启动后处于"密封"状态,需初始化并解锁才能使用:
进入容器:
# docker exec -it vault-servicer sh
设置环境变量:
# export VAULT_ADDR=http://127.0.0.1:8200;
单机部署可以使用如下命令:
# vault operator init -key-shares=1 -key-threshold=1
输出包括 Unseal Key 和 Initial Root Token,需要保存这些值,很重要!
示例输出:
Unseal Key 1: xxxxxxxxx/xxxxxxxxxxxxxxxxx=
Initial Root Token: hvs.xxxxxxxxxxxxxxxxxxx
安全提示:
生产环境使用更多 key-shares(至少 3)以实现高可用。Unseal Key 用于解封 Vault,如果是集群需要使用以下命令:
- 初始化(生成5个unseal key和1个root token,务必保存):vault operator init
- 解锁(输入3个不同的unseal key):vault operator unseal # 输入第1个key vault operator unseal # 输入第2
- key vault operator unseal # 输入第3个key
- 登录:vault login 你的root token
4.4、访问 Vault UI 和基本使用
打开浏览器:http://[你的IP]:8200/ui。
输入 Root Token 登录。默认可见 cubbyhole 存储引擎(开发模式多一个 secret)。
创建secret(示例:数据库配置):
在 cubbyhole 下,路径 /dev_db,添加字段:host、port、user、password保存。
API 获取secret:
curl --header "X-Vault-Token: [你的root_token]" http://[你的IP]:8200/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"}
4.5、启用和使用 KV 引擎(带版本控制,可选)
- 默认 KV 无版本控制,易导致数据丢失。KV v2 支持版本历史。
- 在 UI:Secret Engines > Enable new engine。
- 选择 KV,比如Maximum number of versions最多保留几个版本输入 2,路径 secret(Python SDK 兼容性要求)。
- 启用后,创建 /dev_db secret(同上)。
API 获取最新版本:
curl --header "X-Vault-Token: [你的root_token]" http://[你的IP]:8200/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"}
创建新版本:在 UI 点击 Create new,修改(如 port 从字符串 “3306” 改数字 3306),保存。
获取最新版本(版本 2),同上命令,响应显示版本 2。
获取特定版本,响应返回版本 1 数据:
curl --header "X-Vault-Token: [你的root_token]" http://[你的IP]:8200/v1/secret/data/dev_db?version=1
优势:版本控制允许回滚,UI 支持切换版本查看。
五、常见问题
5.1 启动失败提示“mlock: cannot allocate memory”
原因:内存锁定权限不足或宿主机内存不足。
解决:确保启动命令包含--cap-add=IPC_LOCK,或添加-e SKIP_SETCAP=true跳过setcap操作。
5.2 始终处于密封状态,无法解锁
原因:unseal key输入错误或存储目录权限不足。
解决:重新输入正确的3个unseal key;执行chmod -R 755 /data/vault修复权限。
5.3 配置修改后不生效
原因:配置文件路径错误或语法错误。
解决:确认挂载路径正确;通过vault validate /vault/config/vault.hcl验证语法。
5.4 容器重启后数据丢失
原因:存储路径配置与挂载目录不匹配,或权限不足。
解决:确保storage "file"的path为/vault/file,且宿主机目录权限正确。
- 本文固定链接: http://www.jiagou.cc/1813/
- 转载请注明: 摘星怪 于 架构迷 发表
