vault hashicorp

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之后的结果里

访问: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"

猜你喜欢

转载自blog.csdn.net/davidliuzkw/article/details/86611934