首页 > 首页 > 基础理论 > 【原创】docker-compose部署Vault秘密管理工具
2026
06-25

【原创】docker-compose部署Vault秘密管理工具

一、关于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,且宿主机目录权限正确。

最后编辑:
作者:摘星怪
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。