Oracle 10g R2 重大安全強化:內建 `CONNECT` 角色從原本擁有 8 項建立類權限 (`CREATE TABLE`、`CREATE VIEW`...),縮減為**僅保留 `CREATE SESSION`**。導致依賴 `CONNECT` 角色的應用帳號無法建表、建視圖等。本文列出被移除權限清單、提供官方還原腳本 `rstrconn.sql`、並建議自訂角色替代內建角色的最佳實踐。
| 版本 | CONNECT 角色包含權限 | |
|---|---|---|
| 10g R1 及以前 | CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SYNONYM, CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, ALTER SESSION | |
| 10g R2 及以後 | 僅 CREATE SESSION |
| 場景 | 影響 | 建議對策 |
|---|---|---|
| 舊應用直接 GRANT CONNECT TO app_user | app_user 喪失建表/建視圖等權限,應用報 ORA-01031 | 短期:執行 rstrconn.sql 還原;長期:改用自訂角色 |
| 新應用開發 | 若繼續用 CONNECT 角色,權限不足 | 直接建立自訂角色,勿依賴內建角色 |
| 合規/稽核要求最小權限 | CONNECT 角色 (舊版) 權限過大;新版過小 | 自訂角色精確授權,滿足合規 |
-- 1. 建立應用開發角色
CREATE ROLE app_developer;
-- 2. 精確授予所需系統權限
GRANT CREATE SESSION,
CREATE TABLE,
CREATE VIEW,
CREATE SEQUENCE,
CREATE PROCEDURE,
CREATE TRIGGER,
CREATE TYPE,
CREATE SYNONYM,
CREATE DATABASE LINK
TO app_developer;
-- 3. 表空間配額 (替代 UNLIMITED TABLESPACE)
ALTER USER app_user QUOTA 500M ON users;
ALTER USER app_user QUOTA 1G ON data_ts;
-- 4. 授予角色給使用者
GRANT app_developer TO app_user;
-- 5. 設為預設角色 (登入自動啟用)
ALTER USER app_user DEFAULT ROLE app_developer;
-- 檢查目前 CONNECT 角色權限
SELECT privilege FROM role_sys_privs WHERE role = 'CONNECT';
-- 掃描被授予 CONNECT 角色的使用者
SELECT grantee FROM dba_role_privs WHERE granted_role = 'CONNECT';
-- 評估影響:這些使用者是否需建表/建視圖權限
SELECT u.username,
CASE WHEN EXISTS (SELECT 1 FROM dba_sys_privs WHERE grantee = u.username AND privilege LIKE 'CREATE %')
THEN '有直接權限' ELSE '可能受影響' END AS status
FROM dba_users u, dba_role_privs r
WHERE u.username = r.grantee
AND r.granted_role = 'CONNECT';
10g R2 `CONNECT` 角色瘦身是 Oracle 安全預設值強化的里程碑。雖有 `rstrconn.sql` 還原腳本,但**長期正解是建立自訂角色,精確授予業務所需權限**,徹底擺脫內建角色變更帶來的相容性風險。