使用 Docker 和 Traefik 搭建 Vault

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)html

本文做者: 蘇洋docker

建立時間: 2019年05月02日 統計字數: 5494字 閱讀時間: 11分鐘閱讀 本文連接: soulteary.com/2019/05/02/…數據庫


使用 Docker 和 Traefik 搭建 Vault

隨着使用的機器、服務愈來愈多,項目中依賴的變量、配置、祕鑰等敏感信息,變的愈來愈多。與之相對的,針對這些內容的管理、維護成本,也變的愈來愈高。慶幸的是,咱們能夠藉助「配置中心」的方式來解決問題。編程

大型互聯網公司由於各類緣由通常會選擇自研、或基於開源項目進行「魔改」。然而對於我的或者小規模的研發團隊來說,開源社區的 Vault 不失爲一個不錯的解決方案,可以作到「開袋即食」。json

本篇文章將會介紹 Vault 如何搭配 Traefik 、Compose 一塊兒使用,若是你有閱讀我以前的文章,或者有必定的基礎,所有操做時間在五分鐘左右。安全

關於 Vault

Vault 是出名的效率工具開發廠商 HashiCorp 旗下的產品,和 GitLab 的模式同樣,分爲社區版和企業版。對於通常的需求而言,社區版足夠使用,想了解額外信息能夠看看 官方文檔bash

Vault 核心功能是安全的管理敏感數據,諸如:祕鑰、密碼、證書、私密配置。並支持 CLI、HTTP API 、以及Web UI 三種方式來進行交互。網絡

Vault 除了支持運行在高度信任、有明確界限劃分、可能依賴IP白名單的私有網絡中外,還支持在沒有明確界限劃分、依賴祕鑰等要素驗證的公有云中,好比:支持各類主流的雲計算平臺。frontend

咱們先聊聊第一個場景下,Vault 的使用。curl

編寫 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

Vault 初始化界面

這裏我的使用的時候,能夠都填寫「1」,減小使用的「複雜度」。

保存 Vault 管理祕鑰

根據上一步的設置,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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索