<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-1558)”/>
<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#fbbf24”/>
<矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#fbbf24”不透明度=“0.15”/>
1. Vault 代理人概述
Vault Agent 是一個守護程序用戶端,與應用程式一起運行,自動處理身份驗證、令牌更新和秘密檢索。代理解決了“秘密零”問題 - 應用程式不需要知道如何使用 Vault 進行身份驗證。
主要功能
自動驗證 — 自動驗證與更新令牌
範本渲染 - 將機密渲染到設定檔
快取 - 快取回應以減少 Vault 伺服器上的負載
API 代理 - 應用程式呼叫代理程式而不是直接呼叫 Vault
架構
<前><代碼>┌────────────────────────────────────────────────┐ │ 應用主機 │ │ │ │ ┌──────────┐ ┐────────────────┐ │ │ │ 應用程式 │ 讀取檔案 │ Vault Agent │ │ │ │ │ ◀──────────── │ │ │ │ │ │ (呈現 │ 自動驗證 │ │ │ │ │ 範本) │ 範本 │ │ │ │ │ │ 快取 │ │ │ └──────────┘ └────────┬────────┘ │ │ │ │ └──────────────────────────────────────┼──────────┘ │ 保險庫 API (HTTPS) │ ▼ ┌────────────┐ │ 保管庫伺服器 │ └────────────┘
2.自動驗證
自動驗證會自動使用 Vault 進行驗證並更新令牌。支援所有身份驗證方法:
#Vault-agent.hcl
vault {
位址 = "https://vault.company.com:8200"
tls_skip_verify = false
}自動驗證{
方法“kubernetes”{
mount_path =“auth/kubernetes”
配置={
角色=“網頁應用程式”
}
}
# Lưu token vào 文件
接收器「檔案」{
配置={
路徑 =“/tmp/vault-token”
模式=0640
}
}
# Lưu token vào file khác (wrapped)
接收器「檔案」{
包裹_TTL =“5m”
配置={
路徑 =“/tmp/vault-token-wrapped”
}
}
}
使用 AppRole 自動驗證
auto_auth {
方法“approle”{
mount_path =“auth/approle”
配置={
role_id_file_path = "/etc/vault/角色 ID"
Secret_id_file_path =“/etc/vault/secret-id”
刪除_secret_id_file_after_reading = true
}
}
接收器「檔案」{
配置={
路徑 =“/tmp/vault-token”
}
}
}
使用 AWS IAM 自動驗證
auto_auth {
方法“aws”{
mount_path =“auth/aws”
配置={
類型=“iam”
角色=“網頁應用程式”
header_value =“vault.company.com”
}
}
接收器「檔案」{
配置={
路徑 =“/tmp/vault-token”
}
}
}
3.範本渲染
Vault Agent 使用Consul Template 語法將機密呈現到設定檔。當秘密發生變化時,模板會自動重新渲染。
範本配置
#Vault-agent.hcl (tiếp)
模板{
來源=“/etc/vault/templates/app.conf.tpl”
目的地=“/etc/app/app.conf”
燙髮 = 0640
command = "systemctl reload app" # Chạy sau khi 渲染
error_on_missing_key = true
}
模板{
來源=“/etc/vault/templates/db.env.tpl”
目的地=“/etc/app/db.env”
燙髮 = 0600
}
# 內聯模板(không cần 檔案 tpl)
模板{
內容 = "{{ 有秘密 \"secret/data/app/config\" }}DB_HOST={{ .Data.data.host }}{{ end }}"
目的地=“/etc/app/db-host”
}
範本語法
# /etc/vault/templates/app.conf.tpl
# KV v2 秘密
{{ 帶有秘密「秘密/資料/生產/資料庫」}}
DB_HOST={{ .Data.data.host }}
DB_PORT={{ .Data.data.port }}
DB_NAME={{ .Data.data.database }}
DB_USER={{ .Data.data.使用者名稱 }}
DB_PASS={{ .Data.data.password }}
{{結束}}
# 動態資料庫憑證
{{ 帶有秘密「database/creds/app-role」}}
DB_DYNAMIC_USER={{ .Data.使用者名稱 }}
DB_DYNAMIC_PASS={{ .Data.password }}
# 租約:{{ .LeaseID }} ({{ .LeaseDuration }}s)
{{結束}}
# PKI 證書
{{ 帶有秘密“pki/issue/app-cert”“common_name=app.company.com”“ttl=24h”}}
{{.Data.憑證}}
{{ .Data.private_key }}
{{結束}}
# 有條件的
{{ 帶有秘密「秘密/資料/生產/功能標誌」}}
{{ 如果.Data.data.enable_cache }}
CACHE_ENABLED=true
CACHE_TTL={{ .Data.data.cache_ttl }}
{{其他}}
CACHE_ENABLED=假
{{結束}}
{{結束}}
環境變數範本
# /etc/vault/templates/db.env.tpl
{{ 帶有秘密「秘密/資料/生產/資料庫」-}}
導出 DB_HOST="{{ .Data.data.host }}"
導出 DB_PORT="{{ .Data.data.port }}"
導出 DB_USER="{{ .Data.data.使用者名稱 }}"
導出 DB_PASS="{{ .Data.data.password }}"
{{-結束}}
4.代理快取
# 快取配置
緩存{
use_auto_auth_token = true
堅持{
類型=“kubernetes”
路徑 =“/vault/代理快取”
}
}
偵聽器“tcp”{
地址 =“127.0.0.1:8100”
tls_disable = true
}
應用程式呼叫代理程式 (localhost:8100),而不是直接呼叫 Vault 伺服器。代理程式快取回應並自動處理身份驗證。
5.保險庫代理
Vault Proxy(Vault 1.14+)是 Vault Agent 的簡化版本,專注於API 代理程式和快取,無需模板渲染。
#Vault-proxy.hcl
vault {
位址 = "https://vault.company.com:8200"
}
自動驗證{
方法“kubernetes”{
mount_path =“auth/kubernetes”
配置={
角色=“網頁應用程式”
}
}
}
api_代理{
use_auto_auth_token = “強制”
}
緩存{
use_auto_auth_token = true
堅持{
類型=“kubernetes”
路徑 =“/vault/代理快取”
}
}
偵聽器“tcp”{
地址 =“127.0.0.1:8100”
tls_disable = true
}
靜態秘密快取
# 快取靜態機密 (KV v2)
緩存{
use_auto_auth_token = true
堅持{
類型=“kubernetes”
路徑 =“/vault/代理快取”
}
# 靜態秘密快取 (mới)
static_secret_token_wait = "5s"
}
6.代理與代理人-何時使用哪一個?
<表> <標題>
功能Vault代理Vault代理 <正文> 自動驗證✅✅ 模板渲染✅❌ API代理✅✅ 快取✅✅ 流程主管✅❌ 佔地面積較大較小 用例需要渲染檔案只需要代理API代理:當應用程式從檔案(設定檔、環境檔案)讀取機密時
代理:應用直接呼叫Vault API時,需要快取和自動驗證
7.部署模式
Systemd 服務
# /etc/systemd/system/vault-agent.service
[單位]
描述=Vault 代理
需要=網路在線.target
After=網路在線.target
[服務]
使用者=保管庫
組=庫
ExecStart=/usr/bin/vault 代理-config=/etc/vault/agent.hcl
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGTERM
重新啟動=失敗時
重啟秒=5
限制NOFILE=65536
[安裝]
WantedBy=多用戶.target
Docker Sidecar
# docker-compose.yml
服務:
vault-agent:
圖片:hashicorp/vault:1.21
指令:vault代理-config=/vault/config/agent.hcl
卷:
- ./agent.hcl:/vault/config/agent.hcl:ro
- ./模板:/vault/模板:ro
- 共享秘密:/vault/secrets
重新啟動:除非停止
網路應用程式:
圖:myapp:最新
卷:
- 共享秘密:/etc/app/secrets:ro
取決於:
- 保險庫代理
卷:
共享秘密:
Kubernetes 初始化容器
api版本:v1
種類: 豆莢
元數據:
名稱: 網路應用程式
規格:
初始化容器:
- 名稱:vault-agent-init
圖片:hashicorp/vault:1.21
指令:[“vault”,“agent”,“-config=/vault/config/agent.hcl”,“-exit-after-auth”]
體積安裝:
- 姓名:vault-config
掛載路徑:/vault/config
- 名稱:金庫秘密
掛載路徑:/vault/secrets
容器:
- 名稱:網頁應用程式
圖:myapp:最新
體積安裝:
- 名稱:金庫秘密
掛載路徑:/etc/app/secrets
只讀:真
卷:
- 姓名:vault-config
配置映射:
姓名:vault-agent-config
- name: vault-secrets
空目錄:
媒體:記憶體
8。摘要
Vault Agent — 全功能守護程式:自動驗證、範本、快取、API 代理程式
Vault 代理 - 輕量級代理:自動驗證、快取、API 代理(無範本)
自動驗證 - 自動驗證和更新令牌,解析 Secret Zero
範本 - 將機密渲染到設定檔中,機密變更時會自動重新渲染
部署模式 - systemd、Docker sidecar、K8s init/sidecar 容器
下一篇文章將深入探討 Kubernetes 上的 Vault — Helm 圖表、Vault Secrets Operator、CSI 提供者和代理注入器。