Go语言很火,比如Docker就是用Go语言写的。在之前的测试里面,Go的性能快追上C了。
Vault也是用Go写的。Vault这个单词翻译过来叫地窖,或者保险库。在Harry Potter与魔法石里面就出现过,当时海格带着他去精灵银行取钱,还有魔法石。
Table of Contents
所以,Vault就相当于一个保险柜,里面存放一些敏感的信息,比如各种账号、密码。在网站安全里面,各种密码是不允许明文,或者简单Base64加密,存放在代码repo或者环境变量中。所以,你需要把这些密码放进Vault,然后通过一个凭证来读取密码。
Vault需要解封才可以使用,解封了以后还需要auth才可以读取里面的东西。
安装Vault
docker-compose.yml 走起。自从有了docker,安装个软件第一反应就是能够用docker么?不需要了就直接把image删掉就完了,电脑上不需要安装一堆application,卸载还得老费劲了。
version: '2'
services:
vault:
image: vault:latest
ports:
- 8200:8200
volumes:
- ./tmp/vault/config:/vault/config
- ./tmp/vault/policies:/vault/policies
- ./tmp/vault/data:/vault/data
- ./tmp/vault/logs:/vault/logs
environment:
- VAULT_ADDR=http://127.0.0.1:8200
cap_add:
- IPC_LOCK
entrypoint: vault server -config=/vault/config/vault.json
./tmp/vault/data:/vault/data
是为了把数据持久化,因为容器是无状态的,下次启动,之前的配置就都不见了。所以需要持久化到本机。此外,持久化到本地的信息都是加密了的,所以你无法直接读到Vault里面的内容。
下面是/vault/config/vault.json
的内容,通过volumes挂在到docker里,这样container就可以访问配置文件了。
{
"backend": {
"file": {
"path": "/vault/data"
}
},
"listener": {
"tcp":{
"address": "0.0.0.0:8200",
"tls_disable": 1
}
},
"ui": true,
"default_lease_ttl": "168h",
"max_lease_ttl": "0h"
}
/vault/data
是用来存放Vault里面的数据
address
是指定端口8200
ui
是启动UI界面,可以通过UI配置Vault
启动Vault
docker-compose up vault
初始化Vault
docker exec -it {container_id} sh
进入容器,运行vault init
初始化Vault。Vault会给你下面的信息,找个地方保存下来。我把Root Token直接设置到环境变量里面了。
Unseal Key 1: ***
Unseal Key 2: ***
Unseal Key 3: ***
Unseal Key 4: ***
Unseal Key 5: ***
Initial Root Token: SAMPLE
解封Vault
需要先解封Vault才可以使用。以后每次电脑或者container重启以后都需要解封。
vault operator unseal
然后输入上面的Unseal Key。重复三次即可解封。
测试
写入密码,和尝试获取密码。
vault write secret/my-secret foo=bar
vault read secret/my-secret
API
如果只是像上面这样,就是memcached再加一个基于token的认证。其实Vault支持的功能很多,比较普遍的就是和S3集成,创建临时的IAM user,过期自动删除。这样避免密码被泄露以后数据泄露。
login
登陆获取一个临时的client_token
curl --location --request POST 'http://127.0.0.1:8200/v1/auth/token/create' \
--header 'X-Vault-Token: SAMPLE'
read
通过这个临时的client_token去访问数据,或者写入数据
curl --location --request POST 'http://127.0.0.1:8200/v1/secret/test' \
--header 'X-Vault-Token: client_token' \
--header 'Content-Type: application/json' \
--data-raw '{ "usr": "usr", "pwd": "pwd" }'
curl --location --request GET 'http://127.0.0.1:8200/v1/secret/my-sql' \
--header 'X-Vault-Token: client_token'
更多
Vault还支持更多的认证方式。上面的操作是在Vault的本机上面才能够实现。将安装了Vault的主机限制只能够运维人员才可以登陆,而且不能够泄露Root Token,剩下的就只能够通过API的方式访问。Vault有一个认证方式叫AppRole,即可以指定某些主机为某种Role,通过Role来控制能够访问哪些内容。可以参考Vault的官方文档: