Oracle11g 密碼延遲認證導致library cache lock的情況分析

張衝andy發表於2018-07-10

在 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)此外Oracle 11g開啟了密碼大小寫驗證,如果從Oracle 10g升級過來,需要特別的當心這個變化,通過初始化引數SEC_CASE_SENSITIVE_LOGON 可以來控制這個特性。

下面是一個案例:網上摘取下來別人的案例

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2157592/,如需轉載,請註明出處,否則將追究法律責任。

相關文章