iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Security

AI都上線了,你的資安跟上了嗎?系列 第 16

📍 Day 13:Secrets Management 與金鑰輪替

  • 分享至 

  • xImage
  •  

—— 金鑰不是保庇符,它是消耗品。

對象:平台工程 / 資安 / SRE / LLMOps
關鍵心法:最小曝光面(Least Exposure) × 短命憑證(Short‑Lived) × 自動輪替(Auto‑Rotate) × 全程審計(Audit)


💬 開場:在 AI 系統裡,誰握著鑰匙?

生成式 AI 堆疊中到處都是秘密:模型供應商 API Key、向量庫金鑰、資料庫帳密、Webhook 簽章、雲端憑證……
而且這些秘密常常路過 Prompt、落在 Log、寫進前端、進到向量庫
今天我們把「管理」與「輪替」做成工程化的機制,而不是祈禱與備忘錄。


🧠 威脅模型(Threat Model)

類型 攻擊面 典型事故
儲存外洩 .env / K8s Secret 平文、Git commit Key 外流、被濫用造成帳單爆炸
傳輸外洩 前端曝露、提示或錯誤訊息回傳 金鑰被前端抓包、被向量化後不可逆外傳
日誌外洩 API 參數/回應被完整記錄 金鑰、Token、PII 被集中蒐集
共享過度 多租戶共用同一 Key 無法追責、難以回收與輪替
輪替失敗 沒有雙金鑰/灰度管線 一次切換導致停機或功能壞死

🎯 控制目標(Objectives)

  1. 集中管理:Secrets 不在 Repo、容器映像、環境變數長駐;統一走 Vault/KMS/Secrets Manager。
  2. 短命憑證:盡量使用 STS/OIDC 產生的短期 Token(分鐘級)。
  3. 可輪替:雙金鑰(Active/Next)、灰度發布、零停機切換。
  4. 可追蹤:誰取用、什麼時間、用在哪裡,全部有證據。

🏗️ 架構藍圖:Secret Broker(集中代理)

[Workloads/Agents] ──► [Secret Broker] ──► (Vault/KMS/Secrets Manager)
         │                    │
         │                    ├─ STS/OIDC 換取短期憑證(5–15 分鐘)
         │                    ├─ A/B 金鑰發佈(Active/Next)
         │                    └─ 審計事件 → SIEM
         ▼
[LLM Provider / Vector DB / DB / Webhooks]
  • Secret Broker 提供統一 API:get("openai:api_key"),並注入到期前自動刷新
  • A/B 金鑰與灰度百分比由 Broker 控制,避免每個服務都實作輪替。

🧰 常見實作模式(Do/Don’t)

✅ Do

  • 使用 HashiCorp Vault / Cloud KMS+Secrets Manager(AWS/GCP/Azure) 做來源事實。
  • Workload Identity Federation(OIDC) 讓 K8s/VM 無長期金鑰。
  • 每個租戶/環境/工作負載發放獨立憑證(Scope 最小化)。
  • CI/CDRuntime 都有 Secret 掃描(gitleaks/trufflehog + Egress DLP)。
  • 啟用 Dual‑Key輪替流水線(見下)。

❌ Don’t

  • 把金鑰放在前端、放進 Prompt、或寫進向量庫 Chunk/Metadata。
  • K8s Secret 當保險箱(它只是 base64)。請搭配 Sealed Secrets/External Secrets 或 Sidecar 注入。
  • 在監控/錯誤追蹤裡紀錄完整參數與回應。

🔐 Kubernetes:External Secrets(範例)

# external-secret.yaml
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: openai-api-key
spec:
  refreshInterval: 5m
  secretStoreRef:
    name: corp-vault
    kind: ClusterSecretStore
  target:
    name: openai-api
    template:
      engineVersion: v2
  data:
    - secretKey: api_key
      remoteRef:
        key: kv/data/llm/openai
        property: ACTIVE   # A/B 金鑰:ACTIVE / NEXT

應用程式只讀取 openai-api.api_key;Broker 定時把 NEXT 灰度切成 ACTIVE


