vault hashicorp

本文深入探讨了HashiCorp Vault的架构、工作原理和使用,包括secret engine、role、policy以及授权流程。揭示了一个重大漏洞:允许创建并访问非预期的secret分支。此外,详细介绍了如何部署、配置Vault,以及与Consul、数据库的交互,强调了Vault在权限管理和加密解密中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vault是一个server,其他地址可以通过api,cli或者envconsole访问这个server以获取加密后的解密的值

整个架构:secret存于secret angine内(可以是k/v,aws,gcp等),在vault内是一个secret的路径,role保存了该role可以访问哪个secret以及都有啥权限,使用者首先要与vault授信,然后拿到roleid和secretid,通过俩id去到对应的secret路径下请求token,拿着这个token访问对应的服务(aws的某个服务或者某个db等等),那么ladps的作用就是类似于jenkins的那个预授权,拿着ladps的token就可以获取到对应的roleid和secretid

 

终极目的是拿到一个token。拿到这个token后就可以对应的secret内取值,这些值是用户储存进去的。

拿到token的方式有如下几种:

1.拿到role的id和secretid,拿着俩id和对应的secret请求,得到一个token;

2.直接拿着token,在envconsul里配好,直接读取secret路径并把读到的值(秘密)变成变量

 

policy可以限定任何路径的权限,包括role和secret engine

vault原理:本身是一个server,加密解密可以由这个server处理,也可以由其他的引擎处理(比如aws,gcp或者数据库等)。

secret engine:存储,处理加密解密的引擎,有很多种,vault自带一种叫kv(key/value)。

secret engine有很多类型,每个类型又可以创建无限多的path(在server上会生成这个path(相对路径)),这个path是唯一的,当read或get时针对path即可取到对应的值

path很重要

 

步骤:

1.安装:下载,解压,直接就是一个二进制,配置到环境变量中即可执行

2.启动server: vault server -dev,启动后输出一大堆的信息,其中有token。默认监听8200端口,在访问机上可以设置vault_add为server的ip:port。

3.server上添加engine,自带的默认是kv类型的,还可以添加aws类型等其他类型。vault secrets enable -path xxx/ aws(表示xxx/这个路径绑定到aws类型的secret engine),当有指定path的请求进来时就会以aws的类型进行处理并返回结果.这个xxx可以是单个目录,也可以是连续的目录

4.写数据:两种方式:a.vault xx put xxx/yyy data(xx是类型,比如aws,kv等,xxx是之前创建的secret engine,yyy是啥东东? data是数据,比如kv类型的就是key=value格式,aws的就是aws的格式)。b.也可以使用write,vault write xxx/yyy data,此时不需要指定类型。

5.读取:两种,a.vault xx get xxx/yyy (获取yyy下的所有数据)b.vault read xxx/yyy。直接读取

 

单独部署一台可以外部访问的vault的步骤(实际搭建成功):https://learn.hashicorp.com/vault/getting-started/deploy

坑:

1.当使用vault server -dev创建时,默认是测试模式的,通过netstat -anp即可查看到8200端口对应的local address是127.0.0.1,意味着这个地址只能内部访问,当其他server访问时,显示connection refused。(各种关防火墙,无济于事)

2.创建时使用的hcl配置文件中server的地址要使用0.0.0.0,而不要使用127.0.0.1.否则不通。切记

 

 

1.依赖:consul。安装同vault

2.按照步骤,唯一要注意的是hcl里的127.0.0.1要改为0.0.0.0,否则外部不能访问,这是基本的local address知识。

3.另起一个终端,f非ip登录后使用key携带的token授权并获取data。

 

 

搭建和访问:

搭建:参考https://learn.hashicorp.com/vault/getting-started/deploy。其中注意点如下:1.hcl中改为0.0.0.0,2.在server上的环境变量配置vault_add,并且是http,而不是https。3.init。4.unseal,执行三次,至少需要三个key。5.login的token就在inti之后的结果里

 

consul agent -dev
vault server -config=C:\Users\juliu\Justin\work\Project\vault\config.hcl
vault operator init
vault operator unseal
vault login

 

 

 

export VAULT_ADDR="https://$(terraform output address)"

export VAULT_TOKEN="$(terraform output root_token)"

