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

Oracle 11g/12c/19c 密碼永不過期設定:PROFILE 管理與帳號解鎖完整步驟

     編輯:Oracle 教學

Oracle 11g/12c/19c 密碼永不過期設定:PROFILE 管理與帳號解鎖完整步驟

Oracle 11g 起預設啟用密碼複雜度驗證與 180 天壽命限制 (DEFAULT PROFILE 的 PASSWORD_LIFE_TIME),導致生產環境帳號定期被鎖定 (ORA-28000/ORA-28001)。本文提供標準修改流程、立即生效驗證、已鎖定帳號解鎖指令、CDB/PDB 多租戶架構下的注意事項。

標準修改流程 (單機/非 CDB 環境)

  1. 查詢使用者所屬 PROFILE
    SELECT username, profile FROM dba_users ORDER BY username;
    /* 多數使用者為 DEFAULT */
  2. 確認目前密碼壽命設定
    SELECT profile, resource_name, limit
    FROM   dba_profiles
    WHERE  profile = 'DEFAULT'
    AND    resource_name = 'PASSWORD_LIFE_TIME';
    /* 預設輸出:LIMIT = 180 (天) */
  3. 修改為無限制 (永不過期)
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
    /* 立即生效,無需重啟資料庫 */
  4. 驗證修改結果
    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) */
  5. 解鎖已過期/被鎖定帳號
    -- 單一帳號
    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;
    /

CDB/PDB 多租戶架構 (12c+) 注意事項

  • ALTER PROFILE 在 CDB$ROOT 執行時,預設僅影響 CDB$ROOT 內的 PROFILE。PDB 內有獨立的 PROFILE 字典。
  • 若需所有 PDB 同步修改,可在 CDB$ROOT 使用 CONTAINER=ALL (12.2+):
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED CONTAINER=ALL;
  • 或在每個 PDB 獨立執行:
    ALTER SESSION SET CONTAINER = pdb_name;
    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
  • 常見誤區:在 CDB$ROOT 修改後,PDB 內使用者仍受原 PROFILE 限制,必須確認 SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME'; 在各容器皆為 UNLIMITED。

相關密碼參數建議同步調整

參數預設值建議生產值說明
PASSWORD_LIFE_TIME180UNLIMITED密碼壽命 (天)
PASSWORD_GRACE_TIME7UNLIMITED寬限期 (天),過期後仍可登入但強制修改密碼
PASSWORD_REUSE_TIMEUNLIMITED365 或 UNLIMITED密碼重複使用間隔天數
PASSWORD_REUSE_MAXUNLIMITED10密碼歷史記錄筆數,防止輪換舊密碼
FAILED_LOGIN_ATTEMPTS1010 / UNLIMITED連續失敗鎖定閾值
PASSWORD_LOCK_TIME11 / UNLIMITED鎖定持續天數
PASSWORD_VERIFY_FUNCTIONNULL / 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-28000the account is locked帳號被鎖定 (FAILED_LOGIN_ATTEMPTS 或 管理員鎖定)ALTER USER ... ACCOUNT UNLOCK;
ORA-28001the password has expired密碼過期 (PASSWORD_LIFE_TIME)修改 PROFILE 或 ALTER USER ... IDENTIFIED BY new_pwd;
ORA-28002the password will expire within n days進入寬限期 (PASSWORD_GRACE_TIME)建議立即修改密碼
ORA-28003password verification failed不符合複雜度函數 (PASSWORD_VERIFY_FUNCTION)調整密碼符合規則或修改驗證函數

最佳實踐建議

  • 建立專屬應用程式 PROFILE (如 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 降低安全性。
  • 19c/21c 可啟用 PASSWORD_ROLLOVER_TIME 平滑輪換密碼 (應用端無感切換)。

透過 PROFILE 統一管理密碼策略,配合自動化稽核腳本,即可徹底解決「密碼定期過期導致服務中斷」的燙手山芋,同時維持資安合規基線。

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