ORACLE11g密碼安全與過期策略
資料庫安全問題一直是人們關注的焦點之一,我們知道一個企業或者機構的資料庫如果遭到駭客的攻擊,而這些資料庫又儲存著非常重要的資料,象銀行、通訊等資料庫,後果將不堪設想。oracle資料庫使用了多種手段來保證資料庫的安全性,如密碼,角色,許可權等等,今天我們來詳細的來闡述一下關於oracle的密碼問題,當然我們今天來詳細說的並不是oracle的安全密碼機制如何的強大等等,恰恰相反我們需要說明的是當我們在oracle密碼過期後如何在不修改密碼的情況下,使密碼重新有效。
在介紹前我們先來說一個案例,某客戶資料庫做安全加固,針對profile修改了部分password的安全機制,其中最重要的一點就是設定了PASSWORD_LIFE_TIME(該引數設定密碼過期時間)這一個引數,而當該引數設定完後,客戶又沒有根據設定的安全機制指定一個良好的人工密碼週期性管理策略,隨著PASSWORD_LIFE_TIME 引數所設定的時間到期後,資料庫將該使用者locked,導致業務無法正常連線,從理論上來說,密碼既然過期了,那麼重置密碼是唯一的手段,但是從一定程度上來說,重置密碼意味著大量的中介軟體需要去修改,對於業務邏輯不熟悉的人來說,還是存在必然的風險,檢查後發現客戶並沒有設定PASSWORD_REUSE_TIME(該引數設定為相同密碼重用時間),既然該引數並沒有設定,那麼我們可以考慮透過一個臨時密碼來作為中間密碼,透過中間密碼進一步重新設定原密碼。但是這時候又一個問題出現了,客戶並不知道該業務使用者密碼。這又從一定程度上給問題的解決造成了麻煩。本節透過一個較為巧妙的方法來重置oracle的密碼。
n 概念普及
在詳細說明本節內容的情況下,需要普及一些小的知識點,oracle在對於密碼有效期等問題的管理上透過profile檔案來進行管理。並預設一個default的profile檔案,在oracle 9i以及以前版本,oracle對於預設的default profile檔案引數值均為UNLIMITED,在10g版本中,將FAILED_LOGIN_ATTEMPTS的值預設設定為10次,也就是說在連續10次輸入錯誤密碼後,oracle將鎖定該使用者,直到使用者被解鎖為止。從11g開始,oracle對密碼檔案的管理策略增加了很多,很多之前被設定了UNLIMITED的引數,在11g中都定義了相應的值,雖然這一新特性增加了oracle密碼的安全機制,但是也從一定程度上對我們管理產生影響。首先我們來說明一下oracle的profile 中關於密碼這一部分的內容。(該預設的profile取自oracle11g環境)
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 |
詳細解釋一下以上引數值:
PASSWORD_LIFE_TIME 180 --口令的生命週期,超過這段時間口令可能會自動過期,是否過期要看是否設定了PASSWORD_GRACE_TIME
PASSWORD_GRACE_TIME 7 --接著PASSWORD_LIFE_TIME特性,如果PASSWORD_LIFE_TIME的期限已到,那麼PASSWORD_GRACE_TIME 的設定是對口令生命週期的一個grace(寬限或者延續),口令到期之後,繼續可以使用的天數,在這段時間內如果我們登入系統,會有提示,提示系統在幾天內過期
PASSWORD_REUSE_TIME UNLIMITED --這個特性限制口令在多少天內不能重複使用,預設值為UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED --這個特性是針對PASSWORD_REUSE_TIME的,說明要想在PASSWORD_REUSE_TIME這個引數指定的時間內重複使用當前口令,那麼至少需要修改過口令的次數(修改過的口令當然肯定需要和當前口令不同,因為畢竟還有PASSWORD_REUSE_TIME 特性的限制)
FAILED_LOGIN_ATTEMPTS 10 --這個比較好理解,不知道口令的話嘗試登入的次數,達到這個次數之後賬戶被自動鎖定
PASSWORD_LOCK_TIME 1 --接著FAILED_LOGIN_ATTEMPTS引數,口令被自動鎖定的時間,達到這個時間之後,下次登入時系統自動解除對這個賬戶的鎖定
以上即為oracle對於profile中密碼管理的一些引數解釋。
接下來我們來說明一下oracle中關於使用者鎖定的狀態
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資料庫使用者有多種狀態,可檢視檢視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種狀態,而九種狀態可分為兩類:1.基本狀態;2.組合狀態。
前五種是基本狀態: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。
後四種的組合狀態可透過狀態號STATUS#獲得其狀態的兩個組合,對於我們常態管理來說我們只需要掌握前面5種即可,以上客戶所發生的問題就是由於對於profile的設定導致的密碼失效的問題。
巧解密碼過期
在上述的客戶案例中,安全加固措施固然是好的,但是沒有客觀考慮到後期密碼維護是一個潛在的問題,而在oracle11G中PASSWORD_LIFE_TIME引數從很大一定程度上也會造成上述客戶的問題,DBA如果不清楚這一特性很容易造成密碼鎖定這個問題,當造成了這一問題後如何解決成了一個很大的問題。
在10g或者11g環境中,如果profiles的密碼引數被設定後,會導致密碼在規定的時間內過期,鎖定等。此時如果我們繼續去連線,如果狀態變成EXPIRED或者EXPIRED(GRACE)那麼當我們連線後,會提示需要重新設定新的密碼,並且該會話無法連入資料庫,此時如果我們知道該使用者的密碼,那麼DBA只需要手工干預一下,重新設定該密碼即可。
在10G環境中,我們仔細檢視dba_users這張檢視,對應的PASSWORD這個欄位,其實該欄位即為我們設定的密碼的HASH值,當我們的密碼過期或者使用者被鎖定後,可以透過該欄位來巧妙的規避一下該特性。
檢視使用者資訊(10G版本)
SQL> select username,account_status,password from dba_users where username like 'TEST%';
USERNAME ACCOUNT_STATUS PASSWORD ------------ ---------------- ------------------ TEST2 OPEN 3C0731F39486287E TEST1 OPEN C04FB3810DDE34AE |
我們可以看到,以上的密碼進過加密處理後顯示為一串無序的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在使用者安全性方面的加強,不僅僅是密碼的隱藏,還包括
1. 密碼區分大小寫,初始化引數sec_case_sensitive_logon 2. 密碼複雜性檢查,透過utlpwdmg.sql檔案建立複雜性檢查函式verify_function_11G 3. 強度更高的Hash加密演算法 |
當我們的使用者密碼過期並且被鎖定後,再次登入將會產生報錯:使用者被鎖定,
如下使用者:
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是兩個不同的概念,對於LOCKED狀態是由於連續的輸錯密碼達到FAILED_LOGIN_ATTEMPTS指定的次數二造成的,對於該種故障,我們只需要簡單的給與使用者解鎖即可,如下:
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 |
但是對於EXPIRED & LOCKED狀態,這是由於PASSWORD_LIFE_TIME引數導致使用者密碼過期而造成的鎖定,單一的解鎖命令無法解決該問題,此處還涉及到PASSWORD_LIFE_TIME引數造成的密碼修改問題。如下:
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: 提示需要輸入新密碼 此時我們檢視使用者狀態: SQL> select username,account_status,password,profile from dba_users where username='MDSYS'; USERNAME ACCOUNT_STATUS PASSWORD PROFILE ---------- ---------------- ------------------ --------- MDSYS EXPIRED 72979A94BAD2AF80 DEFAULT |
我們從上面的實驗過程看到,雖然我們將使用者解鎖,但是使用者的狀態僅僅從EXPIRED & LOCKED轉為EXPIRED,並沒有正常的OPEN,從新連線使用者提示輸入新密碼。
此處就產生一個問題,可以想象一下,當提示我們輸入新密碼時,我們勢必需要輸入生產使用者的原密碼,否則將造成業務中介軟體的密碼與修改的密碼不一致。如果此時我們不知道原密碼,勢必會造成一定的麻煩。此時我們就需要dba_users檢視中的password欄位。Password欄位雖然已經經過oracle的hash運算並加密(oracle密碼採用使用者名稱+密碼的組合進行HASH加密),但是我們並不是需要知道該密碼是什麼,只是需要利用該欄位HASH值來成功的解鎖使用者。
對於一個使用者賦新的密碼,相信大家都很瞭解:
alter user username identified by password
那麼我們就可以利用password的hash值進行巧妙的解鎖,如下:
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中的值不做顯示,預設為空。如下:
SQL> select username,account_status,password from dba_users;
USERNAME ACCOUNT_STATUS PASSWORD ---------------------------- ---------- SYS OPEN WMSYS OPEN TESTYING3 OPEN TESTYING OPEN |
在11G環境中,我們可以透過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. |
運用同樣的命令和方法,我們就可以解鎖密碼過期而導致的使用者鎖定。
技術結論
透過以上的方法,我們可以在不知曉使用者名稱密碼的情況下,比較巧妙的解鎖由於密碼過期而導致的使用者鎖定的情況,雖然我們在上述方法中透過HASH值解鎖了使用者,但是無論從安全方面抑或是從資料庫的持續穩定執行方面考慮,我們都建議使用者採用安全合理的密碼管理機制,杜絕一切可能的隱患才是作為一名DBA所必須要做到的,在保障資料庫安全的同時,維持資料庫的正常穩定執行。
------------------------------------------------------------------------------------
原部落格地址:http://blog.itpub.net/23732248/
原作者:應以峰 (frank-ying)
-------------------------------------------------------------------------------------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23732248/viewspace-1449335/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL密碼過期策略MySql密碼
- Linux賬戶密碼過期安全策略設定Linux密碼
- 用Abp實現找回密碼和密碼強制過期策略密碼
- oracle密碼過期Oracle密碼
- Oracle11g的使用者密碼預設為180天過期,更改為無期Oracle密碼
- Oracle密碼過期處理Oracle密碼
- 域賬戶密碼過期密碼
- MySQL 5.7 密碼安全策略簡介MySql密碼
- Oracle 密碼永不過期設定Oracle密碼
- tsm節點的密碼過期密碼
- 密碼學與密碼安全:理論與實踐密碼學
- oracle密碼過期處理辦法Oracle密碼
- oracle11 密碼過期問題Oracle密碼
- CAS ticket過期策略
- 使用者密碼過期的處理密碼
- 密碼即將過期提示的影響密碼
- 【Oracle】使用者密碼過期處理Oracle密碼
- TSM Server的密碼過期 解決方法Server密碼
- Redis過期刪除策略Redis
- Redis的過期策略和記憶體淘汰策略最全總結與分析Redis記憶體
- 密碼過期引起的ssh無法登陸密碼
- oracle 11G 密碼過期後修改方法Oracle密碼
- Oracle 11g存在密碼過期問題Oracle密碼
- 修改oracle密碼預設180天過期Oracle密碼
- Linux系統中,修改密碼永不過期Linux密碼
- win10安全模式如何跳過開機密碼_win10安全模式跳過開機密碼教程Win10模式密碼
- oracle11g忘記sys密碼Oracle密碼
- redis 過期鍵刪除策略Redis
- kafka offset 過期處理策略Kafka
- linux伺服器的一些配置(密碼過期策略、登入次數限制、私鑰登入等)Linux伺服器密碼
- JWT過期,修改密碼,登出登入如何處理JWT密碼
- Oracle 11g 密碼設定為不過期Oracle密碼
- MySQL的使用者密碼過期功能介紹MySql密碼
- ORACLE 備份故障,原因是tsm密碼過期Oracle密碼
- MySQL入門--密碼策略MySql密碼
- DM8資料庫的密碼安全策略詳解資料庫密碼
- 揭秘網路安全攻防戰:資訊收集和密碼破解的駭客技巧與防護策略密碼
- PG密碼安全密碼