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

第 12 課:LDAP、OIDC 和 JWT 驗證方法

LDAP 驗證方法(LDAP/Active Directory、群組對映、策略的設定)、OIDC 驗證方法(使用 Keycloak、Azure AD、Okta、Google 進行設定)、JWT 驗證方法(適用於 CI/CD — GitHub Actions OIDC、GitLab CI JWT)、綁定聲明、宣告聲明、allowedred_red_reds)、綁定聲明、聲明、allowed_red_reds。

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

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

<圓cx =“750”cy =“80”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“750”cy =“108”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“750”cy =“136”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“750”cy =“164”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“806”cy =“108”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“806”cy =“136”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“806”cy =“164”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“834”cy =“108”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“890”cy =“80”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“890”cy =“108”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“890”cy =“136”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <圓cx =“890”cy =“164”r =“1.5”填入=“#38bdf8”不透明度=“0.15”/> <多邊形點=「1010.3108891324554,162.5 1010.3108891324554,197.5 980,215 949.6891108675446,197.5 49.689419. 980,145" 填滿 = "無" 描邊 = "#38bdf8" 描邊寬度 = "1" 不透明度 = "0.12"/>

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

第 12 課:LDAP、OIDC 與 JWT 驗證方法

HashiCorp Vault 從基礎到進階

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

xdev.asia

1. LDAP驗證方法

LDAP 驗證方法允許 Vault 使用 LDAP 目錄(Active Directory、OpenLDAP、FreeIPA)對使用者進行驗證。這是企業中對人類使用者進行身份驗證的最常用方法,因為大多數組織已經部署了 LDAP/AD 基礎架構。

架構

┌──────────┐ 1. 登入 ┌────────────┐
│ 使用者 │ ──────────────────▶ │ 保險庫 │
│ │ │ LDAP 驗證 │
│ │ 4. Vault 代幣 │ │
│ │ ◀────────────────── │ │
└──────────┘ └──────┬────────┘
                                         │
                                2.LDAP綁定(驗證密碼)
                                3. 搜尋群組
                                         │
                                         ▼
                                  ┌────────────┐
                                  │ LDAP 伺服器 │
                                  │ (AD/LDAP) │
                                  └────────────┘

設定 Active Directory

# 啟用 LDAP 驗證
vault auth enable ldap

#Cấu hình kết nối Active Directory
vault write auth/ldap/config \
  url =“ldaps://ad.company.com:636”\
  userdn =“OU =用戶,DC =公司,DC = com”\
  userattr="sAMAccountName" \
  groupdn =“OU =群組,DC =公司,DC = com”\
  組屬性=“cn”\
  groupfilter="(&(objectClass=group)(成員:1.2.840.113556.1.4.1941:={{.UserDN}}))" \
  binddn =“CN = vault-svc,OU = ServiceAccounts,DC =公司,DC = com”\
  綁定通行證=“VaultServiceP@ss”\
  starttls=假 \
  insecure_tls=假 \
  證書=@/etc/vault/ldap-ca.pem \
  token_ttl=8h \
  token_max_ttl=24小時

使用 OpenLDAP 設定

vault 寫入 auth/ldap/config \
  url =“ldaps://ldap.company.com:636”\
  userdn =“ou =人員,dc =公司,dc = com”\
  使用者屬性=“uid”\
  groupdn =“ou =群組,dc =公司,dc = com”\
  組屬性=“cn”\
  groupfilter="(|(memberUid={{.Username}})(member={{.UserDN}}))" \
  binddn =“cn=vault,ou=服務,dc=公司,dc=com”\
  綁定通行證=“LdapBindP@ss”\
  證書=@/etc/vault/ldap-ca.pem

群組 → 策略映射

# 對映 LDAP 群組「DevOps」→ Vault 策略
vault write auth/ldap/groups/DevOps \
  政策=“devops-admin,kv-devops,pki-問題”

# 映射 LDAP 群組「開發人員」→ Vault 策略
vault write auth/ldap/groups/Developers \
  策略=“dev-readonly,kv-dev”

# 映射 LDAP 群組「DBA」→ Vault 策略
vault write auth/ldap/groups/DBA \
  政策=“資料庫管理,資料庫旋轉”

# 映射特定使用者→附加策略
vault write auth/ldap/users/john.doe \
  政策=「團隊領導額外」\
  groups =“DevOps,開發人員”

# Liệt kê 團體
vault list auth/ldap/groups

使用 LDAP 登入

# CLI 登入
vault login -method=ldap username=john.doe
# 密碼(將會隱藏):****

# 介面登入
curl -s --request POST \
  --data '{"密碼": "使用者密碼"}' \
  ${VAULT_ADDR}/v1/auth/ldap/login/john.doe | ${VAULT_ADDR}/v1/auth/ldap/login/john.doe | jq .

2. OIDC認證方式

OIDC (OpenID Connect) 驗證方法允許保險箱透過支援 OIDC 的身份提供者進行驗證 - Keycloak、Azure AD (Entra ID)、Okta、Google Workspace、Auth0。這是最現代的人工身份驗證方法,因為它支援 SSO、MFA 和基於瀏覽器的登入。

