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

第 14 課:策略 - ACL、Sentinel 和 RBAC

Vault 策略系統、HCL 策略語法、基於路徑的策略、功能、策略範本、細粒度控制、Sentinel 策略(企業)、EGP、RGP、測試。

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

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

<圓cx =“920”cy =“218”r =“20”填滿=“#f472b6”不透明度=“0.05”/> <圓cx =“750”cy =“80”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“750”cy =“108”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“750”cy =“136”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“750”cy =“164”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“778”cy =“80”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“778”cy =“108”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“806”cy =“80”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“806”cy =“108”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“806”cy =“136”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“806”cy =“164”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“834”cy =“80”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“834”cy =“108”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“834”cy =“136”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“834”cy =“164”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“862”cy =“108”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“862”cy =“136”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“890”cy =“80”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“890”cy =“108”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“890”cy =“136”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <圓cx =“890”cy =“164”r =“1.5”填入=“#f472b6”不透明度=“0.15”/> <多邊形點=「954.0429399400242,103.5 954.0429399400242,140.5 922,159 889.9570600599758,140.5 889.9570600599758,103.50000000000001 922,85" 填滿 = "無" 描邊 = "#f472b6" 描邊寬度 = = "1" 不透明度 = = "0.12"/>

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

第 14 課:策略 - ACL、Sentinel 和 RBAC

HashiCorp Vault 從基礎到進階

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

xdev.asia

1. Vault策略系統

Vault 使用基於策略的存取控制來控制存取。 Vault 上的每個操作都必須得到策略的允許。策略以 HCL(HashiCorp 設定語言)或 JSON 編寫。

基礎

  • 預設拒絕 - 預設拒絕一切,除非策略允許

  • 基於路徑 - 與 API 路徑關聯的策略

  • 累加性 - 許多政策組合(聯合),最高權威獲勝

  • 拒絕獲勝 — 如果有任何策略拒絕 → 拒絕(root 除外)

內建政策

<表> <標題>

政策說明可以刪除嗎? <正文> root完全權限,跳過所有檢查否 預設分配給所有token,允許基本操作否(可編輯)

2. HCL 策略語法

功能

<表> <標題>

功能HTTP 動詞描述 <正文> 建立POST建立新資料 讀取GET讀取資料 更新POST/PUT更新資料 刪除刪除刪除資料 列表LIST列表鍵 sudo—允許在根保護路徑上進行操作 拒絕—拒絕所有訪問(總是獲勝) 補丁PATCH部分更新(KV v2)

基本政策範例

#policy-dev-team.hcl# KV cho 團隊開發的秘密
路徑“秘密/資料/dev/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」、「修補」]
}

