首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Grant Execute 安全模式:以存儲過程封裝實現數據訪問零後門

     編輯:Oracle 資料庫基礎

傳統 Grant 安全模式痛點

  • 對象級權限(GRANT SELECT ON t TO u)隨業務增長呈指數爆炸,維護極難。
  • 用戶持有直接訪問權,繞過應用邏輯直連數據庫(後門風險)。
  • 審計困難:難以區分「應用正常訪問」與「用戶直接查詢」。

Grant Execute 模式核心架構

設計原則:所有數據訪問代碼封裝於 **PL/SQL 存儲過程/函數/包** 中,最終用戶**僅授予 EXECUTE 權限**,**零對象權限**。

Definer's Rights(定義者權限)— 核心機制

  • 過程創建者(定義者)擁有底層表的完整權限。
  • 調用者執行過程時,**臨時獲得定義者的權限**完成操作,過程結束權限即刻回收。
  • 調用者**無需**任何底層對象權限,徹底斷開直接訪問路徑。

對比 Invoker's Rights(調用者權限):調用者需自有底層權限,等同傳統模式,複雜度高、不推薦。

五大核心收益

  1. 代碼與數據字典共生:所有 SQL/業務邏輯駐留數據字典(USER_SOURCE、USER_PROCEDURES),易查找、版本化、熱修復(CREATE OR REPLACE)。
  2. 極致執行性能:11g+ DBMS_SHARED_POOL.KEEP 將熱點包鎖定 Library Cache,消除硬解析,微秒級響應。
  3. 數據與行為緊密耦合:類似 OOP 封裝,MEMBER METHOD 綁定對象類型,結構變更單點維護。
  4. 應用與數據庫解耦:前端零 SQL,僅調用標準接口(PKG_API.DO_BUSINESS),遷移目標庫零改前端代碼。
  5. 纵深訪問控制:
    - 行級:過程內 WHERE tenant_id = SYS_CONTEXT('CTX','TENANT')
    - 列級:僅返回授權列(SELECT id, name FROM t 隱藏敏感列)
    - 業務級:狀態機校驗(IF order_status='PAID' THEN ...)
    - 時間/上下文:SYS_CONTEXT('USERENV','IP_ADDRESS') 綁定白名單

三大局限與應對

局限影響應對策略
前期設計成本高需預先識別所有業務接口、參數、異常流領域驅動設計(DDD)劃分限界上下文,接口契約先行
過程語言鎖定(PL/SQL/Java)團隊技能棧受限核心邏輯 PL/SQL,邊緣擴展 Java/Python 外部過程(EXTPROC)
審計複雜傳統對象-用戶矩陣失效建立「接口-用戶」矩陣 + 統一審計 AUDIT EXECUTE PROCEDURE BY ACCESS + 解析 USER_SOURCE 關聯底層表

實施路線圖

  1. 盤點現狀:導出現有 DBA_TAB_PRIVS,識別高風險直接授權對象。
  2. 接口化重構:按業務域建立包(PKG_HR, PKG_FIN),將所有 DML/查詢封裝為 FUNCTION/PROCEDURE。
  3. 權限收斂:
    - REVOKE ALL ON t FROM PUBLIC
    - GRANT EXECUTE ON pkg_hr TO app_role
    - GRANT app_role TO end_users
  4. 驗證與監控:
    - 確認 DBA_TAB_PRIVS 僅剩系統必要授權。
    - 開啟 AUDIT EXECUTE PROCEDURE,建立基線。
    - 部署 DAM(數據庫活動監控)實時識別非常態調用。

總結

Grant Execute 模式以 **Definer's Rights** 為基石,將「數據訪問」轉化為「服務調用」,實現**零後門、可審計、高性能、可遷移**的安全架構。雖然前期投入大,但對核心業務系統屬於**一次性投入、長期受益**的高 ROI 選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved