作業系統層面:群組與權限最小化
- DBA 群組:安裝前建立,僅包含 root 與 Oracle 軟體擁有者,目錄權限
710 (rwx--x---)
- 操作群組:一般用戶加入,僅執行
SQL*Plus、Forms 等公開程式,權限 710
- 其他程式:不影響安全性的工具設
711 (rwx--x--x)
Unix/Linux 下 /etc/group 配置群組成員,Oracle 安裝程式自動將 SYSDBA 權限映射至 DBA 群組。
資料庫層面:預設帳號立即加固
-- 修改 SYS/SYSTEM 密碼(預設 CHANGE_ON_INSTALL/MANAGER)
ALTER USER SYS IDENTIFIED BY "StrongP@ssw0rd1";
ALTER USER SYSTEM IDENTIFIED BY "An0therStr0ngP@ss";
-- 鎖定/過期預設不需帳號
ALTER USER OUTLN PASSWORD EXPIRE ACCOUNT LOCK;
ALTER USER DBSNMP PASSWORD EXPIRE ACCOUNT LOCK;
-- 11g+ 可用 SEC_CASE_SENSITIVE_LOGON=TRUE 強制大小寫敏感
密碼策略:Profile 實作複雜度與生命週期
-- 建立驗證函數(範例:長度≥8、含大小寫數字特殊字元)
CREATE FUNCTION VERIFY_FN(
USERID VARCHAR2, PASSWORD VARCHAR2, OLD_PASSWORD VARCHAR2
) RETURN BOOLEAN IS
BEGIN
IF LENGTH(PASSWORD) < 8 THEN RETURN FALSE; END IF;
IF NOT REGEXP_LIKE(PASSWORD, '[A-Z]') THEN RETURN FALSE; END IF;
IF NOT REGEXP_LIKE(PASSWORD, '[a-z]') THEN RETURN FALSE; END IF;
IF NOT REGEXP_LIKE(PASSWORD, '[0-9]') THEN RETURN FALSE; END IF;
IF NOT REGEXP_LIKE(PASSWORD, '[^A-Za-z0-9]') THEN RETURN FALSE; END IF;
RETURN TRUE;
END;
/
-- 建立 Profile
CREATE PROFILE SECURE_PROF LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1/24 -- 鎖定 1 小時
PASSWORD_LIFE_TIME 90 -- 90 天換一次
PASSWORD_GRACE_TIME 7 -- 寬限期 7 天
PASSWORD_REUSE_TIME 365 -- 1 年不可重複
PASSWORD_REUSE_MAX 10
PASSWORD_VERIFY_FUNCTION VERIFY_FN;
-- 套用至用戶
ALTER USER APP_USER PROFILE SECURE_PROF;
資源限制 Profile
CREATE PROFILE DEV_PROF LIMIT
SESSIONS_PER_USER 2
CPU_PER_SESSION 10000 -- 百分之一秒
IDLE_TIME 30 -- 分鐘
CONNECT_TIME 480; -- 分鐘
-- 啟用資源限制
ALTER SYSTEM SET RESOURCE_LIMIT=TRUE SCOPE=BOTH;
稽核與監控
-- 保護稽核軌跡
AUDIT DELETE ON SYS.AUD$ BY ACCESS;
-- 關鍵操作稽核
AUDIT CREATE TABLE, DROP USER, ALTER SYSTEM BY ACCESS;
AUDIT SELECT ON SCOTT.EMP BY ACCESS WHENEVER SUCCESSFUL;
-- 查看稽核記錄
SELECT * FROM DBA_AUDIT_TRAIL WHERE TIMESTAMP > SYSDATE-1;
最小權限原則檢查清單
- 移除
PUBLIC 不必要的系統/物件權限
- 角色而非直接授權給用戶
- 定期審查
DBA_SYS_PRIVS, DBA_TAB_PRIVS, DBA_ROLE_PRIVS
- 啟用
O7_DICTIONARY_ACCESSIBILITY=FALSE (預設) 防止非 SYS 存取字典基表