認證機制對照表
| 維度 | 資料庫認證 | 外部認證 | 全域認證 |
| 密碼儲存位置 | 資料庫內部 (加密) | 不儲存於資料庫 | 不儲存於資料庫 |
| 驗證主體 | Oracle Server | 作業系統 / LDAP / Kerberos | Oracle Enterprise Security (OES) / Oracle Internet Directory (OID) |
| 建立語法 | IDENTIFIED BY password | IDENTIFIED EXTERNALLY | IDENTIFIED GLOBALLY AS 'DN' |
| 適用場景 | 一般應用、開發測試 | SSO 整合、Windows 域、Kerberos | 企業級統一身分管理、雲端部署 |
| 授權管理 | 資料庫角色/權限 | OS 群組映射角色 | 全域角色/企業角色 |
| 網路加密 | 需額外設定 SSL/TLS | 依外部機制 (Kerberos 加密) | 內建 SSL/TLS |
1. 資料庫認證 - 最常用、最簡單
建立使用者
CREATE USER app_user IDENTIFIED BY "Str0ngP@ssw0rd!"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users
PROFILE secure_profile
ACCOUNT UNLOCK;
驗證流程
- 用戶提供 username/password
- Oracle 計算密碼雜湊(SHA-1/SHA-2/SCRAM)
- 與
SYS.USER$ 儲存值比對
- 檢查帳號狀態、密碼過期、Profile 限制
- 建立 Session
優缺點
- ✅ 簡單、無外部依賴、完整由 DBA 控管
- ❌ 密碼管理分散、難以整合企業 SSO、輪換需應用配合
2. 外部認證 - OS/LDAP/Kerberos 整合
建立使用者
-- OS 認證 (Windows/Linux)
CREATE USER ops$oracle IDENTIFIED EXTERNALLY;
-- LDAP/Kerberos (需設定 sqlnet.ora)
CREATE USER "cn=john,ou=users,dc=corp,dc=com" IDENTIFIED EXTERNALLY;
關鍵設定:sqlnet.ora
# OS 認證
SQLNET.AUTHENTICATION_SERVICES = (NTS) -- Windows
SQLNET.AUTHENTICATION_SERVICES = (NONE) -- Linux OS auth 需額外設定
# Kerberos
SQLNET.AUTHENTICATION_SERVICES = (KERBEROS5)
SQLNET.KERBEROS5_CONF = /etc/krb5.conf
SQLNET.KERBEROS5_KEYTAB = /etc/oracle.keytab
# LDAP (OID/OUD/AD)
SQLNET.AUTHENTICATION_SERVICES = (LDAP)
SQLNET.LDAP_AUTHENTICATION = SSL
NAMES.DIRECTORY_PATH = (TNSNAMES, LDAP)
OS 認證運作機制
- 用戶已登入 OS(Windows 域 / Linux SSH 金鑰)
- 啟動 sqlplus
/(無帳號密碼)
- Oracle 取得 OS 使用者名稱(如
ORACLE)
- 前綴
OPS$ → OPS$ORACLE
- 比對資料庫是否存在
CREATE USER OPS$ORACLE IDENTIFIED EXTERNALLY
- 通過 → 建立 Session
角色映射:OS 群組 → 資料庫角色
-- 建立外部角色
CREATE ROLE dba_role IDENTIFIED EXTERNALLY;
GRANT CREATE SESSION, CREATE TABLE TO dba_role;
-- OS 群組映射 (Windows 登錄表 / Linux /etc/oracle/ora_grps)
-- Windows: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\OSAUTH_PREFIX_DOMAIN
-- 群組名: ORA_DBA, ORA_OPER, ORA_SID_DBA 等
3. 全域認證 - 企業級統一身分管理
架構元件
- Oracle Enterprise Security (OES):核心服務
- Oracle Internet Directory (OID) / Unified Directory (OUD):LDAP 目錄
- Oracle Wallet:憑證/私鑰儲存
- Enterprise Manager:管理介面
建立全域使用者
-- DN (Distinguished Name) 來自目錄伺服器
CREATE USER "cn=jane,ou=engineers,dc=corp,dc=com" IDENTIFIED GLOBALLY AS 'cn=jane,ou=engineers,dc=corp,dc=com';
-- 或使用 GUID (12c+)
CREATE USER global_user IDENTIFIED GLOBALLY GUID 'A1B2C3D4-E5F6-7890-ABCD-EF1234567890';
全域角色與企業角色
-- 全域角色 (僅限全域使用者授予)
CREATE ROLE global_read_only IDENTIFIED GLOBALLY;
GRANT SELECT ON critical_table TO global_read_only;
-- 企業角色 (可授予全域使用者、外部使用者、資料庫使用者)
-- 需透過 Enterprise Manager 或 OID 管理主控台建立
Wallet 設定 (用戶端/伺服器)
# sqlnet.ora
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /etc/oracle/wallet)))
SSL_CLIENT_AUTHENTICATION = TRUE
SSL_VERSION = 1.2
SSL_CIPHER_SUITES = (TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
三種認證共存與遷移策略
共存模式
同一資料庫可同時存在三類使用者:
SELECT username, authentication_type FROM dba_users;
-- AUTHENTICATION_TYPE: DATABASE / EXTERNAL / GLOBAL
遷移路徑:資料庫認證 → 外部/全域認證
-- 1. 建立對應的外部/全域使用者
CREATE USER "ops$app_user" IDENTIFIED EXTERNALLY;
-- 2. 複製權限
-- 使用 DBMS_METADATA.GET_GRANTED_DDL 輸出原使用者權限
-- 套用至新使用者
-- 3. 修改應用連線方式
-- 移除密碼,使用 OS 認證 / Wallet / Kerberos Ticket
-- 4. 鎖定/移除舊資料庫認證使用者
ALTER USER app_user ACCOUNT LOCK;
-- 觀察一段時間後 DROP USER
選擇決策矩陣
| 需求 | 推薦認證 | 理由 |
| 快速開發、獨立應用、無 SSO 需求 | 資料庫認證 | 零設定、完全控管 |
| Windows 域環境、DBA 免密維護 | 外部認證 (NTS) | 整合 AD、單一登入 |
| Linux/Unix Kerberos 基礎建設 | 外部認證 (KERBEROS5) | 強加密、雙向認證 |
| 企業級統一身分、雲端混合部署 | 全域認證 (OES/OID) | 集中管理、憑證基礎、支援 PDB |
| 法規要求集中存取控制、審計 | 全域認證 | 企業角色、細粒度授權 |
常見誤區
- 誤區:外部認證不需要資料庫建立使用者。
事實:資料庫必須建立 IDENTIFIED EXTERNALLY 使用者,才能映射外部身分。
- 誤區:全域認證需要 Oracle RAC。
事實:單機也可使用全域認證,只需 OES/OID 基礎建設。
- 誤區:
IDENTIFIED EXTERNALLY 密碼為空。
事實:不儲存密碼,驗證委外給 OS/LDAP/Kerberos。
- 誤區:全域使用者無法擁有物件。
事實:全域使用者可建立物件、授予權限,功能完整。
安全性比較
| 面向 | 資料庫認證 | 外部認證 | 全域認證 |
| 密碼外洩風險 | 中(資料庫內) | 無(不存密碼) | 無(憑證/Token) |
| 中間人攻擊防禦 | 需 SSL | Kerberos 內建 | SSL/TLS 內建 |
| 單一登入 (SSO) | 不支援 | 支援 (OS/Kerberos) | 支援 (企業目錄) |
| 集中帳號管理 | 分散 | OS/LDAP 集中 | 企業目錄集中 |
| 部署複雜度 | 低 | 中 | 高 |