Oracle11g 密碼延遲認證導致library cache lock的情況分析
在 Oracle 11g 中,為了提升安全性,Oracle 引入了『密碼延遲驗證』的新特性。這個特性的作用是,如果用戶輸入了錯誤的密碼嘗試登錄,那麽隨著登錄錯誤次數的增加,每次登錄前驗證的時間也會增加,以此減緩可能對於數據庫重復的口令嘗試攻擊。
但是對於正常的系統,由於口令的更改,可能存在某些被遺漏的客戶端,不斷重復嘗試,從而引起數據庫內部長時間的 Library Cache Lock的等待,這種情形非常常見。
如果遇到這一類問題,可以通過Event 28401關閉這個特性,從而消除此類影響,以下命令將修改設置在參數文件中:
ALTER SYSTEM SET EVENT =
‘28401 TRACE NAME CONTEXT FOREVER, LEVEL 1‘ SCOPE = SPFILE;
出現這類問題非常典型的AWR報告呈現如下,首先在 TOP 5 中,你可能看到顯著的 Library Cache Lock 的等待 ,如果用sql查等待時間,則username列為空,以下範例來自11.2.0.3.0版本的真實情況:
在這類情況下,時間模型 - Time Model 中會顯示如下指標,其中 connection management call elapsed time 占據了主要的DB Time,這個等待直接表明是在建立數據庫連接時產生的:
這類問題,在Oracle的11g中是常見和確定的,在MOS上可以找到相應的記錄:High ‘library cache lock‘ Wait Time Due to Invalid Login Attempts(1309738.1)
下面是一個案例:網上摘取下來別人的案例
1,問題來源
以前遇到了問題修改了用戶名密碼後,發現用新密碼登錄被hang住的情況,然後整個公司的oa系統徹底癱瘓了,詳細狀況見以前的記錄。
最近學習了oracle11g的新特性密碼延遲,才明白問題所在是由於密碼延遲導致。
大概情況是:從oracle11g開始,如果用戶輸入了錯誤的密碼登錄,那麽隨著登錄錯誤次數的增加,每次登錄前等待驗證的時間也會增加,本意上是為了保護數據庫被惡意登錄的時候消耗太多db資源導致數據庫消耗過高導致數據庫服務器出問題,但是這裏也引發了問題,如果使用錯誤密碼登錄過多,則會影響該用戶的正常登錄,也就是說密碼有驗證延遲導致你輸入正確的密碼登錄也需要等待很久。給使用人員的體驗就是數據庫hang住了(其實你使用其它用戶操作數據庫完全正常)
2,案例演示
Oracle版本是11g分支11.2.0.1.0:
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as timdba@A_VM128
SQL>
設置時間顯示: SQL> set time on; 07:41:57 SQL> conn timdba/timgood; Connected. 07:42:48 SQL> conn timdba/t;#開始嘗試錯誤密碼登錄 ERROR: ORA-01017: invalid username/password; logon denied Warning: You are no longer connected to ORACLE. 07:42:49 SQL> conn timdba/t; #第1次錯誤登錄消耗時間1秒 ERROR: ORA-01017: invalid username/password; logon denied 07:42:51 SQL> conn timdba/t; # 第2次錯誤登錄消耗時間2秒 ERROR: ORA-01017: invalid username/password; logon denied 07:42:52 SQL> conn timdba/t; # 第3次錯誤登錄消耗時間1秒 ERROR: ORA-01017: invalid username/password; logon denied 07:42:54 SQL> conn timdba/t; # 第4次錯誤登錄消耗時間2秒 ERROR: ORA-01017: invalid username/password; logon denied 07:42:57 SQL> conn timdba/t; #第5次錯誤登錄消耗時間3秒 ERROR: ORA-01017: invalid username/password; logon denied 07:43:02 SQL> conn timdba/t; # 第6次錯誤登錄消耗時間5秒 ERROR: ORA-01017: invalid username/password; logon denied 07:43:07 SQL> conn timdba/t; # 第7次錯誤登錄消耗時間5秒 ERROR: ORA-01017: invalid username/password; logon denied 07:43:13 SQL> conn timdba/t; # 第8次錯誤登錄消耗時間6秒 ERROR: ORA-01017: invalid username/password; logon denied 07:43:20 SQL> conn timdba/t;# 第9次錯誤登錄消耗時間7秒 ERROR: ORA-01017: invalid username/password; logon denied 07:43:28 SQL> 07:43:29 SQL> conn timdba/timgood; Connected. 07:43:40 SQL> |
大家可以看到第4次,第5次開始,錯誤登錄驗證時間越來越長了。基本每次都延遲多一秒,而後面即使輸入了正確密碼,也會延遲十幾秒了。
而在測試過程中,一旦輸入正確密碼,驗證成功過後,這個錯誤延時就會清0,從0開始重新計算數字了:
08:15:30 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:15:34 SQL> conn timdba/timgood; Connected. 08:15:37 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied Warning: You are no longer connected to ORACLE. 08:15:39 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:15:40 SQL> |
大家進一步擴散下思維,這只是單個session做測試的,如果是線上環境的話,成千上萬個會話過來,如果密碼都錯誤了,一起延時的話,按照一個操作多延遲一秒來算,基本要延遲1000秒了,也就是半個小時你登錄界面卡在哪裏了,這樣給客戶的體驗就是輸入了正確密碼,結果點擊了登錄按鈕,就卡住了,死活不動彈了,服務器癱瘓了,也就意味著應用系統hang住了。
3,新特性是雙刃劍
Oracle的任何一個新特性都能帶來性能上的提升和安全上的進一步保證,但是畢竟oracle也只是一個軟件software而已,是software就會有bug,甚至被別人利用攻擊了。
oracle在11g發布後的幾個小版本中,沒有給出徹底屏幕密碼延遲的方法,但是oracle有強大的其它輔助功能,可以通過設置event事件來處理掉。
4,通過設置Event屏幕密碼延遲
這裏一般通常設置28401就足夠了,如果遇到其它特殊情況,也可以再設置一下,接下來通過設置EVENTS 28401來實現屏蔽密碼延遲驗證:
ALTER SYSTEM SET EVENT = ‘28401 TRACE NAMECONTEXT FOREVER, LEVEL 1‘ SCOPE = SPFILE;
alter system set event="10949 TRACENAME CONTEXT FOREVER:28401 trace name context forever, level 1" scope=spfile;
SQL> set time on; 08:56:22 SQL> ALTER SYSTEM SET EVENT = ‘28401 TRACE NAME CONTEXT FOREVER, LEVEL 1‘ SCOPE = SPFILE; System altered. 08:56:27 SQL> create pfile from spfile; File created. 08:56:29 SQL> |
之後重啟oracle數據庫生效了。
08:56:44 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. 08:57:05 SQL> startup; ORACLE instance started. Total System Global Area 835104768 bytes Fixed Size 2217952 bytes Variable Size 545261600 bytes Database Buffers 281018368 bytes Redo Buffers 6606848 bytes Database mounted. Database opened. 08:57:46 SQL> |
再次驗證錯誤密碼延遲驗證,可以看到幾乎沒有任何延遲了:
08:58:28 SQL> conn timdba/timgood; Connected. 08:58:33 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied Warning: You are no longer connected to ORACLE. 08:58:37 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:58:38 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:58:39 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:58:39 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:58:40 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:58:41 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied 08:58:42 SQL> conn timdba/t; ERROR: ORA-01017: invalid username/password; logon denied |
Oracle11g 密碼延遲認證導致library cache lock的情況分析