当前位置:当前位置:首页 >电脑教程 >一篇学会 HashiCorp Vault 系统 正文

一篇学会 HashiCorp Vault 系统

[电脑教程] 时间:2025-11-26 20:37:21 来源:系统集成坊 作者:网络安全 点击:103次
是篇学什么

HashiCorp Vault 是一个用于管理密码 、密钥和证书等秘密的篇学系统 ,同时还可提供有身份认证和授权保护的篇学加密服务。利用 Vault 提供的篇学UI、CLI或HTTP API ,篇学可以在严格的篇学控制和审计下安全地存储和管理敏感数据。

为什么

在现代系统中  ,篇学需要诸如数据库访问凭证  、篇学外部API访问密钥 、篇学服务间调用凭证等多种大量秘密信息,篇学这些信息分散存储在纯文本、免费模板篇学配置文件 、篇学源代码或其他位置。篇学如果没有专门的篇学解决方案 ,仅靠散落在各平台自身的篇学机制,很难弄清楚谁在访问哪些密钥 ,很难做好安全存储、密钥轮换和安全审计等工作。

Vault 通过将所有这些凭据集中起来,在一个地方定义  ,减少了不必要的暴露 ,并提供了访问的安全性和审计的方便性  。香港云服务器

工作原理

Vault 主要通过与安全策略关联的令牌来控制客户端对秘密的访问 。安全策略由一组描述路径及其操作可访问性的安全规则组成。令牌可以手动创建并授予客户端 ,也可以由客户端通过登录自行获取。。

Vault 的核心工作流为 :

客户端提供身份识别信息Vault 通过 LDAP 、GitHub、AppRole 等可信第三方验证客户端Vault 将定义好的安全策略关联到令牌 ,并授予客户端客户端通过令牌访问秘密

功能特性安全存储

Vault 在对秘密数据持久存储之前会对其进行加密,因此其原始存储也是安全的源码库。

动态秘密

Vault 可为 AWS 、SQL 数据库等系统提供临时访问凭据 ,并在到期后作废。

加密服务

Vault 也可以根据安全团队定义的加密参数提供公共的数据的加密 、解密服务 ,而不必存储加解密数据 。

租赁与续租

Vault 使用租期管理存储其中的各种秘密 ,到期前没有被续租的秘密将废弃 。

废弃

Vault 允许主动废弃单个、相关、亿华云特定类型的秘密 ,实现密钥轮换或锁定系统 ,以防范入侵 。

版本

Vault 共有开源版 、云托管版和企业版3种版本 。

开源版需要自托管,提供动态秘密管理、加密和数据保护等基本功能特性 ,需要通过社区获得支持 。

云托管版本,名为 HCP Vault(HashiCorp Cloud Platform Vault),与自托管 Vault 具有相同的二进制文件 ,在保证一致用户体验的同时 ,服务器租用允许组织快速使用 Vault 。

企业版需要自托管 ,比开源版多了扩展、容灾等企业特性,并由HashiCorp提供服务支持。

快速体验

安装 复制# 安装 yum-config-

manager 来管理存储库 。

sudo yum install -y yum-

utils

# 使用 yum-config-

manager 添加官方的 HashiCorp Linux 存储库。

sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

# 安装

sudo yum -

y install vault

# 或者安装企业版

sudo yum -y install vault-

enterprise

# 验证

vault1.2.3.4.5.6.7.8.9.10.11.12. 启动

复制# 查看启动帮助

vault server -

help

# 以开发模式启动 ,数据仍然加密,但保存在内存中,使用http侦听,仅用于快速体验  ,不能用于生产

vault server -

dev

# 记录日志中输出的VAULT_ADDR 、Unseal Key 、高防服务器Root Token

# 在一个新终端中进行如下操作

# 留存Unseal Key到某个地方

echo "把这段文字用Unseal Key替换" > unseal.key

# 根据server启动日志中的信息设置环境变量VAULT_ADDR ,表示server的访问地址

export VAULT_ADDR=http://127.0.0.1:8200

# 根据server启动日志中的信息设置环境变量VAULT_TOKEN,表示root访问令牌

export VAULT_TOKEN="用Root Token替换这段文字"

# 查看服务状态

vault status1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18. 处理键值对secret

复制# 查看处理键值对的命令帮助

vault kv -

help

# 查看put键值对命令帮助

vault kv put -

help

# 创建一个名为hell、包含foo、excited两个Key的键值对secret。

# 每针对同名secret put一次,其元数据中的version就会递增

vault kv put -mount=secret hello foo=world excited=

yes

# 读取名为hello的键值对secret,响应中会显示其元数据和键值数据

vault kv get -mount=

secret hello

# 读取kv中excited键的值

vault kv get -mount=secret -field=

excited hello

# 以json格式输出 ,并使用jq命令提取excited这个key的数据

vault kv get -mount=secret -format=json hello | jq -r .data.data.excited

# 删除名为hello的键值对secret

vault kv delete -mount=

secret hello

