跳到內容

04|取得短效憑證、查詢與撤銷

後端使用自己的 AppRole 向 OpenBao 申請 PostgreSQL 憑證,查詢後立即撤銷;SQL 出錯也要清理。學員與 Agent 都不接收資料庫密碼。

前兩章已完成資料庫與秘密檔準備。在自己的環境執行:

終端機視窗
python3 scripts/prepare_openbao.py
docker compose run --rm --no-deps --user 0:0 --entrypoint chown openbao 100:1000 /bao/file
docker compose up -d openbao
python3 scripts/setup_openbao.py
docker compose up -d --force-recreate --no-deps sso
docker compose exec -T gateway nginx -s reload

setup_openbao.py 初始化時採 Shamir 3 份、2 份門檻;已初始化時不重建 Raft。它設置資料庫 plugin、AppRole、讀取政策與短效角色,並輪替管理連線密碼。這是講師初始化腳本,沒有掛載進 API 容器。

private/openbao-init.json 含管理 Token 與解封資訊,只供主機操作人員保管。教學版放同一私人目錄;正式環境應分人保管 shares、撤銷初始化 root token,不能把這種保管方式當上線標準。

身分 誰持有 能做什麼
Keycloak Token 使用者/API 證明使用者是誰與角色
OpenBao AppRole 後端 只能申請 sales-readonly、撤銷同一路徑租約
PostgreSQL 臨時帳號 後端短暫持有 120 秒有效、唯讀、台灣市場、必要欄位

bao_manager 不是超級使用者,也沒有直接 CREATEROLE。它呼叫受限的 SECURITY DEFINER 函式,僅建立與撤銷登錄過的臨時角色。不要擴大函式執行權或放寬名稱驗證。

以 sales 登入實驗工作台,按「查詢與撤銷」。觀察:

驗證登入與角色 → AppRole 登入 → 建立 120 秒 DB 憑證
→ 查詢前 10 筆 → finally 撤銷租約
→ 終止既有連線 → 舊憑證重登失敗 → 回傳證據

確認畫面有 request ID、查詢結果與三個成功條件:lease_revoked、existing_connection_terminated、new_login_rejected。帳號名稱可作追蹤,密碼不能出現在輸出。

  • 按「SQL 出錯後清理」:真的執行除以零錯誤;仍須撤銷。
  • 切換 hr 身分:實驗端點應 403;未登入應 401。
  • 操作人員執行下方測試,驗證薪資、email、寫入、切換 owner 被拒。
終端機視窗
python3 scripts/verify_openbao.py

測試包含 15 秒自然到期、主動撤銷與既有連線終止。到期後斷線依賴 OpenBao 正常運作;PostgreSQL VALID UNTIL 本身主要限制新登入。

OpenBao 重啟後會 sealed,查詢應拒絕,不能退回共用靜態密碼。操作人員執行:

終端機視窗
python3 scripts/setup_openbao.py --unseal-only

不要為了省事將 unseal shares 或 root token 掛載進後端。TLS 憑證與 Raft volume 也不應任意重新產生。

後端至 OpenBao 有驗證 TLS;目前容器內 PostgreSQL 連線仍未啟用 TLS。AppRole SecretID 30 天、後端 Token 5 分鐘;正式部署還要輪替與監控。

本版每次查詢都建立/撤銷角色,是生命週期示範;同時兩個查詢、有限排隊。尚無連線池/PgBouncer,不可宣稱高吞吐。正式版要共同設計租約、憑證輪替、池內既有連線與租戶上下文清理。

來源:OpenBao PostgreSQL · AppRole。