🧪 應用側:到期自動刷新(Node/TS)

// secret-broker.ts
export class SecretBroker {
  private cache = new Map<string, { v: string; exp: number }>();
  constructor(private fetcher: (k: string) => Promise<{v:string,exp:number}>) {}
  async get(key: string) {
    const now = Date.now() / 1000;
    const c = this.cache.get(key);
    if (c && c.exp - now > 60) return c.v; // 提前 60s 刷新
    const fresh = await this.fetcher(key);
    this.cache.set(key, fresh);
    return fresh.v;
  }
}
// 用法:const openaiKey = await broker.get("openai:api_key");

🔁 輪替流水線(Runbook)

  1. 生成 NEXT:在 Vault/Secrets Manager 建立 NEXT 金鑰。
  2. 灰度分流:Broker 以 10% → 50% → 100% 將流量切到 NEXT;監控錯誤率。
  3. 切換 ACTIVE:將 NEXT 標記為 ACTIVE,舊 ACTIVEGRACE
  4. 觀察期:保留 GRACE 一段時間(如 24h),便於回退。
  5. 撤銷與收尾:撤銷 GRACE;審計與報告(誰在舊 Key 上仍有請求)。

關鍵:雙金鑰/雙端點兼容。供應商若只允許單金鑰,需以代理層模擬 A/B。


🧲 Log/DLP 護欄(不要讓金鑰留下痕跡)

// 日誌濾鏡:遮罩可能的金鑰樣式
const SECRET_LIKE = /(sk-[A-Za-z0-9]{20,}|AIza[0-9A-Za-z_\-]{33}|AKIA[0-9A-Z]{16})/g;
export function safeLog(obj: any) {
  let s = JSON.stringify(obj);
  s = s.replace(SECRET_LIKE, "<REDACTED>");
  console.log(s);
}

🧪 秘密偵測與蜜罐(Honeytoken)

  • CI/CD:gitleaks、trufflehog、pre-commit;阻擋含密文的 PR。
  • Runtime:Egress DLP 檢測可疑 Key 格式。
  • Honeytoken:在 Repo 中放入可識別的假 Key,一旦被呼叫就即時告警定位外洩路徑。

📊 指標(SLO/KPI)

  • Secret Age P90/P99(秘密年齡分佈)
  • Rotation Lead Time(從建到全量切換所需時間)
  • Stale Secret Count(超過政策週期仍未輪替數)
  • Access Anomalies(非預期租戶/地區/時間取得)
  • Leak MTTR(發現外洩到撤銷的平均時間)

✅ 落地檢核清單

  • [ ] 所有 Secrets 有清單(Inventory)Owner
  • [ ] Vault/KMS/Secrets Manager 為單一事實來源;應用不持久化密鑰
  • [ ] Workload Identity(OIDC/STS)取代長期金鑰
  • [ ] Dual‑Key 與灰度輪替、回退策略就緒
  • [ ] 日誌/監控/向量庫皆做 Secret 遮罩與 DLP
  • [ ] CI/CD + Runtime Secret 掃描(含 Honeytoken)
  • [ ] 指標與審計事件進 SIEM

🎭 工程師小劇場

PM:這個 API Key 能不能先借我用一下?
你:可以,給你一把 15 分鐘到期僅可讀只限你租戶 的。
PM:哇,這叫借鑰匙,不是送房子。


🎯 小結

金鑰是消耗品,不是傳家寶。
把輪替做成流水線、把存取做成代理、把審計做成預設值,你的 AI 平台就不怕「鑰匙被看見」。


🔮 明日預告:Day 14|System Prompt 保護與洩漏檢測

講白名單回覆、提示切分、提示指紋、與 Prompt‑Leak Canary。


上一篇
📍 Day 12:API 與 Webhook 安全——簽章、重放、租戶隔離
下一篇
📍 Day 14:System Prompt 盾化與洩漏獵殺手冊
系列文
AI都上線了,你的資安跟上了嗎?24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言