用戶登入提示:ORA-28000: the account is locked。需快速定位鎖定原因、解鎖並防範復發。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
Session altered.
SQL> SELECT username, account_status, lock_date
FROM dba_users
WHERE username = 'TEST';
USERNAME ACCOUNT_STATUS LOCK_DATE
-------- -------------- -------------------
TEST LOCKED 2009-03-10 08:51:03
SQL> ALTER USER test ACCOUNT UNLOCK;
User altered.
SQL> SELECT username, account_status FROM dba_users WHERE username = 'TEST';
USERNAME ACCOUNT_STATUS
-------- --------------
TEST OPEN
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=Oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49434)) * establish * lhoms * 0
10-MAR-2009 08:51:03 * (CONNECT_DATA=(SID=lhoms)(SERVER=DEDICATED)(CID=(PROGRAM=Oracle)(HOST=omstestdb)(USER=oraoms))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.69.1.11)(PORT=49435)) * establish * lhoms * 0
關鍵資訊:HOST=10.69.1.11 在鎖定時間點發起多次連線嘗試,導致帳號鎖定。
SQL> SELECT * FROM dba_profiles WHERE resource_name = 'FAILED_LOGIN_ATTEMPTS';
PROFILE RESOURCE_NAME RESOURCE_TYPE LIMIT
-------- ------------------------- ------------- -----
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
預設 10 次失敗即鎖定。
-- 方案 1:提高閾值至 30 次 (平衡安全與可用性)
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 30;
-- 方案 2:設為無限 (UNLIMITED) — 僅限測試/內網,生產強烈不建議
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
-- 方案 3:建立專用 Profile 區分應用帳號與人工帳號
CREATE PROFILE app_profile LIMIT
FAILED_LOGIN_ATTEMPTS 50
PASSWORD_LIFE_TIME 180
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 5;
ALTER USER app_user PROFILE app_profile;
| 參數 | 預設 | 建議生產值 | 說明 |
|---|---|---|---|
| FAILED_LOGIN_ATTEMPTS | 10 | 30-50 | 登入失敗鎖定閾值 |
| PASSWORD_LOCK_TIME | 1 (天) | 1/24 (1小時) | 鎖定持續時間,UNLIMITED 需手動解鎖 |
| PASSWORD_LIFE_TIME | 180 (天) | 90-180 | 密碼有效期 |
| PASSWORD_GRACE_TIME | 7 (天) | 7 | 寬限期 |
| PASSWORD_REUSE_TIME | UNLIMITED | 365 | 密碼重複使用間隔 |
| PASSWORD_REUSE_MAX | UNLIMITED | 5 | 歷史密碼記憶數 |
| PASSWORD_VERIFY_FUNCTION | NULL | CUSTOM_FUNCTION | 密碼複雜度驗證函數 |
-- 近 7 天所有鎖定事件
SELECT username, lock_date, expiry_date
FROM dba_users
WHERE account_status = 'LOCKED'
AND lock_date >= SYSDATE - 7
ORDER BY lock_date DESC;
-- 結合審計追蹤 (若啟用 AUDIT)
SELECT os_username, username, terminal, timestamp, action_name, returncode
FROM dba_audit_trail
WHERE action_name = 'LOGON'
AND returncode IN (1017, 28000) -- 1017:密碼錯誤, 28000:帳號鎖定
ORDER BY timestamp DESC;
testOnBorrow=true),避免大量失敗連線觸發鎖定LOG_DIRECTORY、LOG_FILE_NUM、LOG_FILE_SIZE 防止日誌佔滿磁碟DBA_USERS.ACCOUNT_STATUS='LOCKED' 即時通知 DBAUTLPWDMG.SQL 或自訂函數強制複雜度ALTER USER ... ACCOUNT UNLOCK用戶鎖定雖是安全機制,誤觸卻是業務中斷常見主因。建立「查詢→解鎖→追蹤→調整→預防」閉環機制,讓安全與可用性並行不悖。