Oracle 11g 起預設啟用密碼複雜度驗證與 180 天壽命限制 (DEFAULT PROFILE 的 PASSWORD_LIFE_TIME),導致生產環境帳號定期被鎖定 (ORA-28000/ORA-28001)。本文提供標準修改流程、立即生效驗證、已鎖定帳號解鎖指令、CDB/PDB 多租戶架構下的注意事項。
SELECT username, profile FROM dba_users ORDER BY username; /* 多數使用者為 DEFAULT */
SELECT profile, resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; /* 預設輸出:LIMIT = 180 (天) */
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; /* 立即生效,無需重啟資料庫 */
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
AND resource_name IN ('PASSWORD_LIFE_TIME','PASSWORD_GRACE_TIME','FAILED_LOGIN_ATTEMPTS');
/* 預期輸出:
PROFILE RESOURCE_NAME LIMIT
-------- ---------------------- -------
DEFAULT PASSWORD_LIFE_TIME UNLIMITED
DEFAULT PASSWORD_GRACE_TIME UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS 10 (或 UNLIMITED) */
-- 單一帳號
ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK;
-- 批次解鎖所有 STATUS='EXPIRED' 或 'LOCKED' 的使用者 (謹慎執行)
BEGIN
FOR r IN (SELECT username FROM dba_users WHERE account_status IN ('EXPIRED','LOCKED','EXPIRED(GRACE)','LOCKED(TIMED)')) LOOP
EXECUTE IMMEDIATE 'ALTER USER ' || r.username || ' ACCOUNT UNLOCK';
DBMS_OUTPUT.PUT_LINE('UNLOCKED: ' || r.username);
END LOOP;
END;
/
ALTER PROFILE 在 CDB$ROOT 執行時,預設僅影響 CDB$ROOT 內的 PROFILE。PDB 內有獨立的 PROFILE 字典。CONTAINER=ALL (12.2+):ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED CONTAINER=ALL;ALTER SESSION SET CONTAINER = pdb_name;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME'; 在各容器皆為 UNLIMITED。| 參數 | 預設值 | 建議生產值 | 說明 |
|---|---|---|---|
PASSWORD_LIFE_TIME | 180 | UNLIMITED | 密碼壽命 (天) |
PASSWORD_GRACE_TIME | 7 | UNLIMITED | 寬限期 (天),過期後仍可登入但強制修改密碼 |
PASSWORD_REUSE_TIME | UNLIMITED | 365 或 UNLIMITED | 密碼重複使用間隔天數 |
PASSWORD_REUSE_MAX | UNLIMITED | 10 | 密碼歷史記錄筆數,防止輪換舊密碼 |
FAILED_LOGIN_ATTEMPTS | 10 | 10 / UNLIMITED | 連續失敗鎖定閾值 |
PASSWORD_LOCK_TIME | 1 | 1 / UNLIMITED | 鎖定持續天數 |
PASSWORD_VERIFY_FUNCTION | NULL / VERIFY_FUNCTION_11G | 自訂函數 / NULL | 複雜度驗證函數,生產環境建議自訂 |
-- 一次性調整多項參數
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 10
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1;
PROFILE 參數修改屬於字典更新,下一次使用者登入或現有 Session 重新驗證時即生效。若需強制現有 Session 立即受影響,可執行:
-- 刷新共用池 (謹慎,會影響效能) ALTER SYSTEM FLUSH SHARED_POOL; -- 或殺掉特定使用者 Session ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
| 錯誤碼 | 訊息 | 原因 | 解決 |
|---|---|---|---|
| ORA-28000 | the account is locked | 帳號被鎖定 (FAILED_LOGIN_ATTEMPTS 或 管理員鎖定) | ALTER USER ... ACCOUNT UNLOCK; |
| ORA-28001 | the password has expired | 密碼過期 (PASSWORD_LIFE_TIME) | 修改 PROFILE 或 ALTER USER ... IDENTIFIED BY new_pwd; |
| ORA-28002 | the password will expire within n days | 進入寬限期 (PASSWORD_GRACE_TIME) | 建議立即修改密碼 |
| ORA-28003 | password verification failed | 不符合複雜度函數 (PASSWORD_VERIFY_FUNCTION) | 調整密碼符合規則或修改驗證函數 |
APP_PROFILE) 而非修改 DEFAULT,避免影響 SYS/SYSTEM 等系統帳號。CREATE PROFILE app_profile LIMIT PASSWORD_LIFE_TIME UNLIMITED ...; 然後 ALTER USER app_user PROFILE app_profile;DBA_USERS.ACCOUNT_STATUS、DBA_PROFILES,確保無帳號意外進入 EXPIRED/LOCKED 狀態。PASSWORD_VERIFY_FUNCTION 實作自訂複雜度 (長度、大小寫、數字、特殊字元、非重複歷史),而非單純依賴 UNLIMITED 降低安全性。PASSWORD_ROLLOVER_TIME 平滑輪換密碼 (應用端無感切換)。透過 PROFILE 統一管理密碼策略,配合自動化稽核腳本,即可徹底解決「密碼定期過期導致服務中斷」的燙手山芋,同時維持資安合規基線。