如果你希望追蹤最新的草稿,請見鐵人賽2023
本 workshop 也接受網友的許願清單,如果有興趣的題目可於第一篇底下留言,筆者會盡力實現,但不做任何保證
整篇 Workshop 會使用的範例與原始碼,放在 Github Repository: vault-playground
在開始進行 Vault 30 天 workshop 之前,有一些準備工作需要完成:
步驟1:下載 Vault Binary
首先,你需要下載HashiCorp Vault的最新版本。你可以在HashiCorp的官方網站上找到Vault的下載鏈接。請確保下載適用於你操作系統的版本。
https://developer.hashicorp.com/vault/downloads
步驟2:安裝Vault
下載完成後,根據你的操作系統進行安裝。對於大多數Linux和Unix系統,你c可以通過解壓縮壓縮文件來安裝Vault。將Vault Binary文件移至你的PATH中,以便在終端中輕鬆訪問
筆者使用的是 Mac M1,使用以下指令進行安裝
wget https://releases.hashicorp.com/vault/1.14.3/vault_1.14.3_darwin_arm64.zip
unzip vault_1.14.3_darwin_arm64.zip
sudo mv vault /usr/local/bin/vault
Vault v1.14.3 (56debfa71653e72433345f23cd26276bc90629ce), built 2023-09-11T21:23:55Z
你不需要使用最新版本的 Vault 也可以完成這次 workshop
使用以下指令在本地啟動 Vault Server。請確保 Vault 伺服器已正確啟動,並且未出現錯誤消息。
vault server -dev
使用 -dev 選項可以啟動Vault的開發模式,該模式不需要身份驗證即可運行Vault。
打開你的瀏覽器,瀏覽到 http://127.0.0.1:8200
或者使用 curl 命令發送 GET 請求:
curl http://127.0.0.1:8200/v1/sys/health | jq
{
"initialized": true,
"sealed": false,
"standby": false,
"performance_standby": false,
"replication_performance_mode": "disabled",
"replication_dr_mode": "disabled",
"server_time_utc": 1694693898,
"version": "1.14.3",
"cluster_name": "vault-cluster-3273d150",
"cluster_id": "a32d555e-3346-0757-1d57-21e2f646aaf3"
}
如果Vault正常運行,你應該會收到一個包含Vault訊息的JSON response。
也可使用 Vault Binary 來存取 Vault API
export Vault Server 的 http endpoint (我們尚未啟動 tls listener,所以沒有 https endpoint)
export VAULT_ADDR='http://127.0.0.1:8200'
vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.14.3
Build Date 2023-09-11T21:23:55Z
Storage Type inmem
Cluster Name vault-cluster-3273d150
Cluster ID a32d555e-3346-0757-1d57-21e2f646aaf3
HA Enabled false
可以看到本地的 Vault server
也可以使用 Vault Binary 中的 operator 指令檢測
vault operator members
Host Name API Address Cluster Address Active Node Version Upgrade Version Redundancy Zone Last Echo
--------- ----------- --------------- ----------- ------- --------------- --------------- ---------
CheChias-MacBook-Pro.local http://127.0.0.1:8200 https://127.0.0.1:8201 true 1.14.3 n/a n/a n/a
在開發模式下運行的Vault可能不需要初始化,但如果你使用的是 production 模式,請參考Vault的官方文檔,進行初始化和設置。
Vault server 在 dev 模式下啟動後,會自動產生一隻單一個 unseal key,與一把 Root Token。
WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.
You may need to set the following environment variables:
$ export VAULT_ADDR='http://127.0.0.1:8200'
The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.
Unseal Key: JbKrVzhH4VO14nPBRvWE1qxJz9CVhnOFJT0pYLsx9LU=
Root Token: hvs.0pmmzGSZ8S7w8vP2E4sm7SqE
Development mode should NOT be used in production installations!
你可以使用 vault operator 指令,嘗試 seal Vault server
vault operator seal
Success! Vault is sealed.
再次檢查 status
vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 1
Threshold 1
Unseal Progress 0/1
Unseal Nonce n/a
Version 1.14.3
Build Date 2023-09-11T21:23:55Z
Storage Type inmem
HA Enabled false
顯示為密鑰密封(Sealed)狀態
你可以使用 vault operator 解封 Vault
vault operator unseal JbKrVzhH4VO14nPBRvWE1qxJz9CVhnOFJT0pYLsx9LU=
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.14.3
Build Date 2023-09-11T21:23:55Z
Storage Type inmem
Cluster Name vault-cluster-3273d150
Cluster ID a32d555e-3346-0757-1d57-21e2f646aaf3
HA Enabled false
顯示為解封狀態
本 workshop 中使用的 vault server / seal key / root token 都是測試用途的暫時性存在,筆者寫完文章後,這些 server 與密鑰早已經清理完畢,所以沒有資安風險。
為了示範方便,workshop 會以明碼 plain text 形式表現
如果你是在公司的 production 環境使用,務必要確保密鑰的安全
你可能會問,本地不能存,遠端也不能存,也不能隨意傳送給同事,那應該如何協作與管理?
在後面的 workshop 內容會與大家一一示範解說
你可以關閉執行 vault server 的 terminal session 來關閉 vault server
vault server -dev
ctrl + c
https://developer.hashicorp.com/vault/docs/concepts/dev-server
"Dev" 伺服器模式
dev 模式的伺服器不需要進一步的設定,且你本地的 vault CLI 已經被認證。這使得使用 Vault 或啟動用於開發的 Vault instance 變得容易。Vault 的每一個功能在 "dev" 模式中都是可用的。-dev flag 只是將很多設置簡化為不安全的默認值。
警告:永遠、永遠、永遠不要在生產環境中運行 "dev" 模式伺服器。這是不安全的,且每次重新啟動都會丟失資料(因為它將資料存儲在記憶體中)。它僅供開發或實驗使用。
dev 伺服器的屬性(有些可以使用命令行 flag 或指定配置文件來覆寫):
初始化且未封印: 伺服器將自動初始化且未封印。你不需要使用 vault operator unseal。它立即可用。
記憶體存儲: 所有資料(加密後)都存儲在記憶體中。Vault 伺服器不需要任何檔案權限。
綁定到本地地址而不使用 TLS: 伺服器正在監聽 127.0.0.1:8200(默認的伺服器地址)而不使用 TLS。
自動認證: 伺服器存儲了你的 root access token,所以 vault CLI 存取已經準備好。如果你透過 API 存取 Vault,你需要使用打印出的 token 進行認證。
單一解封鑰匙: 伺服器使用單一的 unseal key 進行初始化。Vault 已經是解封的,但如果你想嘗試 seal/unseal,那麼只需要輸出的單一鑰匙。
安裝 key value storage: 在 secret/ 處安裝了一個 v2 KV secret engine。請注意 v1 KV 有所不同。如果你想使用 v1,使用此旗標 -dev-kv-v1。
建立通用 Key-Value 存儲: 使用以下命令在 Vault 中創建通用的 Key-Value 存儲。在這個例子中,我們將使用 secrets 作為存儲的路徑,你可以根據你的需求自行命名存儲路徑:
vault kv put secret/mysecrets username=admin password=secretpassword
這個命令將在 Vault 中創建一個 Key-Value 存儲,其中包含一對 Key value pair,分別是 username 和 password。
檢索存儲的值: 你可以使用以下命令檢索存儲中的值:
vault kv get secret/mysecrets
這個命令將返回存儲中的所有 Key Value pair。
更新存儲的值: 如果你需要更新存儲中的值,可以使用以下命令:
vault kv put secret/mysecrets password=newsecretpassword
這個命令將更新存儲中的 password 鍵的值。
刪除存儲的值: 若要刪除存儲中的值,可以使用以下命令:
vault kv delete secret/mysecrets
這個命令將刪除整個存儲路徑及其內容
dev 模式下,Vault server 自動在 secret/ 處安裝了一個 v2 KV secret engine
Vault中的不同秘密引擎(Secret Engine)提供了不同的功能和特性。本次 workshop 會以最新,功能也最多元的 kv-v2 Secret Engine 為主。
以下是三種常見的秘密引擎(generic、kv v1 和 kv v2)之間的主要區別:
特性: 通用秘密引擎是你的最簡單的引擎之一,它允許你存儲和檢索通用的 Key Value Secret,這些 Secret 不需要特定的結構或格式。
用法: 通用秘密引擎適用於簡單的秘密存儲需求,其中 Secret 可以是任何形式的數據。你可以使用通用秘密引擎來存儲API金鑰、密碼、配置信息等。
特性: KV v1秘密引擎引入了一個有層次結構的鍵值存儲,允許你組織和版本控制儲存的 Secret。它具有 Secret 版本控制功能,可以保存多個版本的 Secret。
用法: KV v1引擎適用於需要有組織結構並希望保留秘密版本的情況。它可以用於存儲配置信息、TLS證書、API金鑰等。
特性: KV v2秘密引擎是KV v1的進化版本,它引入了更強大的特性,如可配置的 Secret Data type(如字符串、list 和 dict),並可設置的多版本的 Secret 存儲。
用法: KV v2引擎適用於更複雜的秘密管理需求,其中秘密可能具有不同的數據類型,並且需要更靈活的版本管理。它也用於配置信息、TLS證書、API金鑰等。
總結來說,通用秘密引擎適用於簡單的秘密存儲,而KV v1和KV v2秘密引擎適用於更複雜的秘密管理需求,具有更多的組織和版本控制功能。在選擇引擎時,請考慮你的具體需求和Vault的配置。通常,KV v2引擎是較新和更靈活的選擇,但根據你的情況,也可以考慮使用其他引擎。
dev 伺服器應該用於實驗 Vault 的功能,例如不同的認證方法、Secret engine、audit device 等。
除了實驗,dev 伺服器對於開發環境的自動化非常容易。
通過執行這些步驟,你可以確保本地安裝的 Vault Binary 正常運行。
請注意,Vault的實際配置和使用將根據你的需求和環境而有所不同,這些步驟主要用於確保Vault的基本功能正常運行。在 production 環境中,你需要更多的配置和安全性措施。