Vault

Database and Ruby, Python, History


Go语言很火,比如Docker就是用Go语言写的。在之前的测试里面,Go的性能快追上C了。

Vault也是用Go写的。Vault这个单词翻译过来叫地窖,或者保险库。在Harry Potter与魔法石里面就出现过,当时海格带着他去精灵银行取钱,还有魔法石。

Table of Contents

img

所以,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的官方文档:

  1. https://www.vaultproject.io/docs/auth
  2. https://www.vaultproject.io/api/secret/kv/kv-v1
  3. https://www.bogotobogo.com/DevOps/Docker/Docker-Vault-Consul.php