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

Oracle 用戶密碼修改與臨時變更技巧:DBA 運維必備技能

     編輯:Oracle 資料庫基礎

業務場景

DBA 需以普通用戶身份執行操作,但不知其密碼,且不允許永久修改密碼影響應用。解決方案:記錄加密密碼 → 修改密碼 → 操作完成 → 恢復原密碼。

核心知識點

  • DBA_USERS.PASSWORD 存儲的是加密哈希值(11g+ 為 SHA-1,12c+ 為 PBKDF2)
  • ALTER USER ... IDENTIFIED BY VALUES 'hash' 可直接按哈希值恢復密碼,無需明文
  • ACCOUNT UNLOCK 解鎖被鎖定用戶

標準操作流程演示

-- 1. 以 SYSDBA 連接
SQL> CONNECT / AS SYSDBA

-- 2. 查詢目標用戶加密密碼
SQL> SELECT USERNAME, PASSWORD FROM DBA_USERS WHERE USERNAME = 'SYSTEM';
USERNAME  PASSWORD
--------  ------------------------------
SYSTEM    2D594E86F93B17A1

-- 3. 修改密碼為已知值
SQL> ALTER USER SYSTEM IDENTIFIED BY MANAGER;
User altered.

-- 4. 解鎖(如被鎖定)
SQL> ALTER USER SYSTEM ACCOUNT UNLOCK;
User altered.

-- 5. 以新密碼登入執行業務操作
SQL> CONNECT SYSTEM/MANAGER
Connected.
-- ... 執行所需操作 ...

-- 6. 恢復原密碼(使用 VALUES 子句)
SQL> CONNECT / AS SYSDBA
SQL> ALTER USER SYSTEM IDENTIFIED BY VALUES '2D594E86F93B17A1';
User altered.

-- 7. 驗證原密碼生效
SQL> CONNECT SYSTEM/ORACLE  -- 原密碼
Connected.

進階:批量腳本化(適用多用戶臨時切換)

CREATE OR REPLACE PROCEDURE TEMP_CHANGE_PWD(
  P_USER     VARCHAR2,
  P_NEW_PWD  VARCHAR2,
  P_ACTION   VARCHAR2  -- 'BACKUP' | 'RESTORE'
) AS
  V_HASH VARCHAR2(100);
BEGIN
  IF P_ACTION = 'BACKUP' THEN
    SELECT PASSWORD INTO V_HASH FROM DBA_USERS WHERE USERNAME = UPPER(P_USER);
    -- 存入臨時表或上下文
    INSERT INTO TMP_PWD_BACKUP(USERNAME, PASSWORD_HASH, BACKUP_TIME)
    VALUES (UPPER(P_USER), V_HASH, SYSDATE);
    EXECUTE IMMEDIATE 'ALTER USER ' || P_USER || ' IDENTIFIED BY ' || P_NEW_PWD;
    EXECUTE IMMEDIATE 'ALTER USER ' || P_USER || ' ACCOUNT UNLOCK';
    COMMIT;
  ELSIF P_ACTION = 'RESTORE' THEN
    SELECT PASSWORD_HASH INTO V_HASH
    FROM TMP_PWD_BACKUP WHERE USERNAME = UPPER(P_USER)
    AND BACKUP_TIME = (SELECT MAX(BACKUP_TIME) FROM TMP_PWD_BACKUP WHERE USERNAME = UPPER(P_USER));
    EXECUTE IMMEDIATE 'ALTER USER ' || P_USER || ' IDENTIFIED BY VALUES ''' || V_HASH || '''';
    DELETE FROM TMP_PWD_BACKUP WHERE USERNAME = UPPER(P_USER) AND PASSWORD_HASH = V_HASH;
    COMMIT;
  END IF;
END;
/
-- 使用
EXEC TEMP_CHANGE_PWD('SCOTT','TEMP123','BACKUP');
-- ...操作...
EXEC TEMP_CHANGE_PWD('SCOTT',NULL,'RESTORE');

注意事項與避坑

風險點說明對策
密碼版本差異11g/12c/18c/19c 哈希算法不同,VALUES 子句需匹配版本同版本庫間操作,跨版本遷移用 Data Pump
密碼驗證函數PROFILE 中 PASSWORD_VERIFY_FUNCTION 可能拒絕簡單密碼臨時分配無限制 PROFILE 或關閉驗證
審計觸發ALTER USER 會產生審計記錄操作前通知安審,事後提供證據鏈
應用連接池修改密碼導致連接池報錯,應用重連風暴維護窗口操作,配合應用停機或漸進式切換
Data Guard 同步主庫修改密碼需同步到備庫確保 DG 同步正常,或備庫同步執行

替代方案:代理認證

10g+ 支持代理用戶,無需知道目標密碼即可以其身份操作:

-- 授權代理
ALTER USER SCOTT GRANT CONNECT THROUGH DBA_USER;

-- DBA_USER 以 SCOTT 身份連接
CONNECT DBA_USER[SCOTT]/DBA_PASS@DB
-- 當前用戶即為 SCOTT,權限、審計均按 SCOTT 計算
  • 無需修改密碼,零風險
  • 審計追蹤顯示真實操作者
  • 支持多層代理鏈

密碼管理最佳實踐

  1. 建立密碼變更審批流程,記錄申請人、原因、時間、審批人
  2. 使用密碼複雜度驗證函數(UTLPWDMG.SQL)
  3. 定期輪換服務賬號密碼,配合密碼倉(如 HashiCorp Vault、CyberArk)
  4. 啟用FAILED_LOGIN_ATTEMPTS 鎖定策略防暴力破解
  5. 關鍵用戶(SYS/SYSTEM)啟用雙因子認證或SSL 證書認證
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved