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"