Oracle
根據正在使用的 SQL 客戶端限制 Oracle DB 登錄
我們的組織中有一個基於 Oracle Forms 11g(在 Oracle Fusion Middleware/WLS 上)的應用程序。使用者可以通過在數據庫中創建的帳戶訪問應用程序(即它們存在於 中
dba_users
)。每個使用者都根據他們的工作領域分配了一個特定的角色,他們使用使用者 ID 登錄到應用程序。使用者可能對應用程序中的某些功能具有讀/寫訪問權限,為此他們的角色具有以下權限 -EXECUTE ANY LIBRARY SELECT ANY SEQUENCE EXECUTE ANY TYPE EXECUTE ANY PROCEDURE UPDATE ANY TABLE SELECT ANY TABLE DELETE ANY TABLE EXECUTE ANY INDEXTYPE INSERT ANY TABLE
現在我們有一些使用者請求 SQL 客戶端訪問(即 TNS 設置),以便他們可以連接到數據庫並為他們的研究執行查詢。這些業務使用者當然精通 SQL,但我們希望根據他們用於登錄數據庫的客戶端類型來限制他們的訪問。除應用程序本身之外的任何客戶端都應將它們限制為“只讀”。
有沒有辦法做到這一點?
您可以使用數據庫觸發器檢查它,例如:
CREATE ROLE ROLE_POWER_USER NOT IDENTIFIED; CREATE OR REPLACE TRIGGER LOG_T_LOGON AFTER LOGON ON DATABASE DECLARE osUser VARCHAR2(30); machine VARCHAR2(100); prog VARCHAR2(100) ip VARCHAR2(15); BEGIN IF ora_login_user IS NULL THEN RETURN; END IF; SELECT OSUSER, MACHINE, PROGRAM, ora_client_ip_address INTO osUser, machine, prog, ip FROM V$SESSION WHERE SID = SYS_CONTEXT('USERENV', 'SID'); IF NOT DBMS_SESSION.IS_ROLE_ENABLED('ROLE_POWER_USER') THEN IF LOWER(prog) <> 'your_application_name.exe' THEN RAISE_APPLICATION_ERROR(-20000, 'Logon denied: You must use only the official client application'); END IF; ELSE IF LOWER(prog) NOT IN ('sqlplus.exe', 'toad.exe') THEN RAISE_APPLICATION_ERROR(-20000, 'Logon denied: You must use only SQL*Plus or TOAD for you private queries'); END IF; END IF; -- Successful login, continue as normal END; /
您還可以檢查其他條件,例如 IP 地址或機器名稱。
SELECT
您必須以“經典”方式授予使用者或 ROLE 的表和視圖的權限。此觸發器僅阻止使用某些工具登錄到數據庫。請注意,具有系統特權的使用者
ADMINISTER DATABASE TRIGGER
(例如DBA
角色,或者SYS
當然)永遠不會出現異常,即他們可以在任何情況下登錄到數據庫並且您不能通過觸發器阻止它。另一個注意事項:此觸發器不安全!例如,您可以簡單地複制您的本地文件
sqlplus.exe
並為其命名your_application_name.exe
。然後這個觸發器將允許使用它。使用 JDBC,它甚至是一個可以設置的簡單屬性,請參閱https://stackoverflow.com/questions/42027389/programatically-set-vsession-program-property