Hashicrop vault的简单理解

854 阅读5分钟

背景

因为在公司项目的配置文件中发现有vault的配置,所以需要了解一下这是个什么东西。但是发现根本没有太多的中文资料可以入门。视频更是可以说没有,有都是英文的。搜索过程中发现最多的就是把官方文档中文翻译一下,翻译的人自己都未必看的懂。终于开始接触到一些相对比较没那么普及的技术了。

下面是我找到的相对比较容易理解的博客了。

HashiCorp Vault介绍

just4coding.com/2020/03/13/…

springboot vault的中文文档

docs.gitcode.net/spring/guid…

Vault中文文档,来自gitHub大神的翻译

lonegunmanb.github.io/essential-v…

简单Demo

blog.csdn.net/qq_35746632…]

B站Vualt的讲解(没有Vault的基本认识看不明白的)

www.bilibili.com/video/BV1LG…

个人理解

1.Vault的作用,大白话描述

Vault就是用来管理项目连接数据库、云服务、MQ等的账号密码的组件。

一方面是方便管理,毕竟多起来还是令人头疼的,有个集中管理的工具也不错。

另一方面让这些账号密码不用直接明文写在某些配置文件中,是个人都能看懂。比方说运维把生产环境数据库配置的账号密码配置在git上的一个独立项目中的文件里面。某一天这个运维需要添加新的数据库账号密码进去,一打开这个文件旁边走过的人就能看到。(甚至很多小项目直接就明文记录在代码的配置文件)

而Vault也不是说就百分百能解决所有这些账号密码可能泄露的问题,毕竟总是需要有人知道,只要人操作就可能泄露。但是能在密码存储的安全上提高一个层次,同时还提供集中管理的功能就不错了。

而据我所知Hashicrop这家公司是专门做DevOps一体化自动化项目的公司,这是它其中的一个开源产品。

2.Vault与我们项目的关系

image.png

上面就是Vault与项目常见的关系

首先,Vault服务器本身是不存储那些账号和密码的,会把数据存入到数据库,存入的肯定是密文。

其次Vault服务里面内存的账号密码数据也是有各种加密算法保护的。至于怎么保护看上面提到的关于介绍的博客文章。

Vault会有一次初始化这个过程,和密封(seal)这个状态。初始化就是拿到相当于Linux的root账号(Vault的是Token),而密封的意思就是我上面提到的你无法在Vault看到明文的账号密码(只要你懂得使用Vault的功能)

最后我们自己的项目通过Vault拿到一些Key valut值或者一些数据库、MQ、云服务的临时或动态的账号密码。 因为普通KV值容易理解,但是像数据库的子账号和什么云服务临时账号或者动态token之类各有不同,那么就要根据不同的服务比如mysql对应Vault中的database插件来使用了。(database插件可以在Vault有数据库root的情况下根据你的配置,每次生成一些临时的子账号给到project)

是不是发现有点像配置中心Nacos呢?雷同吧,主要多了个加密功能,用来存一些比较机密的信息。

3.Vault加密保护账号密码的简单理解

1.可以确认的一点是无论如何每个账号密码都肯定有且最起码有一个人是有机会知道。

2.你的项目启动需要账号密码,不等于你需要知道账号密码

3.只要你的项目没被动手脚,那么项目从启动到关闭都不会把机密的账号密码泄露出去。

4.必须有一个地方安全的存储账号和密码。

上面的第四点就是Vault提供的服务,这个'安全'说的简单实际并不简单。

先说前三点简单的。

第一点中这个有机会是指我们把一些账号密码设得长且复杂或者多个人每个人设置密码的一部分那么可以做没有人知道密码是什么。

第二点三点就相对简单了,类似于拉取Nacos配置文件,而项目本身不存储机密。

重点说第四点

安全存储很多人第一时间想到加密,比如我们项目中用户登录的密码就是加密的,这不就行了吗? 可问题是我们普通项目的用户密码加密用的都是不可逆的加密算法,可以把密码通过MD5之类算法加盐值打散成密文,而无法把密文逆向成明文密码呀。我们是需要取出来给项目用的呀。

那么Vault是怎么做到的呢?我这里说说我的理解。

  1. 把密钥分成5份,必须最少三份密钥才可以解封
  2. 技术人员和密钥掌握者相互制衡,每次操作都无法避开技术人员,技术人员掌握临时解封申请的token。(不会莫名背锅)
  3. 数据全都是加密的存储到数据库(consul)被盗取也无法解密。

至于配置的细节,国内的文档和视频真的不多

最后说一句学习Vault的感受,就是当没有了培训机构的视频后,学一个小组件都耗时耗力效果差。有种卡脖子的感觉。