Chuyển đến nội dung chính

第 11 課:基本驗證方法 - 令牌、使用者密碼和 AppRole

驗證方法概述、令牌驗證方法(根令牌、建立令牌)、使用者密碼驗證方法(CRUD 使用者、密碼原則)、AppRole 驗證方法(RoleID、SecretID、CIDR 綁定、secret_id_num_uses)、回應包裝 cho SecretID、AppRole 最佳實務 cho CI/CD 管道。

<定義> <線性漸變 id="bg-6200" x1="0%" y1="0%" x2="100%" y2="100%">

<矩形寬度=“1200”高度=“340”rx=“12”填滿=“url(#bg-6200)”/>

<圓cx =“990”cy =“150”r =“23”填入=“#fb923c”不透明度=“0.05”/> <圓cx =“880”cy =“80”r =“33”填滿=“#fb923c”不透明度=“0.05”/> <圓cx =“750”cy =“80”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“750”cy =“108”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“750”cy =“136”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“750”cy =“164”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“778”cy =“80”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“778”cy =“108”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“778”cy =“136”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“778”cy =“164”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“806”cy =“80”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“806”cy =“108”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“806”cy =“136”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“806”cy =“164”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“834”cy =“80”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“834”cy =“108”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“834”cy =“136”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“834”cy =“164”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“862”cy =“80”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“862”cy =“108”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“862”cy =“136”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“862”cy =“164”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“890”cy =“80”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“890”cy =“108”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“890”cy =“136”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <圓cx =“890”cy =“164”r =“1.5”填入=“#fb923c”不透明度=“0.15”/> <多邊形點=「969.6410161513776,115 969.6410161513776,155 935,175 900.3589838486224,155 900.358983589862486224,155 900.35898383862,01848. 935,95”填充=“無”筆畫=“#fb923c”筆畫寬度=“1”不透明度=“0.12”/>

<矩形x =“60”y =“50”寬度=“4”高度=“60”rx =“2”填滿=“#fb923c”/> <矩形x =“80”y =“50”寬度=“121”高度=“28”rx =“14”填滿=“#fb923c”不透明度=“0.15”/> 🔒 DevSecOps — 第 11 堂課

第 11 課:基本驗證方法 - 令牌, 使用者密碼與應用程式角色

HashiCorp Vault 從基礎到進階

第 3 部分:驗證方法 - 驗證與授權

xdev.asia

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 代幣 │ │ └──────────────┘ └──────────────┘
  1. RoleID 已融入 AMI/Docker 映像或設定管理

  2. SecretID 由可信任編排器(Terraform、Ansible、CI/CD)產生

  3. 為了安全起見,SecretID 作為包裝令牌提供

  4. 應用程式解包以取得 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 身份驗證方法 - 用於人和機器身份的企業身份驗證方法。