04|取得短效憑證、查詢與撤銷
你要完成什麼
Section titled “你要完成什麼”後端使用自己的 AppRole 向 OpenBao 申請 PostgreSQL 憑證,查詢後立即撤銷;SQL 出錯也要清理。學員與 Agent 都不接收資料庫密碼。
1. 啟動 OpenBao
Section titled “1. 啟動 OpenBao”前兩章已完成資料庫與秘密檔準備。在自己的環境執行:
python3 scripts/prepare_openbao.pydocker compose run --rm --no-deps --user 0:0 --entrypoint chown openbao 100:1000 /bao/filedocker compose up -d openbaopython3 scripts/setup_openbao.pydocker compose up -d --force-recreate --no-deps ssodocker compose exec -T gateway nginx -s reloadsetup_openbao.py 初始化時採 Shamir 3 份、2 份門檻;已初始化時不重建 Raft。它設置資料庫 plugin、AppRole、讀取政策與短效角色,並輪替管理連線密碼。這是講師初始化腳本,沒有掛載進 API 容器。
private/openbao-init.json 含管理 Token 與解封資訊,只供主機操作人員保管。教學版放同一私人目錄;正式環境應分人保管 shares、撤銷初始化 root token,不能把這種保管方式當上線標準。
2. 讀懂三種身分
Section titled “2. 讀懂三種身分”| 身分 | 誰持有 | 能做什麼 |
|---|---|---|
| Keycloak Token | 使用者/API | 證明使用者是誰與角色 |
| OpenBao AppRole | 後端 | 只能申請 sales-readonly、撤銷同一路徑租約 |
| PostgreSQL 臨時帳號 | 後端短暫持有 | 120 秒有效、唯讀、台灣市場、必要欄位 |
bao_manager 不是超級使用者,也沒有直接 CREATEROLE。它呼叫受限的 SECURITY DEFINER 函式,僅建立與撤銷登錄過的臨時角色。不要擴大函式執行權或放寬名稱驗證。
3. 正常查詢
Section titled “3. 正常查詢”以 sales 登入實驗工作台,按「查詢與撤銷」。觀察:
驗證登入與角色 → AppRole 登入 → 建立 120 秒 DB 憑證→ 查詢前 10 筆 → finally 撤銷租約→ 終止既有連線 → 舊憑證重登失敗 → 回傳證據確認畫面有 request ID、查詢結果與三個成功條件:lease_revoked、existing_connection_terminated、new_login_rejected。帳號名稱可作追蹤,密碼不能出現在輸出。
4. 故障與越權實驗
Section titled “4. 故障與越權實驗”- 按「SQL 出錯後清理」:真的執行除以零錯誤;仍須撤銷。
- 切換 hr 身分:實驗端點應 403;未登入應 401。
- 操作人員執行下方測試,驗證薪資、email、寫入、切換 owner 被拒。
python3 scripts/verify_openbao.py測試包含 15 秒自然到期、主動撤銷與既有連線終止。到期後斷線依賴 OpenBao 正常運作;PostgreSQL VALID UNTIL 本身主要限制新登入。
5. 重啟後解封
Section titled “5. 重啟後解封”OpenBao 重啟後會 sealed,查詢應拒絕,不能退回共用靜態密碼。操作人員執行:
python3 scripts/setup_openbao.py --unseal-only不要為了省事將 unseal shares 或 root token 掛載進後端。TLS 憑證與 Raft volume 也不應任意重新產生。
安全與效率的實際邊界
Section titled “安全與效率的實際邊界”後端至 OpenBao 有驗證 TLS;目前容器內 PostgreSQL 連線仍未啟用 TLS。AppRole SecretID 30 天、後端 Token 5 分鐘;正式部署還要輪替與監控。
本版每次查詢都建立/撤銷角色,是生命週期示範;同時兩個查詢、有限排隊。尚無連線池/PgBouncer,不可宣稱高吞吐。正式版要共同設計租約、憑證輪替、池內既有連線與租戶上下文清理。
來源:OpenBao PostgreSQL · AppRole。