<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-9593)”/>
<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#818cf8”/>
<矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#818cf8”不透明度=“0.15”/>
1. Terraform Vault 供應商
Terraform Vault Provider 支援 Vault 即程式碼配置管理 - 秘密引擎、驗證方法、策略、實體、群組,所有這些都在 Git 中進行版本控制。
提供者配置
#providers.tf
terraform {
必要的提供者{
vault = {
來源=“hashicorp/Vault”
版本=“~>4.0”
}
}
}
提供者「金庫」{
位址 = "https://vault.company.com:8200"
# 驗證 VAULT_TOKEN 環境變數 hoặc:
# auth_login {
# 路徑 = "auth/approle/login"
# 參數 = {
# role_id = var.vault_role_id
# Secret_id = var.vault_secret_id
# }
# }
}
管理秘密引擎
#secrets-engines.tf
# KV v2
資源“vault_mount”“kv”{
路徑=“秘密”
類型=“kv-v2”
描述 =“KV v2 秘密引擎”
選項={
版本=“2”
最大版本 = 10
}
}
# 資料庫秘密引擎
資源“vault_mount”“資料庫”{
路徑=“資料庫”
類型=“資料庫”
}
資源“vault_database_secret_backend_connection”“postgres”{
後端 =Vault_mount.database.path
名稱 =“生產-postgres”
allowed_roles = [“應用程式角色”,“唯讀角色”]
PostgreSQL {
connection_url = "postgresql://{{使用者名稱}}:{{密碼}}@db.company.com:5432/生產"
使用者名稱 = var.db_admin_user
密碼 = var.db_admin_password
}
}資源“vault_database_secret_backend_role”“app_role”{
後端 =Vault_mount.database.path
名稱 =“應用程式角色”
db_name =Vault_database_secret_backend_connection.postgres.name
預設存活時間 = 3600
最大存活時間 = 14400
創建語句 = [
"建立角色 \"{{name}}\",登入密碼為 '{{password}}',有效期限為 '{{expiration}}';",
"將 SCHEMA public 中所有表格的選擇、插入、更新、刪除授予 \"{{name}}\";",
]
撤銷語句 = [
"從\"{{name}}\"撤銷公用架構中所有資料表的所有權限;",
"如果存在則刪除角色 \"{{name}}\";",
]
}
# 公鑰基礎設施
資源“vault_mount”“pki”{
路徑=“pki”
類型=“pki”
max_lease_ttl_seconds = 315360000 # 10 年
}
資源「vault_pki_secret_backend_root_cert」「根」{
後端=Vault_mount.pki.path
類型=“內部”
common_name = "公司根 CA"
ttl =“315360000”
}
管理驗證方法
# auth.tf
# Kubernetes 驗證
資源「vault_auth_backend」「kubernetes」{
類型=“kubernetes”
路徑=“kubernetes”
}
資源“vault_kubernetes_auth_backend_config”“配置”{
後端=Vault_auth_backend.kubernetes.path
kubernetes_host = “https://kubernetes.default.svc:443"
}
資源“vault_kubernetes_auth_backend_role”“webapp”{
後端=Vault_auth_backend.kubernetes.path
角色名稱=“網頁應用程式”
bound_service_account_names = [“webapp-sa”]
bound_service_account_namespaces = [「生產」]
token_policies = ["webapp-policy"]
令牌_TTL = 3600
}
# 應用角色
資源「vault_auth_backend」「approle」{
類型=“approle”
}
資源“vault_approle_auth_backend_role”“cicd”{
後端=Vault_auth_backend.approle.path
role_name = "cicd-管道"
token_policies = ["cicd-deploy"]
令牌_TTL = 1800
秘密 ID TTL = 600
Secret_id_num_uses = 1
}
政策管理
#policy.tf
資源“vault_policy”“webapp”{
名稱 =“webapp-policy”
政策 = 文件(“政策/webapp.hcl”)
}
資源“vault_policy”“cicd”{
名稱 =“cicd-部署”
政策=<
從 Terraform 中的 Vault 讀取機密
# 是 Terraform 資源的秘密
資料“vault_kv_secret_v2”“db_creds”{
掛載=“秘密”
名稱 =“生產/資料庫”
}
資源“aws_db_instance”“生產”{
引擎=“postgres”
使用者名稱 = data.vault_kv_secret_v2.db_creds.data["使用者名稱"]
密碼 = data.vault_kv_secret_v2.db_creds.data["密碼"]
# ...其他配置
}
2. Ansible 與 Vault
找外掛
# playbook.yml
- 名稱:部署應用程式
主機:網頁伺服器
變數:
db_password: "{{ Lookup('hashi_vault', '秘密/資料/生產/db:密碼') }}"
api_key: "{{ Lookup('hashi_vault', '秘密/資料/生產/api:key') }}"
任務:
- 名稱:配置應用程式
模板:
原始碼:app.conf.j2
目標:/etc/app/app.conf
模式:'0640'
變數:
db_host:“{{查找('hashi_vault','秘密/資料/生產/db:主機')}}”
- name:取得動態資料庫憑證
設定事實:
db_creds: "{{ Lookup('hashi_vault', '資料庫/creds/deploy-role') }}"
- 名稱:執行資料庫遷移
命令:./migrate.sh
環境:
DB_USER:“{{db_creds.用戶名}}”
DB_PASS:“{{ db_creds.password }}”
Ansible 集合
# 安裝集合
ansible-galaxy collection install community.hashi_vault
- name: 讀取 KV 秘密
Community.hashi_vault.vault_kv2_get:
網址:https://vault.company.com:8200
引擎安裝點:秘密
路徑:生產/資料庫
auth_method:approle
角色_id:“{{Vault_role_id}}”
秘密_id:“{{vault_secret_id}}”
報名:db_secret
- 名稱:寫入KV秘密
Community.hashi_vault.vault_kv2_write:
網址:https://vault.company.com:8200
引擎安裝點:秘密
路徑:生產/應用程式/部署訊息
數據:
版本:“{{ app_version }}”
部署者:“{{ ansible_user_id }}”
部署於:“{{ ansible_date_time.iso8601 }}”
3. CI/CD 整合
GitHub 操作(OIDC — 建議)
# .github/workflows/deploy.yml
名稱:部署
於:
推:
分支:[主要]
權限:
id 令牌:寫入
內容: 閱讀
職位:
部署:
運行:ubuntu-latest
步驟:
- 使用:actions/checkout@v4
- 姓名:從 Vault 取得秘密
使用:hashicorp/vault-action@v3
與:
網址:https://vault.company.com:8200
方法:jwt
路徑:github-actions
角色:我的應用程式
jwtGithubAudience:https://github.com/my-org
導出環境:true
秘密: |
秘密/資料/生產/資料庫使用者名稱|資料庫使用者;
秘密/資料/生產/資料庫密碼 |資料庫通行證;
秘密/資料/生產/註冊令牌 | REGISTRY_TOKEN
- 名稱:建置與推播
運行: |
迴聲“$REGISTRY_TOKEN”| docker login -u _token --password-stdinregistry.company.com
docker build -t registry.company.com/myapp:${{ github.sha }} .
docker push registry.company.com/myapp:${{ github.sha }}
ArgoCD Vault 外掛程式
# ArgoCD 應用程式清單
api版本:argoproj.io/v1alpha1
種類: 應用
元數據:
名稱: 網路應用程式
規格:
來源:
倉庫地址:https://github.com/company/webapp
路徑:k8s
插件:
名稱: argocd-vault-plugin
環境:
- 名稱:AVP_TYPE
價值:金庫
- 名稱:AVP_AUTH_TYPE
值:k8s
- 名稱:VAULT_ADDR
值:https://vault.company.com:8200
- 名稱:AVP_K8S_ROLE
值:argocd
# k8s/secret.yaml(範本)
api版本:v1
種類:秘密
元數據:
名稱:應用程式秘密
註:
avp.kubernetes.io/path:“秘密/資料/生產/webapp”
類型: 不透明
字串資料:
DB_PASSWORD:<密碼>
API_KEY:<api_key>
外部機密操作員
# ClusterSecretStore
api版本:external-secrets.io/v1beta1
種類:ClusterSecretStore
元數據:
名稱:保管庫存儲
規格:
提供者:
vault:
伺服器:「https://vault.company.com:8200"
路徑:“秘密”
版本:“v2”
授權:
庫伯內特:
掛載路徑:“kubernetes”
角色:“外部秘密”
服務帳號參考:
名稱:外部秘密-sa
---
# 外部秘密
api版本:external-secrets.io/v1beta1
種類:外部秘密
元數據:
名稱:應用程式資料庫秘密
命名空間:生產
規格:
刷新間隔:1m
秘密商店參考:
種類:ClusterSecretStore
名稱:保管庫存儲
目標:
名稱:應用程式資料庫憑證
建立策略:所有者
數據:
- 金鑰:使用者名稱
遠端參考:
關鍵:生產/資料庫
屬性:使用者名稱
- 密鑰:密碼
遠端參考:
關鍵:生產/資料庫
屬性:密碼
4. Vault trong GitOps 工作流程
┌────────────┐ 推送配置 ┌────────────┐
│ 開發人員 │ ──────────────▶ │ Git │
│ │ │ (清單 │
└──────────────┘ │ + 秘密 │
│ 佔位符│
└──────┬────────┘
│
ArgoCD / 通量
│
▼
┌────────────┐
│ AVP / ESO │
│ (解決 │
│ 秘密) │
└──────┬────────┘
│
取得秘密 │
▼
┌────────────┐
│ 金庫 │
│ │
└────────────┘
5。摘要
Terraform Vault Provider - Vault 配置作為程式碼,管理所有 Vault 設定
Ansible - 用於操作工作流程的查找外掛程式和集合
GitHub Actions — 基於 OIDC(無靜態機密)、vault-action
ArgoCD Vault 外掛程式 — 解析 GitOps 中的秘密佔位符
外部 Secrets Operator - 來自 Vault 的 Kubernetes 原生同步
最後一部分將進入生產和企業 - HA、整合儲存、複製、命名空間、監控和故障排除。