OIDC 驗證流程

┌──────────┐ 1.金庫登入 ┌────────────┐
│ 使用者 │ ────────────────────▶ │ 保險庫 │
│(瀏覽器)│ │ OIDC 驗證 │
│ │ 2. 重新導向至 IdP │ │
│ │ ◀──────────────────── │ │
│ │ └────────────┘
│ │ 3. 在 IdP 登入
│ │ ──────────────────▶ ┌──────────────┐
│ │ │ 鑰匙斗篷/ │
│ │ 4. 授權碼 │ Azure AD │
│ │ ◀──────────────────── │ │
│ │ └────────────┘
│ │ 5. 授權碼 → Vault
│ │ ──────────────────▶ ┌──────────────┐
│ │ │ 金庫 │
│ │ 6. 兌換碼 │ │
│ │ 代幣 │ │
│ │ 7. Vault 代幣 │ │
│ │ ◀──────────────────── │ │
└──────────┘ └──────────────┘

使用 Keycloak 配置

# 啟用 OIDC 驗證
vault auth enable oidc

# Cấu hình OIDC với Keycloak
vault write auth/oidc/config \
  oidc_discovery_url="https://keycloak.company.com/realms/company" \
  oidc_client_id="金庫" \
  oidc_client_secret="vault-client-secret" \
  預設角色=“預設”# Tạo OIDC 角色
vault write auth/oidc/role/default \
  bound_audiences =「金庫」\
  allowed_redirect_uris="https://vault.company.com/ui/vault/auth/oidc/oidc/callback" \
  allowed_redirect_uris="http://localhost:8250/oidc/callback" \
  user_claim =「首選使用者名稱」\
  groups_claim =「群組」\
  token_policies=“預設”\
  token_ttl=8h \
  token_max_ttl=24h \
  oidc_scopes="openid、個人資料、電子郵件、群組"

# Tạo 角色 cho admin với 綁定聲明
vault write auth/oidc/role/admin \
  bound_audiences =「金庫」\
  allowed_redirect_uris="https://vault.company.com/ui/vault/auth/oidc/oidc/callback" \
  allowed_redirect_uris="http://localhost:8250/oidc/callback" \
  user_claim =「首選使用者名稱」\
  groups_claim =「群組」\
  bound_claims='{“部門”:“IT”,“角色”:“管理員”}' \
  Claim_mappings='{"電子郵件": "電子郵件", "部門": "部門"}' \
  token_policies="admin,kv-admin" \
  token_ttl=4h \
  token_max_ttl=8h

使用 Azure AD (Entra ID) 設定

vault 寫入 auth/oidc/config \
  oidc_discovery_url="https://login.microsoftonline.com/<tenant-id>/v2.0" \
  oidc_client_id="<應用程式 ID>" \
  oidc_client_secret="<客戶端秘密>" \
  default_role =“天藍色預設”

vault write auth/oidc/role/azure-default \
  bound_audiences="<應用程式 ID>" \
  allowed_redirect_uris="https://vault.company.com/ui/vault/auth/oidc/oidc/callback" \
  allowed_redirect_uris="http://localhost:8250/oidc/callback" \
  user_claim="電子郵件" \
  groups_claim =「群組」\
  token_policies=“預設”\
  oidc_scopes="openid、個人資料、電子郵件"

使用 OIDC 登入

# 以瀏覽器為基礎的登入(mở browser tự động)
vault login -method=oidc role=default

# Chỉ định 端口 cho 回調
vault login -method=oidc port=8250 role=default

# Qua Vault UI:chọn OIDC → 登入 → 重定向 đến IdP

3. JWT認證方法

JWT 驗證方法使用 JSON Web 令牌進行驗證。與 OIDC(基於瀏覽器)不同,當用戶端已有 JWT 令牌時,JWT 驗證適用於機器身份驗證 - 特別是對於 CI/CD 管道。

JWT 與 OIDC 驗證

<表> <標題>

條件JWT 驗證OIDC 驗證 <正文> 登入流程客戶端直接傳送JWT基於瀏覽器重新導向 物件機器、CI/CD人類使用者 令牌來源客戶端已擁有 JWT從 IdP 取得的 Vault MFA 支援否是(透過 IdP)

GitHub 操作 OIDC → Vault JWT 驗證

GitHub Actions 為每個工作流程運行提供 OIDC 令牌,允許在不保存機密的情況下對 Vault 進行身份驗證:

# 啟用 JWT auth cho GitHub Actions
vault auth enable -path=github-actions jwt

# Cấu hình JWT auth với GitHub OIDC 提供者
vault write auth/github-actions/config \
  oidc_discovery_url="https://token.actions.githubusercontent.com" \
  bound_issuer =“https://token.actions.githubusercontent.com"

