Hashicorp Vault 金鑰儲存庫
本教學說明如何設定 KES 伺服器,該伺服器使用 Vault 的 K/V 引擎作為持久且安全的金鑰儲存庫
先決條件
若要啟動開發伺服器或使用 Vault CLI 與 Vault 互動,請下載 Vault 二進位檔。
Vault 伺服器
KES 需要 Vault K/V 引擎 v1 或 v2,以及 AppRole 或 Kubernetes 驗證方法的憑證。
如果您沒有現有的 Vault 叢集可用,請執行下列其中一項
- 依照 Hashicorp Vault 安裝指南建立新的叢集
- 建立單節點開發實例
以下文件討論如何使用 AppRole
驗證方法,為開發目的設定單節點開發實例。
單節點開發 Vault 實例
以下命令會以開發模式啟動 Vault 伺服器
127.0.0.1:8200
上以開發模式啟動單節點 Vault 伺服器。開發伺服器是暫時性的,不 應在生產環境中執行。將 Vault 連線至 Vault CLI
-
設定
VAULT_ADDR
端點Vault CLI 需要知道 Vault 端點
export VAULT_ADDR='https://127.0.0.1:8200'
-
設定
VAULT_TOKEN
Vault CLI 需要驗證權杖才能執行操作。
export VAULT_TOKEN=hvs.O6QNQB33ksXtMxtlRKlRZL0R
將權杖值取代為您自己的 Vault 存取權杖,例如
vault server -dev
命令輸出中提供的Root token
。 -
啟用
K/V
後端KES 會將金鑰儲存在 Vault K/V 後端。Vault 提供兩個 K/V 引擎,
v1
和v2
。MinIO 建議使用 K/V
v1
引擎。KES 的 Vault 政策取決於所選的 K/V 引擎版本。為 K/V
v1
設計的政策不適用於 K/Vv2
引擎。同樣地,為 K/Vv2
設計的政策不適用於 K/Vv1
引擎。如需有關從
v1
移轉至v2
的詳細資訊,請參閱 Hashicorp 文件,關於從 v1 升級。
設定 KES 對 Vault 的存取
-
建立 Vault 政策
Vault 政策定義 KES 伺服器可以存取的 API 路徑。建立名為
kes-policy.hcl
的文字檔。政策的內容會因使用的 K/V 引擎而異。
-
將政策寫入 Vault
以下命令會在 Vault 中建立政策
vault policy write kes-policy kes-policy.hcl
-
啟用驗證
此步驟允許 KES 伺服器向 Vault 驗證。在本教學中,我們使用
AppRole
驗證方法。vault auth enable approle
-
建立 KES 角色
以下命令會在 Vault 中新增一個名為
kes-server
的新角色vault write auth/approle/role/kes-server token_num_uses=0 secret_id_num_uses=0 period=5m
-
將政策繫結至角色
以下命令會將
kes-server
角色繫結至kes-policy
vault write auth/approle/role/kes-server policies=kes-policy
-
產生 AppRole ID
為 KES 伺服器請求 AppRole ID
vault read auth/approle/role/kes-server/role-id
-
產生 AppRole 機密
為 KES 伺服器請求 AppRole 機密
vault write -f auth/approle/role/kes-server/secret-id
AppRole 機密會以
secret_id
列印。您可以忽略secret_id_accessor
。
KES 伺服器設定
-
產生 KES 伺服器私密金鑰和憑證
以下命令會為 IP
127.0.0.1
和 DNS 名稱localhost
(作為 SAN) 產生新的 TLS 私密金鑰server.key
和自我簽署的 X.509 憑證server.cert
。如果您想要使用另一個 IP 或 DNS 名稱 (例如10.1.2.3
或https://kes.example.net
) 來參照您的 KES 伺服器,請相應調整--ip
和/或--dns
參數。kes identity new --key server.key --cert server.cert --ip "127.0.0.1" --dns localhost
以上命令會產生自我簽署的憑證。如果您已經有為您的伺服器簽發憑證的方法,您可以使用那些憑證。
用於產生 X.509 憑證的其他工具也可以運作。例如,您可以使用
openssl
openssl ecparam -genkey -name prime256v1 | openssl ec -out server.key openssl req -new -x509 -days 30 -key server.key -out server.cert \ -subj "/C=/ST=/L=/O=/CN=localhost" -addext "subjectAltName = IP:127.0.0.1"
-
產生 API 金鑰
以下命令會產生新的 KES API 金鑰。
kes identity new
輸出類似如下:
Your API key: kes:v1:ABfa1xsnIV0lltXQC8tHXic8lte7J6hT7EoGv6+s5QCW This is the only time it is shown. Keep it secret and secure! Your Identity: cf6c535e738c1dd47a1d746366fde7f0309d1e0a8471b9f6e909833906afbbfa The identity is not a secret. It can be shared. Any peer needs this identity in order to verify your API key. The identity can be computed again via: kes identity of kes:v1:ABfa1xsnIV0lltXQC8tHXic8lte7J6hT7EoGv6+s5QCW
產生的
identity
不是 機密,可以公開分享。它稍後會在 KES 組態檔中用作管理員身分或指派給政策。API 金鑰
本身是機密,不應分享。您可以隨時重新計算 API 金鑰的身分。 -
設定 KES 伺服器
建立 KES 伺服器組態檔:
config.yml
。請確保 policy 區段中的身分符合
client.crt
身分。新增先前取得的 approlerole_id
和secret_id
。admin: # Use the identity generated above by 'kes identity new'. identity: "" # For example: cf6c535e738c1dd47a1d746366fde7f0309d1e0a8471b9f6e909833906afbbfa tls: key: private.key # The KES server TLS private key cert: public.crt # The KES server TLS certificate keystore: vault: endpoint: https://127.0.0.1:8200 version: v1 # The K/V engine version - either "v1" or "v2". engine: kv # The engine path of the K/V engine. The default is "kv". approle: id: "" # Your AppRole ID secret: "" # Your AppRole Secret
-
啟動 KES 伺服器
KES CLI 存取
-
設定
KES_SERVER
端點以下環境變數指定 KES CLI 應與之通訊的 KES 伺服器
export KES_SERVER=https://127.0.0.1:7373
-
定義 CLI 存取認證
以下環境變數會設定用戶端用來與 KES 伺服器通訊的金鑰
export KES_API_KEY=kes:v1:ABfa1xsnIV0lltXQC8tHXic8lte7J6hT7EoGv6+s5QCW
將該值取代為您的伺服器 API 金鑰。當您啟動伺服器時,伺服器的 API 金鑰會顯示在輸出中。
-
測試組態
例如,檢查伺服器的狀態
kes status -k
使用金鑰來產生新的資料加密金鑰
kes key dek my-key-1 -k
命令輸出類似如下:
{ plaintext : UGgcVBgyQYwxKzve7UJNV5x8aTiPJFoR+s828reNjh0= ciphertext: eyJhZWFkIjoiQUVTLTI1Ni1HQ00tSE1BQy1TSEEtMjU2IiwiaWQiOiIxMTc1ZjJjNDMyMjNjNjNmNjY1MDk5ZDExNmU3Yzc4NCIsIml2IjoiVHBtbHpWTDh5a2t4VVREV1RSTU5Tdz09Iiwibm9uY2UiOiJkeGl0R3A3bFB6S21rTE5HIiwiYnl0ZXMiOiJaaWdobEZrTUFuVVBWSG0wZDhSYUNBY3pnRWRsQzJqWFhCK1YxaWl2MXdnYjhBRytuTWx0Y3BGK0RtV1VoNkZaIn0= }
搭配 MinIO 伺服器使用 KES
MinIO 伺服器需要 KES 才能啟用伺服器端資料加密。
請參閱 KES for MinIO 指示指南,以取得使用您的新 KES 伺服器與 MinIO 伺服器所需的其他步驟。
組態參考資料
以下章節說明金鑰加密服務 (KES) 組態設定,以使用 Hashicorp Vault 金鑰儲存區作為根 KMS,以儲存外部金鑰,例如用於 MinIO 伺服器伺服器端加密的金鑰。
進階配置
這些額外的配置步驟可能會解決特定問題。
使用 K/V 前綴進行多租戶
Vault 可以作為多個隔離的 KES 租戶的後端。每個 KES 租戶可以由 N
個副本組成。可以有 M
個 KES 租戶連接到同一個 Vault 伺服器/叢集。
這表示 N × M
個 KES 伺服器實例可以連接到單個 Vault。
在這些配置中,每個 KES 租戶在 K/V 密鑰引擎上都有一個單獨的前綴。對於每個 KES 租戶,必須有對應的 Vault 政策。
-
對於 K/V
v1
path "kv/<tenant-name>/*" { capabilities = [ "create", "read", "delete" ] }
-
對於 K/V
v2
path "kv/data/<tenant-name>/*" { capabilities = [ "create", "read" ] } path "kv/metadata/<tenant-name>/*" { capabilities = [ "list", "delete" ] }
為每個 KES 租戶建立不同的設定檔。該檔案包含租戶要使用的 Vault K/V 前綴。
keystore:
vault:
endpoint: https://127.0.0.1:8200
prefix: <tenant-name>
approle:
id: "" # Your AppRole ID
secret: "" # Your AppRole Secret
retry: 15s
status:
ping: 10s
tls:
ca: vault.crt # Manually trust the vault certificate since we use self-signed certificates
使用 Vault 命名空間進行多租戶
Vault 可以作為多個隔離的 KES 租戶的後端。每個 KES 租戶可以由 N
個副本組成。可以有 M
個 KES 租戶連接到同一個 Vault 伺服器/叢集。
這表示 N × M
個 KES 伺服器實例可以連接到單個 Vault。
因此,每個 KES 租戶在 K/V 密鑰引擎上都有一個單獨的前綴。對於每個 KES 租戶,都必須有對應的 Vault 政策。
-
對於 K/V
v1
path "kv/<tenant-name>/*" { capabilities = [ "create", "read", "delete" ] }
-
對於 K/V
v2
path "kv/data/<tenant-name>/*" { capabilities = [ "create", "read" ] } path "kv/metadata/<tenant-name>/*" { capabilities = [ "list", "delete" ] }
為每個 KES 租戶使用不同的設定檔。該檔案包含 KES 租戶應該使用的 Vault 命名空間。
keystore:
vault:
endpoint: https://127.0.0.1:8200
namespace: <vault-namespace>
approle:
id: "" # Your AppRole ID
secret: "" # Your AppRole Secret
retry: 15s
status:
ping: 10s
tls:
ca: vault.crt # Manually trust the vault certificate since we use self-signed certificates
加密 Vault 儲存的金鑰
Hashicorp 的 Transit 功能提供了一種加密和解密儲存在 Vault 中的金鑰的方法。這提供了一個額外的加密層,在特定情況下可能會很有用。
啟用後,Hashicorp 會在 Vault 中儲存一個金鑰,以加密或解密儲存在 Vault 中的其他金鑰。然後,KES 使用 Vault 管理的金鑰來儲存或從 Vault 檢索金鑰。
要設定 Transit,請將以下區段新增至 KES 設定 YAML 的 keystore.vault
區段
keystore:
vault:
transit: # Optionally encrypt keys stored on the K/V engine with a Vault-managed key.
engine: "" # The path of the transit engine - e.g. "my-transit". If empty, defaults to: transit (Vault default)
key: "" # The key name that should be used to encrypt entries stored on the K/V engine.