<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-6200)”/>
<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#fb923c”/>
<矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#fb923c”不透明度=“0.15”/>
1.驗證方法概述
驗證方法是 Vault 用於對客戶端進行身份驗證的機制 - 在允許存取機密之前確定「您是誰」。每個身份驗證方法都在單獨的路徑中啟用,並在成功身份驗證後返回Vault 令牌。
驗證過程
┌──────────┐ 1. 登入請求 ┌──────────────┐
│ 用戶端 │ ────────────────────▶ │ 認證方式 │
│ │ │ (應用角色, │
│ │ 4. Vault 令牌 │ LDAP、K8s) │
│ │ ◀──────────────────── │ │
└──────────┘ └────────┬────────┘
│
2. 驗證身份
│
3. 映射到政策
▼
┌────────────┐
│ 身分 │
│ + 政策 │
└────────────┘
驗證方法類型
<表> <標題>
群組身份驗證方法物件 <正文> 內建令牌所有客戶端 人類使用者密碼、LDAP、OIDC操作員、開發人員 機器AppRole、JWTCI/CD、應用程式 雲AWS、Azure、GCP雲工作負載 平台Kubernetes、SPIFFE容器工作負載啟用驗證方法
# 啟用 auth 方法 tại 預設路徑
vault auth enable userpass
# 啟用自訂路徑
vault auth enable -path=company-ldap ldap
# 使用 auth 方法啟用
vault auth list# 禁用身份驗證方法 (cẩn thận - xóa toàn bộ data)
vault auth disable userpass
2. Token認證方式
令牌驗證方法是唯一始終啟用的身份驗證方法且無法停用。所有其他身份驗證方法最終都會傳回 Vault 令牌。 Token是Vault的核心認證機制。
令牌類型
<表> <標題>
類型儲存可更新子代幣用例 <正文> 服務令牌是(儲存中)是是長期操作 批量令牌否否否高容量、短暫建立令牌
# Tạo token với 預設策略
vault token create
# Tạo 代幣 với 政策 cụ thể
vault token create \
-policy =“應用程式只讀”\
-policy="db-creds" \
-ttl=1h \
-顯示名稱=“應用程式服務”
# Tạo 孤兒代幣(không có 父代)
vault token create -orphan \
-policy=「監控」\
-ttl=24小時
# Tạo 批量令牌
vault token create \
-類型=批次\
-policy =“應用程式只讀”\
-ttl=30m
# Tạo 週期性令牌 (không bao giờ expire nếu renew đúng hạn)
vault token create \
-policy="長期運行服務" \
-週期=24小時
根令牌
根令牌可以存取整個保管庫。僅應在緊急情況下使用:
# Tạo 根令牌 mới(cần 仲裁解封密鑰)
vault operator generate-root -init
vault operator generate-root \
-隨機數字=“...”\
-otp=“...”
# 撤銷根令牌 sau khi dùng xong
vault token revoke <root-token>
最佳實務:不要儲存根令牌。需要時創建,使用後立即撤銷。
令牌角色
# Tạo 令牌角色 cho CI/CD
vault write auth/token/roles/ci-cd \
allowed_policies="ci-deploy,ci-readonly" \
disallowed_policies =“管理員,根”\
孤兒=真\
可再生=真\
token_period=1h \
token_type=服務\
token_bound_cidrs="10.0.0.0/8"
# Tạo 代幣 từ 角色
vault token create -role=ci-cd
令牌存取器
令牌存取器允許在不知道令牌值的情況下進行令牌管理:
# 尋找令牌 bằng 存取器
vault token lookup -accessor <accessor>
# 撤銷令牌 bằng 存取器
vault token revoke -accessor <accessor>
# 標記存取器
vault list auth/token/accessors
3.使用者密碼驗證方法
Userpass 是人類使用者最簡單的驗證方法 - 使用使用者名稱和密碼進行驗證。適合小型環境或測試。
啟用並設定
# 啟用使用者密碼
vault auth enable userpass
# Tạo 用戶 với 政策
vault write auth/userpass/users/john.doe \
密碼=“s3cur3P@ssw0rd”\
策略=“dev-readonly,dev-kv”\
token_ttl=8h \
token_max_ttl=24小時# Tạo 用戶 với CIDR 綁定
vault write auth/userpass/users/admin.user \
密碼=“adm1nP@ss”\
保單=“管理員”\
token_ttl=2h \
token_bound_cidrs="10.10.0.0/16,192.168.1.0/24"
# Liệt kê 用戶
vault list auth/userpass/users
# Đọc thông 錫用戶
vault read auth/userpass/users/john.doe
登入
# 透過 CLI 登入
vault login -method=userpass \
使用者名稱=john.doe \
密碼=“s3cur3P@ssw0rd”
# 使用 API 登入
curl -s --request POST \
--data '{"密碼": "s3cur3P@ssw0rd"}' \
${VAULT_ADDR}/v1/auth/userpass/login/john.doe | ${VAULT_ADDR}/v1/auth/userpass/login/john.doe | jq .
密碼原則
Vault 1.5+ 支援密碼原則以強制密碼複雜度:
# Tạo 密碼原則
vault write sys/policies/password/strong-password policy=-<<EOF
長度=20
規則“字符集”{
字符集 =“abcdefghijklmnopqrstuvwxyz”
最小字元數 = 2
}
規則“字符集”{
字符集 =“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
最小字元數 = 2
}
規則“字符集”{
字符集=“0123456789”
最小字元數 = 2
}
規則“字符集”{
字元集 = "!@#$%^&*()-_=+[]{}|;:,.<>?"
最小字元數 = 2
}
EOF
# Sinh 密碼 theo 策略
vault read sys/policies/password/strong-password/generate
# 設定密碼原則 cho userpass
vault write auth/userpass/users/secure.user \
密碼=“$(保管庫讀取-欄位=密碼sys /政策/密碼/強密碼/產生)”\
政策=“開發唯讀”
更新與刪除使用者
# Cập nhật 密碼
vault write auth/userpass/users/john.doe \
密碼=“n3wP@ssw0rd!”
# Cập nhật 政策(không thay đổi 密碼)
vault write auth/userpass/users/john.doe/policies \
策略 =“dev-readonly、dev-kv、staging-deploy”
# Xóa 用戶
vault delete auth/userpass/users/john.doe
4. AppRole驗證方法
AppRole 是為機器對機器驗證設計的驗證方法。這是應用程式和 CI/CD 管道使用 Vault 進行身份驗證的最常見方法。
Khái niệm cốt lõi
<預><代號>┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ 應用角色登入 │ │ │ │ RoleID(公共識別碼) │ │ + SecretID (私人憑證) │ │ = Vault 令牌(具有指定的策略) │ │ │ │ Tương tự: 使用者名稱 + 密碼 = 會話令牌 │ └──────────────────────────────────────────────────────────┘
<表> <標題>
元素描述相似 <正文> 角色ID角色公共識別碼使用者名稱 SecretID秘密憑證,短期密碼啟用並建立角色
# 啟用 AppRole
vault auth enable approle
# Tạo 角色 cho Web 應用程式
vault write auth/approle/role/webapp \
token_policies =“webapp-policy,db-readonly”\
token_ttl=1h \
token_max_ttl=4h \
Secret_id_ttl=30m \
Secret_id_num_uses=1 \
token_num_uses=0 \
bind_secret_id=true# 在 CI/CD 管道中發揮作用
vault write auth/approle/role/cicd-pipeline \
token_policies="cicd-deploy" \
token_ttl=30m \
token_max_ttl=1h \
Secret_id_ttl=10m \
Secret_id_num_uses=1 \
token_num_uses=10 \
bind_secret_id=true \
Secret_id_bound_cidrs="10.0.0.0/8" \
token_bound_cidrs="10.0.0.0/8"
重要參數
<表> <標題>
參數描述建議 <正文>secret_id_ttlSecretID的TTL越短越好(5-30m)
secret_id_num_usesSecretID使用次數1(一次性使用)
token_ttlToken預設TTL足以運行
token_max_ttl最大 TTL(包括續訂)合理限制
token_num_uses令牌使用次數0 = 無限制
secret_id_bound_cidrsCIDR允許使用SecretID透過網路限制
token_bound_cidrsCIDR允許使用令牌透過網路限制
登入流程
# Bước 1: Lấy RoleID(thường được 烘焙 vào 配置/影像)
vault read auth/approle/role/webapp/role-id
# 角色_id db02de05-fa39-4855-059b-67f86261c393
# Bước 2:Sinh SecretID(thường do Trusted Orchestrator Sinh)
vault write -f auth/approle/role/webapp/secret-id
#secret_id 6a174c20-f6de-a53c-74d2-6018fcceff64
#secret_id_accessor c454f7e5-996e-7230-6074-6ef26b7bcf86
# Bước 3:登入
vault write auth/approle/login \
role_id="db02de05-fa39-4855-059b-67f86261c393" \
Secret_id =“6a174c20-f6de-a53c-74d2-6018fcceff64”
回應包裝 cho SecretID
回應包裝是一種重要的安全機制-SecretID被「包裝」在短期包裝令牌中。只有目標應用程式可以解包:
# Sinh SecretID với 回應包裝 (TTL 120 giây)
vault write -wrap-ttl=120s -f auth/approle/role/webapp/secret-id
# 回應 chứawrapping_token thay vìsecret_id trực tiếp
#wrapping_token:hvs.CAES...
# 包裝訪問器:...
#wrapping_token_ttl:2m
#wrapping_token_creation_time: ...
# 應用程式解開包裝並使用 SecretID
vault unwrap hvs.CAES...
#secret_id 6a174c20-f6de-a53c-74d2-6018fcceff64
# Nếu ai đó đã unwrap trước → lỗi (phát hiện MITM)
vault unwrap hvs.CAES...
# 錯誤:包裝令牌無效或不存在
攻擊偵測
如果包裝令牌在應用程式之前被攻擊者解開:
應用程式在解開包裝時將收到錯誤 → 立即發出警報
檢查審核日誌以尋找攻擊者的來源IP
撤銷角色並重新頒發憑證
5. AppRole 最佳實務 cho CI/CD
GitHub 操作
# .github/workflows/deploy.yml 名稱:使用 Vault 進行部署 於: 推: 分支:[主要]職位: 部署: 運行:ubuntu-latest 步驟: - 使用:actions/checkout@v4
- 姓名:從 Vault 匯入機密 使用:hashicorp/vault-action@v3 與: 網址:https://vault.company.com 方法:應用程式 角色ID:${{secrets.VAULT_ROLE_ID}} 秘密ID:${{秘密.VAULT_SECRET_ID}} 秘密: | 秘密/資料/生產/資料庫使用者名稱| DB_使用者名稱; 秘密/資料/生產/資料庫密碼 |資料庫密碼; 秘密/資料/生產/api 金鑰 | API_KEY - 名稱:部署應用程式 運行: | echo“正在使用秘密進行部署...” ./部署.sh 環境: DB_USERNAME:${{ env.DB_USERNAME }} DB_PASSWORD: ${{ env.DB_PASSWORD }}
GitLab CI
# .gitlab-ci.yml
階段:
- 部署
部署生產:
階段:部署
圖片:hashicorp/vault:1.21
變數:
VAULT_ADDR:「https://vault.company.com"
腳本:
- |
# 登入 AppRole
VAULT_TOKEN=$(vault write -field=token auth/approle/login \
role_id="${VAULT_ROLE_ID}" \
Secret_id="${VAULT_SECRET_ID}")
匯出 VAULT_TOKEN
#Lấy的秘密
DB_PASSWORD=$(vault kv get -field=密碼秘密/生產/db)
匯出資料庫密碼
# 部署
./部署.sh
僅:
- 主要
Jenkins 管道
// Jenkinsfile
管道{
代理任何
環境{
VAULT_ADDR = 'https://vault.company.com'
}
階段{
階段('獲取秘密'){
步驟{
withVault(
配置:[
保險庫網址:“${VAULT_ADDR}”,
VaultCredentialId:'vault-approle'
],
金庫秘密:[
[
路徑:'秘密/生產/資料庫',
秘密值:[
[envVar: 'DB_USER',VaultKey: '使用者名稱'],
[envVar:'DB_PASS',vaultKey:'密碼']
]
]
]
){
sh './deploy.sh'
}
}
}
}
}
6. AppRole部署模式
可信任協調器模式
<前><代碼>┌────────────┐ ┌──────────────┐ │ Terraform/ │ 1.Sinh SecretID │ Vault │ │ Ansible │ ────────────────▶│ │ │ (編曲)│◀──────────────────│ │ │ │ 2. 包裝代幣 │ │ └──────┬────────┘ └──────────────┘ │ │ 3. 交付包裝好的代幣 ▼ ┌────────────┐ ┐──────────────┐ │ 應用 │ 4. 拆封 → │ Vault │ │ │ 秘密ID │ │ │ │ 5. 登入 │ │ │ │ (角色ID + │ │ │ │ SecretID) │ │ │ │ 6. Vault 代幣 │ │ └──────────────┘ └──────────────┘RoleID 已融入 AMI/Docker 映像或設定管理
SecretID 由可信任編排器(Terraform、Ansible、CI/CD)產生
為了安全起見,SecretID 作為包裝令牌提供
應用程式解包以取得 SecretID,然後使用 RoleID + SecretID 登入
拉取與推播模型
<表> <標題>
模型運作方式優點缺點 <正文> 拉取應用程式自行登入Vault,取得機密應用控制生命週期應用程式需要了解Vault 推送Orchestrator 將機密注入應用程式應用程式不需要知道 Vaultenv/file 中的機密7.安全認證方法
常見錯誤
❌在應用程式中使用根令牌
❌ SecretID TTL 太長或無限使用
❌不要為AppRole設定CIDR綁定
❌硬編碼 RoleID + SecretID 原始碼
❌使用使用者密碼進行機器驗證
最佳實務總結
✅ SecretID:
num_uses=1,ttl=5m-30m✅ 始終對 SecretID 使用回應包裝
✅ 設定
secret_id_bound_cidrs和token_bound_cidrs✅ 每個應用程式/服務都有自己的角色
✅ 使用後撤銷根令牌
✅ 啟用審核日誌記錄以追蹤所有驗證
8。摘要
在本文中,我們學習了 Vault 的 3 種最基本的身份驗證方法:
Token Auth — 平台認證方法,每個認證方法都會產生令牌
使用者密碼驗證 - 對於人類使用者來說很簡單,支援密碼策略
AppRole Auth — 機器驗證標準,支援 CI/CD 工作流程
有回應包裝的 AppRole 是 CI/CD 管道最推薦的模式。在下一篇文章中,我們將了解 LDAP、OIDC 和 JWT 身份驗證方法 - 用於人和機器身份的企業身份驗證方法。