# Tạo 角色 cho 儲存庫 cụ thể
vault write auth/github-actions/role/my-app \
  角色類型=“jwt”\
  bound_audiences =“https://github.com/my-org" \
  bound_claims_type="glob" \
  bound_claims='{"repository": "my-org/my-app", "ref": "refs/heads/main"}' \
  user_claim =「儲存庫」\
  token_policies =「我的應用程式部署」\
  token_ttl=10m \
  token_max_ttl=30m# Tạo 角色 cho toàn bộ 組織
vault write auth/github-actions/role/org-readonly \
  角色類型=“jwt”\
  bound_audiences =“https://github.com/my-org" \
  bound_claims_type="glob" \
  bound_claims='{"repository": "my-org/*"}' \
  user_claim =「儲存庫」\
  token_policies="org-readonly" \
  token_ttl=5m

GitHub Actions 工作流程

# .github/workflows/deploy.yml
名稱:使用 Vault OIDC 進行部署
於:
  推:
    分支:[主要]

權限:
  id-token: write # 所需的 cho OIDC 令牌
  內容: 閱讀

職位:
  部署:
    運行:ubuntu-latest
    步驟:
      - 使用:actions/checkout@v4

      - 名稱:向 Vault 進行身份驗證
        使用:hashicorp/vault-action@v3
        與:
          網址:https://vault.company.com
          方法:jwt
          路徑:github-actions
          角色:我的應用程式
          jwtGithubAudience:https://github.com/my-org
          秘密: |
            秘密/資料/生產/資料庫使用者名稱|資料庫使用者;
            秘密/資料/生產/資料庫密碼 |資料庫密碼

      - 名稱:部署
        運行:./deploy.sh

GitLab CI JWT 驗證

# 啟用 JWT auth cho GitLab CI
vault auth enable -path=gitlab-ci jwt

#Cấu hình
vault write auth/gitlab-ci/config \
  jwks_url="https://gitlab.company.com/-/jwks" \
  bound_issuer =“https://gitlab.company.com"

#陶角色
vault write auth/gitlab-ci/role/deploy \
  角色類型=“jwt”\
  bound_claims='{"project_id": "42", "ref_protected": "true"}' \
  user_claim =「專案路徑」\
  token_policies="gitlab-deploy" \
  token_ttl=10m
# .gitlab-ci.yml
部署:
  階段:部署
  id_令牌:
    VAULT_ID_TOKEN:
      音訊:https://vault.company.com
  腳本:
    - |
      VAULT_TOKEN=$(vault write-field=token auth/gitlab-ci/login \
        角色=部署\
        jwt="${VAULT_ID_TOKEN}")
      匯出 VAULT_TOKEN
      DB_PASS=$(vault kv get-field=密碼秘密/生產/db)
      ./部署.sh

4.綁定宣告與宣告映射

綁定宣告

綁定宣告限制允許哪些 JWT 令牌登入角色:

# 完全匹配
vault write auth/jwt/role/strict-role \
  bound_claims='{"部門": "工程", "團隊": "平台"}'

# 全域模式匹配
vault write auth/jwt/role/glob-role \
  bound_claims_type="glob" \
  bound_claims='{"repository": "my-org/*", "ref": "refs/heads/main"}'

# 多個值(或邏輯)
vault write auth/jwt/role/multi-role \
  bound_claims='{"group": ["devops", "sre", "platform"]}'

宣告映射

宣告會對應將 JWT 宣告對應到 Vault 身分識別元資料:

vault 寫入 auth/oidc/role/mapped-role \
  Claim_mappings='{"email": "email", "department": "dept", "employee_id": "emp_id"}'

# 策略中可用的元資料:
# {{identity.entity.aliases..metadata.email}}
# {{identity.entity.aliases..metadata.dept}}

5。最佳實務

LDAP

  • 始終使用 LDAPS(連接埠 636)或 StartTLS

  • Vault 綁定的服務帳戶應具有唯讀權限

  • 映射群組而不是單一使用者以方便管理

  • 在應用生產之前仔細測試 LDAP 過濾器配置

OIDC

  • 將 allowed_redirect_uris 限制為僅保險箱實際網址

  • 使用bound_claims按部門/角色限制存取

  • 在 IdP 處啟用 MFA(Keycloak、Azure AD)

  • 定期輪替 oidc_client_secret

智威湯遜

  • 偏好 CI/CD 中的 OIDC 令牌,而不是靜態機密 (AppRole)

  • 綁定聲明應盡可能具體(儲存庫、分支、環境)

  • CI/CD 的令牌短 TTL(5-15 分鐘)

  • 使用 bound_audiences 防止令牌濫用

6。摘要

  • LDAP Auth - 人類使用者的企業選擇,利用現有的 AD/LDAP 基礎設施

  • OIDC Auth — 人類使用者最先進的技術、SSO、MFA、基於瀏覽器的登入

  • JWT Auth - 非常適合 CI/CD(GitHub Actions OIDC、GitLab CI JWT),無需保存靜態機密

下一篇文章將重點放在 Kubernetes、AWS 和雲端身份驗證方法 - 基於工作負載身份的身份驗證。