# 恢复无意删除的名为hello的secret到第2个版本

vault kv undelete -mount=secret -versions=2 hello1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.

引擎

秘密引擎是 Vault 用于储存 、生成和加解密的插件化的组件,键值只是其中一种 ,其它存储引擎还有数据库、Transit(加解密服务引擎) 、SSH  、Time-baseed OTP 、AWS、Consul等  ,也可以自定义。

复制# 秘密引擎需要启用后才能使用。

# 同一种存储引擎可以在不同的路径(path)上启用。

# 开发模式预设启用了键值引擎  。

vault secrets enable -path=kv kv

# 启用秘密引擎的路径默认为秘密引擎的名称

vault secrets enable kv

# 以下命令用于列出所有秘密引擎

vault secrets list

# 以下命令使用 path/秘密名称 的形式设置名为hello的键值数据

vault kv put kv/hello target=world

# 以下命令可禁用路径为kv下的秘密引擎 ,并删除关联的秘密和配置

vault secrets disable kv/1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

生产模式安装

建立配置文件

Vault使用HCL文件进行配置 ,首先创建一个HCL配置文件 ,可以命名为config.hcl。

复制storage "raft" { path = "./vault/data" node_id = "node1"}listener "tcp" { address = "[::]:8200" cluster_address = "[::]:8201" tls_cert_file = "/etc/certs/vault.crt" tls_key_file = "/etc/certs/vault.key"}api_addr = "https://127.0.0.1:8200"cluster_addr = "https://127.0.0.1:8201"ui = true1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

storage 指示后端存储方式,raft 是一种适合生产模式的后端存储 。

listener 用于配置侦听 API 请求的地址,生产环境应启用 TLS  。

api_addr 用于备用服务器向主服务器重定向客户端的地址 。

cluster_addr 为同一集群下各node互相通信的地址,用于备用服务器forward客户端请求到主服务器,必须使用TLS。

ui用于启用默认不启用的Web UI 。

不支持内存锁定时,需要添加配置 :disable_mlock = true

建立raft工作目录 复制mkdir -p ./vault/data1. 启动服务器 复制vault server -config=config.hcl1. 初始化

启动一个新的终端 ,并执行如下命令以初始化服务器 。

复制# 设置服务API地址

export VAULT_ADDR=http://127.0.0.1:8200

# 初始化服务

vault operator init1.2.3.4.

初始化过程会输出5个解封密钥和1个root初始Token ,需要安全的分发密钥,避免一个人持有所有密钥 ,以便当Vault密封时 ,至少需要3个密钥才能解封 。

解封

Vault在初始化后,以及每次重启后,都需要解封才能读取秘密数据。需要在不同的计算机上 ,分别执行如下命令 ,并各提供一个不同的密钥,才能完成解封 。

复制vault operator unseal1. 登录

使用初始化后获得的Root令牌登录Vault服务。

复制vault login1. 其它运维命令

任一运维人员可通过执行 vault operator seal 命令再次密封Vault,可以通过执行 pgrep -f vault | xargs kill 命令终止 Vault 进程 ,通过执行 rm -r ./vault/data 命令清除 Vault 数据 。

使用Transit引擎进行加解密

以下演示使用Vault Transit引擎进行数据加解密(不存储)的过程 ,涉及管理员和客户端两个角色。

复制# (管理员)

以开发模式及root token启动 Vault

# 注 :生产环境中,应使用具有某些安全策略的其它Token执行本任务

vault server -dev -dev-root-token-

id root

# (管理员)

使用环境变量声明Vault服务的地址 ,方便后续操作

export VAULT_ADDR=

$VAULT_ADDR

# (管理员)

使用环境变量声明要使用的令牌,方便后续操作

export VAULT_TOKEN=

root

# (管理员)

启用transit引擎

vault secrets enable transit

# (管理员)

启用名为orders的加密环

vault write -f transit/keys/

orders

# (管理员) 为客户端创建名为app-

orders的安全策略

vault policy write app-orders -<<

EOF

path "transit/encrypt/orders" { capabilities = [ "update" ]}path "transit/decrypt/orders" { capabilities = [ "update" ]}

EOF

# (管理员)为app-

orders安全策略创建一个令牌

vault token create -policy=app-

orders

# (客户端)使用环境变量存储管理员分配的令牌

export APP_ORDER_TOKEN="hvs.CAESIOVYYt5Cq5E0zZX3QVHEv5EYj94pGkGipUX48rI_f2wFGh4KHGh2cy5kdlhPSEhyR2pLa0hlODQwRDVkMzVuMWE"

# (客户端)对明文base64编码后,再调用Vault服务进行加密

VAULT_TOKEN=$APP_ORDER_TOKEN vault write transit/encrypt/

orders \

plaintext=$(base64 <<< "4111 1111 1111 1111")

# (客户端)调用Vault服务对密文进行解密

VAULT_TOKEN=$APP_ORDER_TOKEN vault write transit/decrypt/

orders \