路徑「秘密/元資料/dev/*」{
  功能= [“清單”,“讀取”,“刪除”]
}

# Chỉ đọc 秘密製作
路徑“秘密/數據/生產/*”{
  能力= [“讀”]
}

# Sinh 資料庫憑證
路徑“資料庫/creds/dev-readonly”{
  能力= [“讀”]
}

# Không được truy cập 管理路徑
路徑“sys/*”{
  能力= [“拒絕”]
}

# Cho phép đọc 健康狀況
路徑“系統/健康”{
  能力= [“讀”]
}

# 自我管理代幣
路徑“auth/token/lookup-self”{
  能力= [“讀”]
}

路徑“auth/token/renew-self”{
  能力= [“更新”]
}

全域模式

# * khớp mọi ký tự trong một 段
路徑“秘密/數據/團隊-*”{
  能力= [“讀”]
}
# Khớp:秘密/數據/團隊-alpha,秘密/數據/團隊-beta
# Không khớp:秘密/資料/team-alpha/sub

# + khớp ít nhất một 段 (bao gồm /)
路徑“秘密/數據/團隊-alpha/+”{
  能力= [“讀”]
}
# Khớp: 秘密/資料/team-alpha/db, 秘密/資料/team-alpha/api/keys

細粒度控制

# Cho phép tạo nhưng chỉ với 參數 cụ thể
路徑“秘密/資料/生產/資料庫”{
  功能= [“創建”,“更新”]
  允許的參數 = {
    "data" = [] # Mọi giá trị
  }
  拒絕參數 = {
    "data" = ["*root*", "*admin*"] # Không cho key chứa root/admin
  }
}

# TTL 限制
路徑“資料庫/信用/生產”{
  能力= [“讀”]
  min_wrapping_ttl = "5m"
  max_wrapping_ttl = "30m"
}

# 必填參數
路徑“auth/approle/role/*”{
  功能= [“創建”,“更新”]
  required_parameters = ["token_policies", "secret_id_ttl"]
}

3.策略範本

策略範本允許使用身分資訊建立動態策略:

# Mỗi user chỉ truy cập được KV path của mình
路徑「秘密/資料/使用者/{{identity.entity.name}}/*」{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}

# Dựa trên 元數據
路徑「秘密/資料/團隊/{{identity.entity.metadata.team}}/*」{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}

#Dựa trên 組
路徑「秘密/資料/群組/{{identity.groups.names.*.id}}/*」{
  能力= [“讀取”,“列表”]
}

# Dựa trên auth 方法別名
路徑「secret/data/k8s/{{identity.entity.aliases.auth_kubernetes_abc123.metadata.service_account_namespace}}/*」{
  能力= [“讀”]
}

4.管理策略

# Tạo/cập nhật 策略文件
vault policy write dev-team policy-dev-team.hcl

# Tạo 政策 từ stdin
vault policy write admin-policy - <<EOF
路徑“sys/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」、「sudo」]
}
路徑“秘密/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}
EOF

# Liệt kê 政策
vault policy list

# 政策
vault policy read dev-team

# Xóa 政策
vault policy delete dev-team

# 格式化/驗證策略文件
vault policy fmt policy-dev-team.hcl# 測試能力
vault token capabilities <token> secret/data/dev/app1
# 建立、刪除、列出、讀取、更新

# 測試功能 của token hiện tại
vault token capabilities -self secret/data/dev/app1

5。帶有 Vault 策略的 RBAC 模式

組織的 RBAC 設計

# === 角色:vault-admin ===
# 策略-vault-admin.hcl
路徑“sys/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」、「sudo」]
}
路徑“auth/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」、「sudo」]
}

# === 角色:secrets-admin ===
# 策略秘密-admin.hcl
路徑“秘密/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}
路徑“資料庫/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}
路徑“pki/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}

# === 角色:開發人員 ===
# 策略開發者.hcl
路徑“秘密/資料/dev/*”{
  功能 = [「建立」、「讀取」、「更新」、「刪除」、「清單」]
}
路徑「資料庫/creds/dev-*」{
  能力= [“讀”]
}
路徑“pki/issue/dev-cert”{
  功能= [“創建”,“更新”]
}

# === 角色:操作員 ===
# 策略操作符.hcl
路徑“秘密/數據/生產/*”{
  能力= [“讀”]
}
路徑“資料庫/creds/prod-readonly”{
  能力= [“讀”]
}
路徑“系統/健康”{
  能力= [“讀”]
}
路徑“系統/指標”{
  能力= [“讀”]
}

分配策略給身分群組

# Tạo 內部組
vault write identity/group \
  名稱=“平台團隊”\
  政策=“秘密管理,保管庫管理”\
  member_entity_ids =“實體uuid-1,實體uuid-2”

# 外部群組(映射到 LDAP/OIDC)
vault write identity/group \
  名稱=“開發人員”\
  類型=“外部”\
  政策=“開發商”

# 映射外部群組 → LDAP 群組
vault write identity/group-alias \
  name="CN=開發人員、OU=群組、DC=公司、DC=com" \
  mount_accessor =“auth_ldap_abc123”\
  canonical_id="<組 ID>"

6.哨兵策略(企業)

Sentinel 是 HashiCorp 的策略即程式碼框架,它允許使用 Sentinel 語言建立比 ACL 更複雜的策略。 Sentinel 策略可以檢查請求上下文、一天中的時間、IP 位址和許多其他因素。

兩種類型的 Sentinel 策略

<表> <標題>

類型描述範圍 <正文> EGP(端點管理)附加到特定 API 路徑對該路徑的所有請求 RGP(角色管理)附加到令牌/身分來自該身分的所有請求

EGP 範例 - 僅工作時間

# Chỉ cho phép truy cập 生產秘密 trong giờ làm việc
導入“時間”
導入“字串”

# Lấy thời gian hiện tại (UTC+7 cho 越南)
當前時間 = 時間.現在.小時 + 7
如果當前時間 >= 24 {
  當前時間 = 目前時間 - 24
}# Kiểm tra ngày trong tuần (1=星期一,7=星期日)
current_day = 時間.現在.工作日

# 營業時間:週一至週五,7:00-19:00 ICT
is_business_hours = current_day >= 1 且 current_day <= 5 且
                    current_hour >= 7 且 current_hour < 19

# Cho phép nếu trong 營業時間 hoặc là 緊急路徑
主要=規則{
  is_business_hours 或
  strings.has_prefix(request.path, "秘密/資料/緊急/")
}
# Tạo EGP
vault write sys/policies/egp/business-hours \
  政策=“$(貓營業時間.sentinel)”\
  forcement_level="軟強制" \
  路徑=“秘密/數據/生產/*”

RGP 範例 - 請求驗證

# Yêu cầu MFA cho 操作 trên 生產
導入“MFA”
導入“字串”

# Kiểm tra nếu path là 製作
is_product = strings.has_prefix(request.path, "秘密/資料/生產/")

# 生產作業 cần MFA
main = is_生產時的規則 {
  mfa.methods.totp.valid
}

執行等級

<表> <標題>

等級失敗行為 <正文> 諮詢記錄警告,仍允許 軟強制拒絕,但可以用 sudo 覆蓋 硬強制拒絕,無法覆蓋

7.策略測試與除錯

# Kiểm tra 功能 cụ thể
vault token capabilities -self secret/data/dev/app1

# Tạo 測試代幣 với 政策
vault token create -policy=dev-team -ttl=5m

# 測試操作
VAULT_TOKEN="test-token" 保管庫 kv 取得機密/dev/app1
VAULT_TOKEN="test-token" 保管庫 kv put Secret/dev/app1 key=value
VAULT_TOKEN="test-token"Vault kv get Secret/Production/db # 預期:權限被拒絕

# 驗證策略語法
vault policy fmt -check policy-file.hcl

8。摘要

  • ACL 策略 — 基於路徑、功能、全域模式、細粒度控制

  • 策略範本 - 使用身分資料的動態策略

  • RBAC 模式 — 以群組為基礎的策略分配與組織結構

  • 哨兵策略(企業)- 策略即程式碼,複雜的業務規則

下一篇文章將探討身分秘密引擎、實體、群組和多重身分驗證 - 完善 Vault 中的身分管理圖片。