export VAULT_CAPATH="$(cd ../ && pwd)/tls/ca.pem"

访问:server上访问:vault login xxtoken

          从另一个地点访问该server: 先配好vault_add的环境变量,注意检查地址是否正确及配置的是http还是https。然后vault login xxxtoken即可登录

 

另:

1.如果是在virtual vm上搭测试环境,注意setting里的network设置为bridge的,而不是nat的。

2.如果有防火墙限制,开通端口命令,前提是firewalld启动状态。firewall-cmd --zone=public --add-port=80/tcp --permanent

 

>>>>>>>>>>>>>>>>>>>>>>>>>>

Vault概念:

1.auth:定义授权方式,比如有approle,有ldap,有username&&passwd等等。

2.secrets:存储加密数据,

3.seal/unseal:没unseal之前,vault只知道存进去,但是读出来的是加密的,只有用unseal之后才能输出解密后的数据(解密的过程是用master key解密secret key(每个数据自带的),再用secret key解密加密内容的。)

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>

auth:授权:创建新授权方式vault auth enable -path 'xxx' approle(xxx自定义,approle是类型的一种,还有很多种,比如surpass,ladp等https://www.vaultproject.io/docs/auth/userpass.html

1.auth类型:vault auth enable -path 'xxx' approle 创建一个role,路径是auth/xxx,auth创建后的路径都在auth/下

先创建一个policy文件:一个hcl类型的文件,命个名,里面内容见具体的policy,基本的有path和权限

把这个policy写进vault:vault policy write xxx config.hcl,这个xxx就是一个label,稍后可以拿去用

创建一个授权类型库:vault auth enable -path 'yyy' approle,这个yyy自己命名,类似于根目录。可以每个项目一个

创建一个role,并把之前的policy绑定到这个role上:vault write auth/yyy/role/hello-world policies="xxx"。执行完这个后,就会发现,vault auth list后,列表内有刚创建的method yyy,但是read不到value。

查看role下的东西:vault read auth/yyy/role/hello-world

获取roleid:vault read auth/yyy/role/hello-world/role-id

获取secretid:vault write -f auth/app-dev-corp/role/hello-world/secret-id

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

secrests:数据存储的位置,policy的path指向这里。

创建vault secrets enable -path=xxx kv(或者别的类型)。

写:vault kv put secrets/xxx mm=nn dd=ff,每次写会覆盖上一次,全部覆盖,相当于重新写入,之前的全删除,如果想保留,就要写到新的里面

读:vault kv get secret/xxx

创建分支,可以迭代:vault kv put secret/xx/xxxx/xxxx kkk=vvvv eee=ffff

查看有哪些分支:vault kv list secret/xx,想看哪个分支就写哪个分支。(注意下面的大bug)

 

惊天大bug:当使用enable -path创建一个secret后,可以使用vault write xxx/sss dd=ff创建分支并赋值,并且也可以使用kv查看和赋值,而且,这个与secret/xxx下的不冲突。奇葩的加密软件。惊天大漏洞。可以vault read xxx/sss。vault list xxx就可以看到xxx下所有这种方式创建的分支

 

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

auth和secrets的区别和关系:

1.auth创建的东东的路径的根目录auth是和secrets的目录相同。比如vault secrets enable -path=auth kv,执行会报错,因为auth已存在切不让用这个命名。且auth/这个目录可能就和xxxx secrets位于同一目录下

2.secret是实际存储的位置。auth只负责管理权限,而secret才是密码,授权等各种敏感信息存储的位置。

3.二者关系:通过auth获得权限,拿着权限到policy指定的路径下读值

 

vault 和 envconsul的关系:利用envconsul可以通过envconsul读取secret把值设置为环境变量进而直接读取,注意,当不明确配置时,生成的变量的名称是有前缀的,前缀就是secret的路径,斜线变成下划线。具体步骤:https://github.com/hashicorp/envconsul

1.下载envconsul,配置环境变量生效

2.写一个hcl格式的配置文件放到某个路径下,自己知道路径。配置文件的语法参照envconsul官方介绍,其中包含链接vault的配置

3.执行envconsu的命令即可把对应的role的secret变成环境变量并在变量的名字前面加上该role的路径的前缀,斜线变成下划线,也可以取消前缀或者换成别的前缀,指定前缀

命令是:

$ envconsul \
    -config="./config.hcl" \
    -secret="secret/passwords" \
    env

执行后,就会把role里的各个secret传到环境变量内,变量的名称是secret_passwords_xxx,其中可以指定使用哪个config文件。还可以把名称全部变为大写,增加命令

-upcase

此时即可从环境变量内读取到对应的变量值

 

 

 

生成一个登录用的token: vault token create -display-name="jenkins"

 

 

vault 使用database engine:

1.搭建postgresql,具体见postgresql文

2.vault从客户端授权,vault login

3.vault 创建

 

 

role和secret engine的关系,独立的,role的policy规定了可以访问哪个secret的哪个路径。而jenkins的token是可以访问哪个role。数据流就是:vault 分配给一个带policy的token给jenkins(这个policy限定jenkins能访问哪个role),然后拿到的roleid 和 secret id就可以拿到role的token,这个token的policy就是role的policy(即可以访问哪个secret的哪个路径),然后拿着这个token就可以获取secret对应的路径下的信息。然后拿出来值直接使用

 

搭建vault:

consul agent -dev
vault server -config=xxx.hcl
vault operator init
vault operator unseal
vault login

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

vault实战使用:https://www.vaultproject.io/docs/secrets/databases/postgresql.html

1.创建角色;配置权限

见下面的“创建role的步骤”

2.创建database类型的secret engine;

david vault secrets enable -path 'david' database或者下面的直接:

vault secrets enable database
vault write database/config/my-postgresql-database \
    plugin_name=postgresql-database-plugin \
    allowed_roles="my-role" \
    connection_url="postgresql://{{username}}:{{password}}@localhost:5432/" \
    username="root" \
    password="root"

这一步注意:allowed_roles是指db类型的engine的role的名称,不是上面创建的role(每个db engine都有俩元素,一个是它自己的role路径,一个是creds路径。role路径下是手动写进去sql执行语句用于生成cred,creds是存储username和passwd的。最终拿着token要读的就是creds路径下的东西)。还有,url后面要加上"?sslmode=disable",否则会报ssl错误

 

vault write database/roles/my-role \
    db_name=my-postgresql-database \
    creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

这一步就是创建了db engine自己的role,这个role不同于vault的role,这个role只是db engine用来存储db的role的生成方式的。因为db的操作也分不同的role,这个role是db的role

 

3.通过命令拿到roleid和secretid

vault read auth/david/role/david/role-id

vault write -f  auth/david/role/david/role-id

4.拿着roleif和secretid获取到token

vault write auth/approle/login     role_id=e491888d-07ca-7da0-03b9-80407d248f9c     secret_id=9f524cff-948c-64db-47e3-b96b1e8067fb   返回一个token,注意,此处的approle是用户自定义的role名称,比如david。是之前的类似于项目的名称

5.拿着token去engine路径下拿值

vault read database/creds/my-role

注意:这里面的路径是   你的db的名称,比如justin/creds/xxxrole,creds固定的。xxxrole就是db engine创建的时候的role

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

创建role的步骤:

1.先enable一个路径作为项目根目录:注意,这么执行后项目的根路径就是auth/david。而要指定policy,就要这样:vault write auth/david/role/xxx xxxpolicy

vault auth enable -path 'david' approle

2.创建一个role,这样是创建了项目内的一个角色。

vault write auth/approle/role/my-role \
    secret_id_ttl=10m \
    token_num_uses=10 \
    token_ttl=20m \
    token_max_ttl=30m \
    secret_id_num_uses=40

2.创建一个policy文件  xxx.hcl,里面配权限

vault write auth/david/role/xxx xxxpolicy

3.这样在role的david下就可以无限创建无数个role。比如,david是个项目,那就可以给david这个项目创建一堆的角色,比如管理员,执行员,查看员之类的。这是这么定义目录的意义,就是在一个项目下多个角色,而不是把角色直接扔到大目录下

记住,第一步enable的时候是类似创建一个项目根目录。第二步才是创建了角色。即要拿token的角色。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

命令:

vault status:

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

windows上搭建vault:

下载vault,然后使用cmd  cd到vault目录,然后直接使用vault xx。即可。记得配置vault address。不配置的话就是https的。

windows设置环境变量的命令:set testVar=xxxx

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值