ciphertext="vault:v1:cZNHVx+sxdMErXRSuDa1q/pz49fXTn1PScKfhf+PIZPvy8xKfkytpwKcbC0fF2U="

# (客户端)对解密后的文本进行base64解码

base64 --decode <<< "NDExMSAxMTExIDExMTEgMTExMQo="

# (管理员)执行如下命令进行密钥轮换

vault write -f transit/keys/orders/

rotate

# (客户端)再次调用加密服务,此时密文开头会变为vault:

v2

vault write transit/encrypt/

orders \

plaintext=$(base64 <<< "4111 1111 1111 1111")

# (客户端)使用新密钥包装旧密文。Vault会自行先解密再用新密钥加密 。

vault write transit/rewrap/

orders \

ciphertext="vault:v1:cZNHVx+sxdMErXRSuDa1q/pz49fXTn1PScKfhf+PIZPvy8xKfkytpwKcbC0fF2U="

# (管理员)启用密钥的24小时自动轮换

vault write transit/keys/orders/

config \

auto_rotate_period=24

h

# (管理员)

查看密钥信息,其中 auto_rotate_period 为轮换设置 ,默认值0s表示禁用 。

vault read transit/keys/

orders

# (管理员)

设置最小可解密密钥版本,默认从1开始所有版本的密钥均可以解密

vault write transit/keys/orders/

config \

min_decryption_version=5

# (管理员)导出密钥(包括明文和密文),密文可以保存到Vault的键值引擎,

# 用于在Vault外对大文件进行加解密

vault write -f transit/datakey/plaintext/

orders

# (管理员)导入一个已有的外部密钥

vault read -field=public_key transit/wrapping_key1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.

使用数据库引擎获得动态凭证

以下演示使用Vault的数据库引擎来管理数据库访问凭证 ,涉及管理员和应用程序两个角色。

复制# 首先做一些准备工作,本例中使用docker方式启动一个postgres数据库实例

# 拉取postgres的docker镜像

docker pull postgres:

latest

# 启动 postgres 容器

docker run \

--detach \ --name learn-postgres \ -e POSTGRES_USER=

root \

-e POSTGRES_PASSWORD=

rootpassword \

-p 5432:5432

\

--rm \

postgres

# 通过docker在名为learn-

postgres的容器中执行psql命令,

# 来创建一个名为 ro 的角色,用于完成示例

docker exec -

i \

learn-

postgres \

psql -U root -c "CREATE ROLE \"ro\" NOINHERIT;"

# 为 ro 角色授予一些权限

docker exec -

i \

learn-

postgres \

psql -U root -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"ro\";"#--------以下进入正式环节-----

# (管理员)以dev模式启动一个Vault服务 ,方便演示

vault server -dev -dev-root-token-

id root

# (管理员)设置环境变量,方便后续操作

export VAULT_ADDR=http://127.0.0.1:8200export VAULT_TOKEN=

root

export POSTGRES_URL=127.0.0.1:5432

# (管理员)在Vault中启用数据库引擎

vault secrets enable database

# (管理员) 配置 postgreql-database-

plugin ,包括连接信息

# connection_url支持以,

分割的多个实例 ,插件将依次尝试连接

vault write database/config/

postgresql \

plugin_name=postgresql-database-

plugin \

connection_url="postgresql://{ { username}}:{ { password}}@$POSTGRES_URL/postgres?sslmode=disable"

\

allowed_roles=

readonly \

username="root"

\

password="rootpassword"

# (管理员)创建一个可在postgres中建立角色的sql模板

tee readonly.sql <<

EOF

CREATE ROLE "{ { name}}" WITH LOGIN PASSWORD { { password}} VALID UNTIL { { expiration}} INHERIT;GRANT ro TO "{ { name}}";

EOF

# (管理员)创建名为readonly的数据库角色 ,创建语句将使用上面的sql模板

vault write database/roles/

readonly \

db_name=

postgresql \

creation_statements=@readonly.sql

\

default_ttl=1

h \

max_ttl=24

h

# (应用程序)

从Vault获取一个只读角色

# 返回结果中包括username、password ,以及租约id和租期等信息

vault read database/creds/

readonly

# 可使用如下命令验证获得的角色是否存在

docker exec -

i \

learn-

postgres \

psql -U root -c "SELECT usename, valuntil FROM pg_user;"

# (管理员)列出所有租约

vault list sys/leases/lookup/database/creds/

readonly

#(管理员)使用环境变量保存第一份租约的id

LEASE_ID=$(vault list -format=json sys/leases/lookup/database/creds/readonly | jq -r ".[0]")

# (管理员)续约

vault lease renew database/creds/readonly/

$LEASE_ID

# (管理员)在租约到期前主动撤销

vault lease revoke database/creds/readonly/

$LEASE_ID

# (管理员)按照前缀撤销所有符合条件的租约

vault lease revoke -prefix database/creds/readonly1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.

Vault还提供数据库用户名模板、密码策略等功能 。

(责任编辑:网络安全)

    相关内容
    精彩推荐
    热门点击
    友情链接