本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html
本文做者: 苏洋docker
建立时间: 2019年05月02日 统计字数: 5494字 阅读时间: 11分钟阅读 本文连接: soulteary.com/2019/05/02/…数据库
随着使用的机器、服务愈来愈多,项目中依赖的变量、配置、秘钥等敏感信息,变的愈来愈多。与之相对的,针对这些内容的管理、维护成本,也变的愈来愈高。庆幸的是,咱们能够借助“配置中心”的方式来解决问题。编程
大型互联网公司由于各类缘由通常会选择自研、或基于开源项目进行“魔改”。然而对于我的或者小规模的研发团队来说,开源社区的 Vault 不失为一个不错的解决方案,可以作到“开袋即食”。json
本篇文章将会介绍 Vault 如何搭配 Traefik 、Compose 一块儿使用,若是你有阅读我以前的文章,或者有必定的基础,所有操做时间在五分钟左右。安全
Vault 是出名的效率工具开发厂商 HashiCorp 旗下的产品,和 GitLab 的模式同样,分为社区版和企业版。对于通常的需求而言,社区版足够使用,想了解额外信息能够看看 官方文档。bash
Vault 核心功能是安全的管理敏感数据,诸如:秘钥、密码、证书、私密配置。并支持 CLI、HTTP API 、以及Web UI 三种方式来进行交互。网络
Vault 除了支持运行在高度信任、有明确界限划分、可能依赖IP白名单的私有网络中外,还支持在没有明确界限划分、依赖秘钥等要素验证的公有云中,好比:支持各类主流的云计算平台。frontend
咱们先聊聊第一个场景下,Vault 的使用。curl
在编写 compose
配置启动服务前,咱们须要先编写 Vault
的配置。
建立一个名为 config.json
的文件:
{
"backend": {
"file": {
"path": "/vault/file"
}
},
"listener": {
"tcp": {
"address": "0.0.0.0:8200",
"tls_disable": 1
}
},
"default_lease_ttl": "168h",
"max_lease_ttl": "720h",
"ui": true
}
复制代码
上面这份配置文件中,咱们定义了几个内容:
Etcd
或者数据库、云厂商储存池等方案0.0.0.0
接下来咱们编写 compose
配置。
在合适的目录建立一个名为 docker-compose.yml
的文件,并输入如下内容:
version: '3'
services:
vault:
image: vault:1.1.2
volumes:
- ./config:/vault/config:rw
- ./file:/vault/file:rw
- ./logs:/vault/logs
cap_add:
- IPC_LOCK
entrypoint: vault server -config=/vault/config/vault.json
restart: always
expose:
- 8200
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.port=8200"
- "traefik.frontend.rule=Host:vault.lab.com"
- "traefik.frontend.entryPoints=https,http"
- "traefik.frontend.headers.customResponseHeaders=Access-Control-Allow-Origin:*"
networks:
traefik:
external: true
复制代码
使用 docker-compose up
启动服务,会看到相似下面的内容:
Creating vaultlabcom_vault_1 ... done
Attaching to vaultlabcom_vault_1
vault_1 | ==> Vault server configuration:
vault_1 |
vault_1 | Cgo: disabled
vault_1 | Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
vault_1 | Log Level: info
vault_1 | Mlock: supported: true, enabled: true
vault_1 | Storage: file
vault_1 | Version: Vault v1.1.2
vault_1 | Version Sha: 0082501623c0b704b87b1fbc84c2d725994bac54
vault_1 |
vault_1 | ==> Vault server started! Log data will stream in below:
复制代码
访问咱们在 Traefik 中定义的域名:vault.lab.com ,而后会看到下面的界面。
这里我的使用的时候,能够都填写“1”,减小使用的“复杂度”。
根据上一步的设置,Vault 会给咱们提供自动生成的秘钥,分别用于接口验证、系统登陆使用。
使用上面的秘钥登陆系统后,就可以看到登陆界面了,系统默认会提供一个 名为 cubbyhole
的“储存仓库”,咱们能够在这里添加任意内容,好比:
接口声明完成以后,咱们就可使用 ** curl** 来验证刚刚配置内容啦,好比:
curl --header "X-Vault-Token: s.oaLMHNEBsW8KrmtDqxczfriI" \
http://vault.lab.com/v1/cubbyhole/soulteary
复制代码
获得的响应结果就是咱们以前设置的内容:
{"request_id":"7e333ef7-60e7-ea5f-a892-d53dae0fd058","lease_id":"","renewable":false,"lease_duration":0,"data":{"hello":"world"},"wrap_info":null,"warnings":null,"auth":null}
复制代码
若是你要添加字段能够从控制台中添加,固然也能够更简单的使用接口请求来完成需求:
curl -X POST \
--header "X-Vault-Token: s.oaLMHNEBsW8KrmtDqxczfriI" \
--data '{"versions": [1, 2]}' \
http://vault.lab.com/v1/cubbyhole/soulteary
复制代码
好比上面的请求就会在接口内容中添加 version
字段,若是你使用 curl 去验证,获得的结果将会包含咱们刚刚添加的内容:
curl -X POST \
--header "X-Vault-Token: s.oaLMHNEBsW8KrmtDqxczfriI" \
--data '{"versions": [1, 2]}' \
http://vault.lab.com/v1/cubbyhole/soulteary
复制代码
若是是小团队、我的使用,接口调用过程当中的认证要求验证就显得不是很必要了,这个时候咱们能够经过反向代理添加额外的验证头的模式,来让验证自动完成,简化调用过程。
使用 Traefik 来解决这个问题会很是简单,在 docker-compose.yml
中填写下面的配置:
- "traefik.frontend.headers.customRequestHeaders=X-Vault-Token:s.oaLMHNEBsW8KrmtDqxczfriI"
复制代码
从新启动应用,每当客户端请求接口地址的时候,Traefik 会自动带上验证信息,以前的调用请求能够简化为:
curl -X POST \
--data '{"versions": [1, 2]}' \
http://vault.lab.com/v1/cubbyhole/soulteary
复制代码
不管是使用默认的 cubbyhole
储存仓库、仍是使用最多见的 kv
储存仓库,默认数据是没有版本控制的,换言之,一旦出现错误的更新或者删除,原始数据遭到了复写,问题是不可逆的。
因此 Vault 还提供了 名为 KV v2
的储存仓库,在这个模式之下,数据储存是有版本控制功能的,可是使用起来稍稍麻烦一些,接口文档也不是很清晰,因此这里单独聊一下,如何使用 v2 版本的 KV 进行数据储存。
举个例子,咱们在界面中建立一个名为 kv
的“储存仓库”。
建立数据须要使用 POST
方式,数据须要使用 JSON 格式进行提交:
curl -X POST \
-d '{"data":{"value":"bar"}}' \
http://vault.lab.com/v1/kv/data/soulteary.json
复制代码
若是执行顺利,你将获得相似下面的结果:
{"request_id":"269cd59b-51de-b8cf-1dd9-7b7db30aac37","lease_id":"","renewable":false,"lease_duration":0,"data":{"created_time":"2019-05-02T12:54:24.4109531Z","deletion_time":"","destroyed":false,"version":1},"wrap_info":null,"warnings":null,"auth":null}
复制代码
若是你要建立的数据已经存在,vault 默认会对一样地址的接口建立一个新的版本。
获取数据使用 GET 方式,以前提到 KV 2.0
支持多个版本,因此请求的时候能够选择性的带上版本参数。
curl -X GET http://vault.lab.com/v1/kv/data/soulteary.json
curl -X GET http://vault.lab.com/v1/kv/data/soulteary.json?version=1
复制代码
若是执行顺利,你将获得相似下面的结果:
{"request_id":"4ab6cdf7-2faf-ee5c-71b5-ec2540605af7","lease_id":"","renewable":false,"lease_duration":0,"data":{"data":{"value":"bar"},"metadata":{"created_time":"2019-05-02T12:54:24.4109531Z","deletion_time":"","destroyed":false,"version":1}},"wrap_info":null,"warnings":null,"auth":null}
复制代码
删除某个版本的数据可使用两种方式,第一种方式是请求接口中包含 delete
关键字,像是这样:
curl -X POST \
-d '{"versions": [1, 2]}' \
http://vault.lab.com/v1/kv/delete/soulteary.json
复制代码
第二种方式则更简洁一些,使用 DELETE 方法进行请求:
curl -X DELETE http://vault.lab.com/v1/kv/data/soulteary.json
复制代码
恢复数据和删除数据相似,把关键字替换为 undelete
就能够了。
curl -X POST \
-d '{"versions": [1, 2]}' \
http://vault.lab.com/v1/kv/undelete/soulteary.json
复制代码
至于其余接口能够自行了解文档。
先写到这里吧,基本上已经可以知足通常的 CI/CD 需求、甚至能够做为小型的 CMS 来使用了。
最近整理草稿箱,发现堆积的内容有点多(九十五篇),但愿儿童节前能多清空一些 :d
--EOF
我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。
在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)