Oracle 權限模型採雙軌並行:
-- 僅創建用戶,密碼複雜度由 Profile 控制
CREATE USER app_user IDENTIFIED BY "Str0ngP@ssw0rd!"
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON app_data
QUOTA 100M ON app_index
PROFILE app_profile
ACCOUNT UNLOCK;
-- 12c+ 專用:創建僅供應用使用的「無密碼」用戶 (僅通過代理認證/外部認證登錄)
CREATE USER app_proxy_user IDENTIFIED GLOBALLY AS 'CN=app_proxy,OU=DB,O=ORACLE';
-- 或
CREATE USER app_ext_user IDENTIFIED EXTERNALLY; -- OS/Kerberos/RADIUS 認證
關鍵參數解析:
-- 修改密碼 (用戶自助)
ALTER USER app_user IDENTIFIED BY "NewStr0ngP@ss!";
-- 或使用 PASSWORD 命令 (SQL*Plus/SQLcl/SQL Developer 隱式輸入,更安全)
PASSWORD -- 修改當前用戶密碼
PASSWORD app_user -- DBA 修改他人密碼
-- 密碼驗證函數 (Profile 關聯)
-- 12c+ 內置 ORA12C_VERIFY_FUNCTION / ORA12C_STRONG_VERIFY_FUNCTION
-- 自定義驗證函數示例 (PL/SQL)
CREATE OR REPLACE FUNCTION my_verify_fn (
username VARCHAR2, password VARCHAR2, old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
-- 長度、複雜度、歷史、字典詞檢查邏輯
RETURN TRUE; -- 通過
END;
/
-- 關聯到 Profile
ALTER PROFILE app_profile LIMIT PASSWORD_VERIFY_FUNCTION my_verify_fn;
-- 僅刪用戶 (若擁有對象報錯 ORA-01922)
DROP USER app_user;
-- 級聯刪除用戶及其所有對象 (表、索引、視圖、過程、類型、序列、同義詞、DB Link、Job 等)
DROP USER app_user CASCADE;
-- 生產環境謹慎操作建議:
-- 1. 先鎖定用戶防止新連接
ALTER USER app_user ACCOUNT LOCK;
-- 2. 殺掉現有會話
BEGIN
FOR s IN (SELECT sid, serial# FROM v$session WHERE username = 'APP_USER') LOOP
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''' IMMEDIATE';
END LOOP;
END;
/
-- 3. 導出對象 DDL (DBMS_METADATA) 備份
-- 4. 確認無業務依賴後執行 DROP USER ... CASCADE
| 角色 | 核心系統權限 | 適用場景 | 現代建議 |
|---|---|---|---|
| CONNECT | CREATE SESSION, ALTER SESSION, SET CONTAINER (12c+) | 極簡只讀/寫入應用賬號,需額外授予對象權限 | **僅作入門基線**,生產環境應定制精細角色 |
| RESOURCE | CREATE TABLE, SEQUENCE, PROCEDURE, TRIGGER, TYPE, CLUSTER, OPERATOR, INDEXTYPE, SYNONYM 等對象創建權限 **含 UNLIMITED TABLESPACE (12c 前)** | 開發/測試賬號,需創建對象但無 DBA 權限 | **生產環境慎用**:UNLIMITED TABLESPACE 風險大,建議改用 QUOTA 精確控制 |
| DBA | **所有系統權限** (WITH ADMIN OPTION),含 SYSDBA/SYSOPER 等效操作能力 | 數據庫管理員、自動化運維賬號 | **最小化授予**,嚴格審計,採用分級管理 (如 SYSBACKUP, SYSDG, SYSKM, SYSRAC 12c+ 專用角色) |
-- 1. 功能角色 (應用業務邏輯)
CREATE ROLE app_read_only;
GRANT SELECT ON schema_core.customers TO app_read_only;
GRANT SELECT ON schema_core.orders TO app_read_only;
GRANT EXECUTE ON schema_core.pkg_report TO app_read_only;
CREATE ROLE app_read_write;
GRANT app_read_only TO app_read_write; -- 角色嵌套
GRANT INSERT, UPDATE, DELETE ON schema_core.orders TO app_read_write;
GRANT INSERT, UPDATE ON schema_core.customers TO app_read_write;
GRANT EXECUTE ON schema_core.pkg_order_mgmt TO app_read_write;
CREATE ROLE app_admin;
GRANT app_read_write TO app_admin;
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO app_admin; -- 系統權限
GRANT ALTER ANY TABLE, DROP ANY TABLE TO app_admin; -- 高危,極度謹慎
-- 2. 基礎設施角色 (跨應用通用)
CREATE ROLE dev_read_only;
GRANT SELECT_CATALOG_ROLE TO dev_read_only; -- 查詢數據字典
GRANT SELECT ON v_$session TO dev_read_only; -- 動態視圖需額外授予
CREATE ROLE monitoring_user;
GRANT SELECT ON v_$session TO monitoring_user;
GRANT SELECT ON v_$sql TO monitoring_user;
GRANT SELECT ON v_$active_session_history TO monitoring_user;
GRANT SELECT ON dba_hist_active_sess_history TO monitoring_user;
-- 3. 安全分離角色 (職責分離)
CREATE ROLE security_admin;
GRANT CREATE USER, ALTER USER, DROP USER TO security_admin;
GRANT GRANT ANY ROLE, GRANT ANY PRIVILEGE TO security_admin;
GRANT AUDIT_ADMIN, AUDIT_VIEWER TO security_admin;
CREATE ROLE backup_admin;
GRANT SYSBACKUP TO backup_admin; -- 12c+ 專用備份恢復角色
| 維度 | 系統權限 | 對象權限 | 角色 |
|---|---|---|---|
| 授予者 | SYS/SYSTEM/DBA/持有 GRANT ANY PRIVILEGE | 對象擁有者/持有 GRANT ANY OBJECT PRIVILEGE/持有對象權限 WITH GRANT OPTION | 角色擁有者/持有角色 WITH ADMIN OPTION |
| 傳遞性 | **支持**:WITH ADMIN OPTION → 受授者可再授予/撤銷 | **支持**:WITH GRANT OPTION → 受授者可再授予對象權限 | **支持**:WITH ADMIN OPTION → 受授者可再授予角色 |
| 級聯撤銷 | **不級聯**:A→B→C,A 撤銷 B,C 保留權限 | **級聯**:A→B→C,A 撤銷 B,C 權限**同步失效** (CASCADE) | **不級聯**:同系統權限 |
| 跨用戶撤銷 | **支持**:DBA 可直接撤銷任意用戶權限 | **支持**:對象擁有者/DBA 可撤銷任意用戶對象權限 | **支持**:角色擁有者/DBA 可撤銷任意用戶角色 |
| 撤銷語法 | REVOKE create table FROM app_user; | REVOKE SELECT ON schema.tab FROM app_user; | REVOKE app_role FROM app_user; |
| 視圖 | 用途 | 典型查詢 |
|---|---|---|
| DBA_USERS / ALL_USERS / USER_USERS | 用戶基本信息、狀態、默認表空間、Profile、創建時間 | `SELECT username, account_status, default_tablespace, profile FROM dba_users WHERE username LIKE 'APP_%';` |
| DBA_SYS_PRIVS / USER_SYS_PRIVS | 用戶/角色直接授予的系統權限 | `SELECT * FROM dba_sys_privs WHERE grantee = 'APP_USER';` |
| DBA_ROLE_PRIVS / USER_ROLE_PRIVS | 用戶/角色被授予的角色 (含 ADMIN_OPTION, DEFAULT_ROLE) | `SELECT * FROM dba_role_privs WHERE grantee = 'APP_USER';` |
| DBA_TAB_PRIVS / ALL_TAB_PRIVS / USER_TAB_PRIVS | 用戶/角色對象權限 (含 GRANTOR, GRANTABLE, HIERARCHY) | `SELECT * FROM dba_tab_privs WHERE table_name = 'CUSTOMERS' AND owner = 'SCHEMA_CORE';` |
| DBA_COL_PRIVS | 列級對象權限 | `SELECT * FROM dba_col_privs WHERE table_name = 'EMPLOYEES';` |
| ROLE_SYS_PRIVS / ROLE_TAB_PRIVS / ROLE_ROLE_PRIVS | 角色擁有的系統/對象/角色權限 | `SELECT * FROM role_sys_privs WHERE role = 'APP_READ_WRITE';` |
| SESSION_PRIVS / SESSION_ROLES | **當前會話生效**的系統權限/角色 (含間接角色、安全應用角色動態啟用結果) | `SELECT * FROM session_privs WHERE privilege LIKE '%TABLE%';` |
| DBA_PROFILES | Profile 資源/密碼限制參數 | `SELECT * FROM dba_profiles WHERE profile = 'APP_PROFILE';` |