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

Oracle SYSTEM 用戶權限真相:OS 驗證 vs 密碼文件驗證的登入機制差異

     編輯:Oracle 資料庫基礎

為什麼有時 `SYSTEM` 可直接以 `SYSDBA` 登入,有時卻報 `ORA-01031: insufficient privileges`?關鍵在於 **驗證模式** 設定:OS 驗證 允許作業系統群組成員以任意帳號/密碼以 `SYSDBA` 身分登入 (實際映射為 `SYS`),而 密碼文件驗證 則嚴格核對密碼文件中的授權使用者。本文深度解析兩種驗證機制、`sqlnet.ora` 切換方式、`SYS`/`SYSTEM` 實際權限差異,並還原現場排查過程。

兩種特權驗證機制

維度OS 驗證密碼文件驗證
原理作業系統群組 (Windows: ORA_DBA, Linux: dba) 成員身分驗證Oracle 密碼文件 ($ORACLE_HOME/dbs/orapwSID) 記錄授權使用者
登入行為輸入任意 user/pass,以 SYSDBA 登入 → 實際成為 SYS需密碼文件中有該使用者且密碼正確
SHOW USER 結果SYS輸入的使用者名 (如 SYSTEM)
適用場景本地維護、單機、DBA 團隊共用 OS 帳號遠端管理、多實例、審計要求明確身分
安全性較低 (OS 群組成員皆可)較高 (需知密碼文件密碼)

sqlnet.ora 切換驗證模式


# 位置:$ORACLE_HOME/network/admin/sqlnet.ora

# OS 驗證 (Windows NTS)
SQLNET.AUTHENTICATION_SERVICES = (NTS)

# 密碼文件驗證 (NONE 表不使用 OS 驗證)
SQLNET.AUTHENTICATION_SERVICES = (NONE)

修改後需重啟 Listener 或重新建立連線生效。

SYS vs SYSTEM 實際權限對比

項目SYSSYSTEM
內建角色/權限DBA, SYSDBA, SYSOPERDBA (僅角色),無 SYSDBA/SYSOPER
資料字典基表擁有者是 (所有基表在 SYS 下)否
允許登入身分僅 SYSDBA, SYSOPER (不可 NORMAL)NORMAL (預設),授予後可 SYSDBA/SYSOPER
密碼文件永遠存在於密碼文件中需手動授予 SYSDBA 才寫入密碼文件

現場案例還原

現象: 新建資料庫,用 PL/SQL Developer 以 `SYSTEM` / `SYSDBA` 登入 → `ORA-01031`。
  1. 檢查 `sqlnet.ora` 發現設為 `SQLNET.AUTHENTICATION_SERVICES = (NONE)` (密碼文件模式)。
  2. 密碼文件中只有 `SYS`,無 `SYSTEM`。
  3. 以 `SYS` / `SYSDBA` 登入成功。
  4. 執行 `GRANT SYSDBA TO SYSTEM;` → `SYSTEM` 寫入密碼文件。
  5. 再以 `SYSTEM` / `SYSDBA` 登入成功。

為什麼以前 SYSTEM 可直接 SYSDBA 登入?

因為舊環境 `sqlnet.ora` 設為 `NTS` (OS 驗證)。OS 群組 `ORA_DBA` 成員以任何帳號以 `SYSDBA` 登入皆映射為 `SYS`,看似 `SYSTEM` 成功,實際是 `SYS`。修改為 `NONE` 後,嚴格驗證密碼文件,`SYSTEM` 無授權即失敗。

最佳實務建議

  1. 生產環境統一使用密碼文件驗證 (NONE): 明確審計誰以特權登入。
  2. 嚴禁應用程式使用 SYS/SYSTEM: 建立專用管理帳號並授予所需特定權限。
  3. 密碼文件管理:
    • 定期備份 `$ORACLE_HOME/dbs/orapwSID`。
    • 使用 `orapwd` 重建時加入 `FORCE=Y` 覆蓋、 `SYSBACKUP`、`SYSDG`、`SYSKM` (12c+ 新特權)。
  4. 遠端管理: 配合 Oracle Enterprise Manager / Data Guard Broker 使用專用管理帳號 (如 `SYSDG`)。
  5. 文檔化: 記錄每個實例的驗證模式、密碼文件位置、授權特權使用者清單。

快速驗證腳本


-- 目前驗證模式
SELECT value FROM v$parameter WHERE name = 'os_authent_prefix';
-- 或檢查 sqlnet.ora 實際生效值

-- 密碼文件中授權使用者
SELECT * FROM v$pwfile_users;

-- 當前登入身分
SHOW USER;
SELECT SYS_CONTEXT('USERENV','SESSION_USER') FROM DUAL;
SELECT SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') FROM DUAL; -- OS / PASSWORDFILE

搞清 OS 驗證與密碼文件驗證的本質差異,即可預防「以為有權限實際無權限」的生產事故,並建立可審計、可控制的特權存取體系。

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