數(shù)據(jù)庫安全問題一直是人們關(guān)注的焦點(diǎn)之一,我們知道一個(gè)企業(yè)或者機(jī)構(gòu)的數(shù)據(jù)庫如果遭到黑客的攻擊,而這些數(shù)據(jù)庫又保存著非常重要的數(shù)據(jù),象銀行、通信等數(shù)據(jù)庫,后果將不堪設(shè)想。oracle數(shù)據(jù)庫使用了多種手段來保證數(shù)據(jù)庫的安全性,如密碼,角色,權(quán)限等等,今天我們來詳細(xì)的來闡述一下關(guān)于oracle的密碼問題,當(dāng)然我們今天來詳細(xì)說的并不是oracle的安全密碼機(jī)制如何的強(qiáng)大等等,恰恰相反我們需要說明的是當(dāng)我們?cè)趏racle密碼過期后如何在不修改密碼的情況下,使密碼重新有效。
站在用戶的角度思考問題,與客戶深入溝通,找到容縣網(wǎng)站設(shè)計(jì)與容縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋容縣地區(qū)。
在介紹前我們先來說一個(gè)案例,某客戶數(shù)據(jù)庫做安全加固,針對(duì)profile修改了部分password的安全機(jī)制,其中最重要的一點(diǎn)就是設(shè)置了PASSWORD_LIFE_TIME(該參數(shù)設(shè)定密碼過期時(shí)間)這一個(gè)參數(shù),而當(dāng)該參數(shù)設(shè)置完后,客戶又沒有根據(jù)設(shè)定的安全機(jī)制指定一個(gè)良好的人工密碼周期性管理策略,隨著PASSWORD_LIFE_TIME參數(shù)所設(shè)定的時(shí)間到期后,數(shù)據(jù)庫將該用戶locked,導(dǎo)致業(yè)務(wù)無法正常連接,從理論上來說,密碼既然過期了,那么重置密碼是唯一的手段,但是從一定程度上來說,重置密碼意味著大量的中間件需要去修改,對(duì)于業(yè)務(wù)邏輯不熟悉的人來說,還是存在必然的風(fēng)險(xiǎn),檢查后發(fā)現(xiàn)客戶并沒有設(shè)置PASSWORD_REUSE_TIME(該參數(shù)設(shè)定為相同密碼重用時(shí)間),既然該參數(shù)并沒有設(shè)置,那么我們可以考慮通過一個(gè)臨時(shí)密碼來作為中間密碼,通過中間密碼進(jìn)一步重新設(shè)置原密碼。但是這時(shí)候又一個(gè)問題出現(xiàn)了,客戶并不知道該業(yè)務(wù)用戶密碼。這又從一定程度上給問題的解決造成了麻煩。本節(jié)通過一個(gè)較為巧妙的方法來重置oracle的密碼。
n 概念普及
在詳細(xì)說明本節(jié)內(nèi)容的情況下,需要普及一些小的知識(shí)點(diǎn),oracle在對(duì)于密碼有效期等問題的管理上通過profile文件來進(jìn)行管理。并默認(rèn)一個(gè)default的profile文件,在oracle 9i以及以前版本,oracle對(duì)于默認(rèn)的default profile文件參數(shù)值均為UNLIMITED,在10g版本中,將FAILED_LOGIN_ATTEMPTS的值默認(rèn)設(shè)置為10次,也就是說在連續(xù)10次輸入錯(cuò)誤密碼后,oracle將鎖定該用戶,直到用戶被解鎖為止。從11g開始,oracle對(duì)密碼文件的管理策略增加了很多,很多之前被設(shè)置了UNLIMITED的參數(shù),在11g中都定義了相應(yīng)的值,雖然這一新特性增加了oracle密碼的安全機(jī)制,但是也從一定程度上對(duì)我們管理產(chǎn)生影響。首先我們來說明一下oracle的profile 中關(guān)于密碼這一部分的內(nèi)容。(該默認(rèn)的profile取自oracle11g環(huán)境)
SQL> select * from dba_profiles where profile='DEFAULT' and RESOURCE_NAME like 'PASSWORD_%'; PROFILE RESOURCE_NAME RESOURCE LIMIT --------- --------------------------------- ---------- DEFAULT PASSWORD_LIFE_TIME PASSWORD 180 DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL DEFAULT PASSWORD_LOCK_TIME PASSWORD 1 DEFAULT PASSWORD_GRACE_TIME PASSWORD 7 |
詳細(xì)解釋一下以上參數(shù)值:
PASSWORD_LIFE_TIME 180 --口令的生命周期,超過這段時(shí)間口令可能會(huì)自動(dòng)過期,是否過期要看是否設(shè)定了PASSWORD_GRACE_TIME
PASSWORD_GRACE_TIME 7 --接著PASSWORD_LIFE_TIME特性,如果PASSWORD_LIFE_TIME的期限已到,那么PASSWORD_GRACE_TIME 的設(shè)置是對(duì)口令生命周期的一個(gè)grace(寬限或者延續(xù)),口令到期之后,繼續(xù)可以使用的天數(shù),在這段時(shí)間內(nèi)如果我們登錄系統(tǒng),會(huì)有提示,提示系統(tǒng)在幾天內(nèi)過期
PASSWORD_REUSE_TIME UNLIMITED --這個(gè)特性限制口令在多少天內(nèi)不能重復(fù)使用,默認(rèn)值為UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED --這個(gè)特性是針對(duì)PASSWORD_REUSE_TIME的,說明要想在PASSWORD_REUSE_TIME這個(gè)參數(shù)指定的時(shí)間內(nèi)重復(fù)使用當(dāng)前口令,那么至少需要修改過口令的次數(shù)(修改過的口令當(dāng)然肯定需要和當(dāng)前口令不同,因?yàn)楫吘惯€有PASSWORD_REUSE_TIME 特性的限制)
FAILED_LOGIN_ATTEMPTS 10 --這個(gè)比較好理解,不知道口令的話嘗試登錄的次數(shù),達(dá)到這個(gè)次數(shù)之后賬戶被自動(dòng)鎖定
PASSWORD_LOCK_TIME 1 --接著FAILED_LOGIN_ATTEMPTS參數(shù),口令被自動(dòng)鎖定的時(shí)間,達(dá)到這個(gè)時(shí)間之后,下次登錄時(shí)系統(tǒng)自動(dòng)解除對(duì)這個(gè)賬戶的鎖定
以上即為oracle對(duì)于profile中密碼管理的一些參數(shù)解釋。
接下來我們來說明一下oracle中關(guān)于用戶鎖定的狀態(tài)
SQL> select username,account_status,profile from dba_users;
USERNAME ACCOUNT_STATUS PROFILE -------------------------------------------- SYSTEM OPEN DEFAULT SYS OPEN DEFAULT TEST3 OPEN DEFAULT SCOTT OPEN DEFAULT TEST2 EXPIRED(GRACE) PROFILE2 TEST EXPIRED(GRACE) DEFAULT MGMT_VIEW EXPIRED & LOCKED DEFAULT |
ORACLE數(shù)據(jù)庫用戶有多種狀態(tài),可查看視圖USER_ASTATUS_MAP。
SQL>select * from user_astatus_map; STATUS# STATUS -------- ------------------------------ 0 OPEN 1 EXPIRED 2 EXPIRED(GRACE) 4 LOCKED(TIMED) 8 LOCKED 5 EXPIRED & LOCKED(TIMED) 6 EXPIRED(GRACE) & LOCKED(TIMED) 9 EXPIRED & LOCKED 10 EXPIRED(GRACE) & LOCKED |
可以看到oracle一共提供了9種狀態(tài),而九種狀態(tài)可分為兩類:1.基本狀態(tài);2.組合狀態(tài)。
前五種是基本狀態(tài):0 OPEN、1 EXPIRED、2 EXPIRED(GRACE)、4 LOCKED(TIMED)、8 LOCKED。
后四種是基本狀態(tài):5 EXPIRED & LOCKED(TIMED)、6 EXPIRED(GRACE) & LOCKED(TIMED)、9 EXPIRED & LOCKED、10 EXPIRED(GRACE) & LOCKED。
后四種的組合狀態(tài)可通過狀態(tài)號(hào)STATUS#獲得其狀態(tài)的兩個(gè)組合,對(duì)于我們常態(tài)管理來說我們只需要掌握前面5種即可,以上客戶所發(fā)生的問題就是由于對(duì)于profile的設(shè)置導(dǎo)致的密碼失效的問題。
巧解密碼過期
在上述的客戶案例中,安全加固措施固然是好的,但是沒有客觀考慮到后期密碼維護(hù)是一個(gè)潛在的問題,而在oracle11G中PASSWORD_LIFE_TIME參數(shù)從很大一定程度上也會(huì)造成上述客戶的問題,DBA如果不清楚這一特性很容易造成密碼鎖定這個(gè)問題,當(dāng)造成了這一問題后如何解決成了一個(gè)很大的問題。
在10g或者11g環(huán)境中,如果profiles的密碼參數(shù)被設(shè)置后,會(huì)導(dǎo)致密碼在規(guī)定的時(shí)間內(nèi)過期,鎖定等。此時(shí)如果我們繼續(xù)去連接,如果狀態(tài)變成EXPIRED或者EXPIRED(GRACE)那么當(dāng)我們連接后,會(huì)提示需要重新設(shè)定新的密碼,并且該會(huì)話無法連入數(shù)據(jù)庫,此時(shí)如果我們知道該用戶的密碼,那么DBA只需要手工干預(yù)一下,重新設(shè)定該密碼即可。
在10G環(huán)境中,我們仔細(xì)查看dba_users這張視圖,對(duì)應(yīng)的PASSWORD這個(gè)字段,其實(shí)該字段即為我們?cè)O(shè)置的密碼的HASH值,當(dāng)我們的密碼過期或者用戶被鎖定后,可以通過該字段來巧妙的規(guī)避一下該特性。
查看用戶信息(10G版本)
SQL> select username,account_status,password from dba_users where username like 'TEST%';
USERNAME ACCOUNT_STATUS PASSWORD ------------ ---------------- ------------------ TEST2 OPEN 3C0731F39486287E TEST1 OPEN C04FB3810DDE34AE |
我們可以看到,以上的密碼進(jìn)過加密處理后顯示為一串無序的HASH值。而在11G開始,oracle為了凸顯密碼安全性,將dba_users中的password這一列不再做顯示
查看用戶信息(11G版本)
SQL> select username,account_status,password from dba_users where username like '%TEST%';
USERNAME ACCOUNT_STATUS PASSWORD ------------------ ---------------- ----------- TEST OPEN TESTYING3 OPEN TEST2 EXPIRED TEST3 OPEN
6 rows selected. |
可以看到,從11G開始,oracle將password這一列給隱藏了
注:Oracle11g在用戶安全性方面的加強(qiáng),不僅僅是密碼的隱藏,還包括
1.密碼區(qū)分大小寫,初始化參數(shù)sec_case_sensitive_logon 2.密碼復(fù)雜性檢查,通過utlpwdmg.sql文件創(chuàng)建復(fù)雜性檢查函數(shù)verify_function_11G 3. 強(qiáng)度更高的Hash加密算法 |
當(dāng)我們的用戶密碼過期并且被鎖定后,再次登錄將會(huì)產(chǎn)生報(bào)錯(cuò):用戶被鎖定,
如下用戶:
SQL> select username,account_status,password,profile from dba_users where username='MDSYS'; USERNAME ACCOUNT_STATUS PASSWORD PROFIL ---------- ------------------------------------------------ MDSYS EXPIRED & LOCKED 72979A94BAD2AF80 DEFAULT
SQL> select username,account_status,password,profile from dba_users where username='TEST1';
USERNAME ACCOUNT_STATUS PASSWORD PROFILE ---------- --------------------------------- ------- TEST1 LOCKED C04FB3810DDE34AE DEFAULT |
注意LOCKED和EXPIRED & LOCKED是兩個(gè)不同的概念,對(duì)于LOCKED狀態(tài)是由于連續(xù)的輸錯(cuò)密碼達(dá)到FAILED_LOGIN_ATTEMPTS指定的次數(shù)二造成的,對(duì)于該種故障,我們只需要簡(jiǎn)單的給與用戶解鎖即可,如下:
SQL> alter user test1 account unlock; User altered.
SQL> select username,account_status,password,profile from dba_users where username='TEST1'; USERNAME ACCOUNT_STATUS PASSWORD PROFILE ---------- --------------------------------- ------- TEST1 OPEN C04FB3810DDE34AE DEFAULT |
但是對(duì)于EXPIRED & LOCKED狀態(tài),這是由于PASSWORD_LIFE_TIME參數(shù)導(dǎo)致用戶密碼過期而造成的鎖定,單一的解鎖命令無法解決該問題,此處還涉及到PASSWORD_LIFE_TIME參數(shù)造成的密碼修改問題。如下:
SQL> select username,account_status,password,profile from dba_users where username='MDSYS'; USERNAME ACCOUNT_STATUS PASSWORD PROFILE ---------- ------------------------------------------------ MDSYS EXPIRED & LOCKED 72979A94BAD2AF80 DEFAULT SQL> conn mdsys/mdsys ERROR: ORA-28000: the account is locked Warning: You are no longer connected to ORACLE.
解鎖用戶: SQL> conn / as sysdba Connected. SQL> alter user dmsys account unlock; User altered. SQL> conn dmsys/dmsys ERROR: ORA-28001: the password has expired
Changing password for dmsys New password: 提示需要輸入新密碼 此時(shí)我們查看用戶狀態(tài): SQL> select username,account_status,password,profile from dba_users where username='MDSYS'; USERNAME ACCOUNT_STATUS PASSWORD PROFILE ---------- ---------------- ------------------ --------- MDSYS EXPIRED 72979A94BAD2AF80 DEFAULT |
我們從上面的實(shí)驗(yàn)過程看到,雖然我們將用戶解鎖,但是用戶的狀態(tài)僅僅從EXPIRED & LOCKED轉(zhuǎn)為EXPIRED,并沒有正常的OPEN,從新連接用戶提示輸入新密碼。
此處就產(chǎn)生一個(gè)問題,可以想象一下,當(dāng)提示我們輸入新密碼時(shí),我們勢(shì)必需要輸入生產(chǎn)用戶的原密碼,否則將造成業(yè)務(wù)中間件的密碼與修改的密碼不一致。如果此時(shí)我們不知道原密碼,勢(shì)必會(huì)造成一定的麻煩。此時(shí)我們就需要dba_users視圖中的password字段。Password字段雖然已經(jīng)經(jīng)過oracle的hash運(yùn)算并加密(oracle密碼采用用戶名+密碼的組合進(jìn)行HASH加密),但是我們并不是需要知道該密碼是什么,只是需要利用該字段HASH值來成功的解鎖用戶。
對(duì)于一個(gè)用戶賦新的密碼,相信大家都很了解:
alter user username identified by password
那么我們就可以利用password的hash值進(jìn)行巧妙的解鎖,如下:
SQL> alter user dmsys identified by values 'BFBA5A553FD9E28A'; User altered.
SQL> select username,account_status,password,profile from dba_users where username='MDSYS'; USERNAME ACCOUNT_STATUS PASSWORD PROFILE ---------- ---------------- ----------------- --------- MDSYS OPEN 72979A94BAD2AF80 DEFAULT
SQL> conn dmsys/dmsys Connected. SQL> |
可以看到,雖然我們不知道該用戶的密碼,但是我們可以在通過password的HASH值來重置該密碼。而在11G中,oracle為了提高安全性能,將DBA_USERS.password中的值不做顯示,默認(rèn)為空。如下:
SQL> select username,account_status,password from dba_users;
USERNAME ACCOUNT_STATUS PASSWORD ---------------------------- ---------- SYS OPEN WMSYS OPEN TESTYING3 OPEN TESTYING OPEN |
在11G環(huán)境中,我們可以通過USER$基表中查詢得到該值,如下:
SQL> select USER#,name,PASSWORD from user$ where name like 'TEST%'; USER# NAME PASSWORD ---------- --------- --------------------- 85 TEST 48724AE7C369325F 86 TEST2 3C0731F39486287E 87 TEST3 47B23A1E17F2D107 6 rows selected. |
運(yùn)用同樣的命令和方法,我們就可以解鎖密碼過期而導(dǎo)致的用戶鎖定。
技術(shù)結(jié)論
通過以上的方法,我們可以在不知曉用戶名密碼的情況下,比較巧妙的解鎖由于密碼過期而導(dǎo)致的用戶鎖定的情況,雖然我們?cè)谏鲜龇椒ㄖ型ㄟ^HASH值解鎖了用戶,但是無論從安全方面抑或是從數(shù)據(jù)庫的持續(xù)穩(wěn)定運(yùn)行方面考慮,我們都建議用戶采用安全合理的密碼管理機(jī)制,杜絕一切可能的隱患才是作為一名DBA所必須要做到的,在保障數(shù)據(jù)庫安全的同時(shí),維持?jǐn)?shù)據(jù)庫的正常穩(wěn)定運(yùn)行。
------------------------------------------------------------------------------------
<版權(quán)所有,文章允許轉(zhuǎn)載,但必須以鏈接方式注明源地址,否則追究法律責(zé)任!>
原博客地址:http://blog.itpub.net/23732248/
原作者:應(yīng)以峰 (frank-ying)
-------------------------------------------------------------------------------------