本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋
建立時間: 2019年05月02日 統計字數: 5494字 閱讀時間: 11分鐘閱讀 本文連結: soulteary.com/2019/05/02/…
使用 Docker 和 Traefik 搭建 Vault
隨著使用的機器、服務越來越多,專案中依賴的變數、配置、祕鑰等敏感資訊,變的越來越多。與之相對的,針對這些內容的管理、維護成本,也變的越來越高。慶幸的是,我們可以藉助“配置中心”的方式來解決問題。
大型網際網路公司因為各種原因一般會選擇自研、或基於開源專案進行“魔改”。然而對於個人或者小規模的研發團隊來講,開源社群的 Vault 不失為一個不錯的解決方案,能夠做到“開袋即食”。
本篇文章將會介紹 Vault 如何搭配 Traefik 、Compose 一起使用,如果你有閱讀我之前的文章,或者有一定的基礎,全部操作時間在五分鐘左右。
關於 Vault
Vault 是出名的效率工具開發廠商 HashiCorp 旗下的產品,和 GitLab 的模式一樣,分為社群版和企業版。對於一般的需求而言,社群版足夠使用,想了解額外資訊可以看看 官方文件。
Vault 核心功能是安全的管理敏感資料,諸如:祕鑰、密碼、證書、私密配置。並支援 CLI、HTTP API 、以及Web UI 三種方式來進行互動。
Vault 除了支援執行在高度信任、有明確界限劃分、可能依賴IP白名單的私有網路中外,還支援在沒有明確界限劃分、依賴祕鑰等要素驗證的公有云中,比如:支援各種主流的雲端計算平臺。
我們先聊聊第一個場景下,Vault 的使用。
編寫 Vault 配置檔案
在編寫 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
或者資料庫、雲廠商儲存池等方案
- 本例為了演示方便使用了檔案儲存,團隊實際使用,建議使用
- 提供服務的埠地址,以及是否開啟 SSL
- 因為在容器中對外提供服務,需要繫結地址為
0.0.0.0
- 不開啟 SSL 是因為證書掛載這件事,我們交由 Traefik 來處理
- 因為在容器中對外提供服務,需要繫結地址為
- 介面資料的有效期
- Vault 所有從介面獲取的資料,需要身份認證
- 開啟 Vault Web UI
- 如果不使用 UI ,可以不進行配置
接下來我們編寫 compose
配置。
編寫 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 ,然後會看到下面的介面。
配置並開始使用 Vault
這裡個人使用的時候,可以都填寫“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
複製程式碼
使用 KV v2.0 模式
不論是使用預設的 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、程式設計上的一些問題,也會在群裡不定期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼新增好友。(請註明來源和目的,否則不會通過稽核)