您好,登錄后才能下訂單哦!
使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫
作者:趙全文 網(wǎng)名:guestart
在今年國內(nèi)很多用戶的Oracle數(shù)據(jù)庫突然遭到比特幣勒索,從這一方面來說,數(shù)據(jù)庫的安全,大家沒有引起足夠的重視。其實不難發(fā)現(xiàn),我們在生產(chǎn)環(huán)境中使用的Oracle數(shù)據(jù)庫確實存在著很多安全隱患和安全風(fēng)險。Oracle在數(shù)據(jù)庫安全方面的解決方案也有很多,比如Oracle審計與數(shù)據(jù)庫防火墻(AVDF)產(chǎn)品、Oracle的透明數(shù)據(jù)加密功能(KDE)和Oralce Wallet(也稱Oracle 錢夾)加密用戶的密碼等等。
如果需要從SHELL腳本來連接到Oracle數(shù)據(jù)庫,那么這些腳本包含數(shù)據(jù)庫連接詳細(xì)信息,這可能是一個主要的安全問題。一個解決方案是使用操作系統(tǒng)身份驗證,但Oracle 10g第2版提供了使用安全外部密碼存儲的功能。其中Oracle登錄證書存儲在客戶端Oracle電子錢包中,這樣的話,在SHELL腳本里就可以使用“/ @ db_alias”這樣的語法來連接。這對于用腳本登錄數(shù)據(jù)庫進(jìn)行操作來說是非常有用的,尤其對于企業(yè)安全要求很高,不希望用戶名和密碼明文存在配置文件中,而且對于密碼的維護(hù)是極為方便的,比如把wallet放在指定路徑下,當(dāng)修改密碼時,只需統(tǒng)一覆蓋wallet即可。
今天我和大家分享一下,如何使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫,以此不將明文密碼暴露在生產(chǎn)環(huán)境當(dāng)中。
那么,Oracle是如何通過安全外部密碼存儲(Secure External Password Store)來達(dá)到無密碼登錄數(shù)據(jù)庫呢?我們來說,連接到數(shù)據(jù)庫的密碼證書是存儲在Oracle wallet里,這個wallet(錢夾)是一個用來保存認(rèn)證和簽名證書的一種安全軟件容器。這種錢包使用可以簡化依靠密碼憑據(jù)連接到數(shù)據(jù)庫的大規(guī)模部署。 配置此功能時,應(yīng)用程序代碼,批處理作業(yè)和腳本不再需要嵌入的用戶名和密碼。 風(fēng)險降低,因為這樣的密碼不再以明確的方式暴露,并且當(dāng)用戶名或密碼改變時,密碼管理策略更容易實施,而不改變應(yīng)用程序代碼。
因為用“安全外部密碼存儲”這種方式所存儲的密碼密文信息是存儲在Oracle wallet里的,那么我們先介紹一下,什么是Oracle wallet以及它里面可以存儲一些什么信息?請看下面的一段英文描述,
中文翻譯如下,
Oracle錢夾是一個用于存儲不同類型認(rèn)證和加密密鑰的PKCS#12容器。因此,這種錢夾可以用于存儲以下信息的一個或多個:
Oracle數(shù)據(jù)庫的PKI身份驗證憑據(jù)
網(wǎng)絡(luò)加密證書(SSL/TLS)
Oracle高級安全透明數(shù)據(jù)加密(TDE)的主加密密鑰
Oracle數(shù)據(jù)庫安全外部密碼存儲的密碼
說的直白一點,Oracle wallet可以形象的比喻成我們?nèi)粘I钪械腻X包一樣,在錢包里,我們可以放銀行卡、×××、信用卡、公司的員工卡、就餐卡等等。
看了上面的一段英文描述和中文翻譯,想必大家對Oracle wallet也有所了解。那么到底什么是Oracle的Secure External Password Store(安全外部密碼存儲)呢?我們再看下面的一段英文描述,
中文翻譯如下,
使用安全外部密碼存儲,Oracle將數(shù)據(jù)庫憑據(jù)(即用戶名和密碼)安全地存儲在Oracle電子錢包中。 在啟動數(shù)據(jù)庫連接時,Oracle訪問錢包并根據(jù)連接字符串讀取憑據(jù)。 由于配置了自動登錄,因此無需密碼即可打開錢包并讀取憑據(jù)。 只有在電子錢包中添加,更改或刪除憑據(jù)時才需要密碼。
連接字符串在電子錢包中是唯一的。 每個連接字符串只能存儲一個憑證。 同一數(shù)據(jù)庫的不同憑據(jù)必須由不同的連接字符串區(qū)分。
從上面的中文解讀,我們可以得知,安全外部密碼存儲就是Oracle把用戶名和密碼存放在Oracle wallet的一種安全加密形式。
下面我們根據(jù)Oracle 10gR2官方文檔中的Secure External Password Store功能來演示和操作,最終實現(xiàn)無密碼登錄數(shù)據(jù)庫。
雖然說,使用wallet的圖形界面(在command line interface下 輸入owm命令可以打開)可以極大的簡化管理密碼證書,至于為什么不能用owm(oracle wallet manager)來創(chuàng)建和管理wallet的外部密碼存儲,而是使用mkstore命令?以下是摘自O(shè)racle官方文檔的一段描述:
一般來說,用戶(包括應(yīng)用程序、批處理任務(wù)和腳本)都是通過一個標(biāo)準(zhǔn)的數(shù)據(jù)庫連接字符串(database_connect_string)的連接語句(connect statement)來連接到Oracle數(shù)據(jù)庫的。這些字符串里包括用戶名、密碼和網(wǎng)絡(luò)服務(wù)名,或者是在tnsnames.ora文件當(dāng)中列出的TNS別名,還有另一種連接字符串的形式是主機名:端口號:sid(這種形式在應(yīng)用程序連接到Oracle數(shù)據(jù)庫當(dāng)中隨處可見)。
比如,下面這樣的連接形式:
其中ORASALES為TNS別名,ourhost37:1527:DB17為主機名:端口號:sid。
然而,如果客戶端配置了安全外部密碼存儲的話,就可以使用下面的連接語法來連接到數(shù)據(jù)庫,而不需要指定用戶名和密碼。
在這種情況下,數(shù)據(jù)庫證書、用戶名和密碼是安全地存儲在創(chuàng)建的Oracle錢夾里,由于wallet的自動登錄特性(auto login)是打開的,也就是說,一旦創(chuàng)建了wallet以后是自動打開的,所以不需要密碼去打開wallet。在這個wallet里有證書,而用來連接數(shù)據(jù)庫的用戶名和密碼的信息就保存在這個證書里。
接下來,我們就開始使用外部密碼存儲來配置Oracle的客戶端。
1、先查看一下Oracle軟件默認(rèn)的wallet目錄所在的位置和狀態(tài)
從上圖可以看出,wallet的類型是以文件形式存在,而且默認(rèn)的wallet就是位于$ORACLE_BASE/admin/$ORACLE_SID/wallet目錄,狀態(tài)為關(guān)閉。那么,我們再去相應(yīng)的位置查看一下wallet目錄是否存在,
從上圖可以得知,wallet目錄不存在,因為我們從來沒有創(chuàng)建過wallet,它的狀態(tài)應(yīng)該就是closed,所以我們在用mkstore命令(前面在說不能用owm創(chuàng)建wallet時提到過)創(chuàng)建wallet之前,必須先創(chuàng)建一個存在的wallet目錄。這里為了安全起見,也為了防止將wallet目錄誤刪除,我們不把wallet目錄放在剛才用v$encryption_wallet視圖查出的位置,即$ORACLE_BASE/admin/$ORACLE_SID下,而是放到$ORACLE_HOME/owm(因為$ORACLE_HOME是Oracle軟件所在目錄,而且我們也不允許去改動這里的目錄和文件)。
下面進(jìn)行創(chuàng)建wallet目錄,
2、在Oracle客戶端開啟external password store(外部密碼存儲)。
(1)使用mkstore命令先創(chuàng)建一個wallet,命令語法來自官方文檔
wallet_location參數(shù)指定為我們剛才創(chuàng)建的wallet目錄
上面提示,要給wallet輸入一個密碼(在wallet打開時需要輸入,在創(chuàng)建完wallet以后,Oracle會自動打開),這里輸入Oracle123(輸入的密碼不回顯哦),再輸入一遍(同樣不回顯,如果2次輸入的不一樣,Oracle會提示重新輸入的)。
那么,我們到wallet目錄下面查看一下是生成了什么文件。
其中cwallet.sso文件是用于保存wallet是否自動登錄的信息,ewallet.p12文件是用來保存相關(guān)的證書信息,而我們要使用的用戶名和密碼的信息就保存在證書里。
(2)使用mkstore命令來給剛才創(chuàng)建的wallet創(chuàng)建證書,命令語法來自官方文檔
其中帶<>的參數(shù),官方文檔已經(jīng)解釋的很清楚了,我們再描述一下。
wallet_location:wallet目錄所在位
db_connect_string:文件tnsname.ora中的TNS別名
tnsnames.ora:存放Oracle數(shù)據(jù)庫連接字符串的文件,也是Oracle約定俗成的文件,從Oracle誕生起一直沿用到今,可見它的重要性不言而喻。在Linux系統(tǒng)下,位于$ORACLE_HOME/network/admin目錄
username:Oracle數(shù)據(jù)庫要連接的用戶名
password:Oracle連接用戶要輸入的密碼
為了不和Oracle原先在tnsnames.ora文件中創(chuàng)建的TNS別名有所關(guān)聯(lián),我們再單獨創(chuàng)建一個。
其中BASE是我們剛才新建的TNS別名,而YSYKTEST是原先存在的TNS別名。
現(xiàn)在開始用mkstore命令創(chuàng)建wallet的證書,見下圖
在創(chuàng)建證書時,需要輸入wallet的密碼,就第1步創(chuàng)建wallet時輸入的密碼。
其中,base是剛剛創(chuàng)建的TNS別名,而且用戶名和密碼一定要輸入正確,否則即使創(chuàng)建成功,一會兒也連不上Oracle數(shù)據(jù)庫。
其實用mkstore命令創(chuàng)建wallet的證書時,也可以不將用戶的密碼寫在命令行中,而是根據(jù)命令提示進(jìn)行輸入(輸入的密碼不回顯),見下圖操作:
其中,前兩次輸入的密碼為用戶szd_base_v2的密碼ysyktest,第三次輸入的密碼為wallet的密碼Oracle123。
上面是創(chuàng)建了wallet的證書,為了讓Oracle能夠使用wallet,還必須在sqlnet.ora文件(和tnsnames.ora一樣,也是位于$ORACLE_HOME/network/admin目錄)中指定WALLET_LOCATION參數(shù)和SQLNET.WALLET_OVERRIDE參數(shù)。下面進(jìn)入第3步,
(3)在sqlnet.ora文件中增加WALLET_LOCATION參數(shù)和SQLNET.WALLET_OVERRIDE參數(shù),參考語法來自官方文檔
WALLET_LOCATION = ( SOURCE = ( METHOD = FILE )( METHOD_DATA = ( DIRECTORY = /private/ora102/network/admin ) ) )
其中,WALLET_LOCATION參數(shù)當(dāng)中DIRECTORY的取值為wallet目錄。下面在sqlnet.ora文件中增加這2個參數(shù),
進(jìn)入$ORACLE_HOME/network/admin目錄,發(fā)現(xiàn)沒有sqlnet.ora文件,可能是沒有配置sqlnet.ora文件。那么我們在圖形界面下,用netca命令生成sqlnet.ora文件,然后再增加那2個參數(shù)。
選擇第2個單選按鈕,命名方法配置,進(jìn)入下一步
將上圖中的Local Naming加到右邊空白窗格,最后點finish。那么,此時在$ORACLE_HOME/network/admin目錄下就會生成sqlnet.ora文件。
sqlnet.ora文件剛創(chuàng)建以后,里面的內(nèi)容只有下面幾行,
現(xiàn)在添加WALLET_LOCATION和SQLNET.WALLET_OVERRIDE這2個參數(shù),
現(xiàn)在,Oracle客戶端的安全外部密碼存儲已經(jīng)配置完畢。
為了簡化操作步驟,也可以將操作步驟(1)和(2)合為一步,直接創(chuàng)建wallet及其證書,如下圖所示:
其中,前兩次輸入的密碼為wallet本身的密碼,這里輸入Oracle123,后兩次輸入的密碼為用戶szd_base_v2的密碼ysyktest。
現(xiàn)在,我們嘗試去用base的連接串去連接Oracle數(shù)據(jù)庫,查看其登錄用戶為szd_base_v2,這樣就達(dá)到了不用輸密碼登錄數(shù)據(jù)庫的目的。
那么,用szd_base_v2用戶去連接Oracle數(shù)據(jù)庫,也是一樣的效果。
現(xiàn)在我們看一下視圖v$encryption_wallet的內(nèi)容有什么變化,
下面是沒有使用Security External Password Store之前,視圖v$encryption_wallet的內(nèi)容(前面在創(chuàng)建wallet之前也提到過,呵呵)
通過上面2圖對比,我們不難發(fā)現(xiàn),Oracle現(xiàn)在使用了我們剛才創(chuàng)建的wallet,并且該wallet的狀態(tài)為打開且正在使用。
如果用戶szd_base_v2的密碼進(jìn)行了更改,也需要把wallet里的證書信息進(jìn)行更改,否則證書里還是存放舊密碼的信息,在連接Oracle數(shù)據(jù)庫的時候就會報錯。下面將用戶szd_base_v2的密碼改為ysykbase,再用sqlplus /@base登錄,看有什么報錯。
現(xiàn)在,我們用mkstore命令將wallet里的證書進(jìn)行更改,然后再用sqlplus /@base登錄,就會正常連接。
其中,前兩次輸入的密碼為剛剛更改的用戶szd_base_v2的密碼,第三次輸入的密碼為wallet的密碼。
除了用sqlplus直接登錄Oracle數(shù)據(jù)庫以外,在導(dǎo)入導(dǎo)出數(shù)據(jù)和一些對數(shù)據(jù)庫日常維護(hù)的SHELL腳本中也可以使用,而且不會暴露明文密碼,可以消除一定的安全隱患。例如,下面的1個expdp腳本和1個SHELL腳本。
至此,用Oracle的Secure External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫 演示完畢。
參考網(wǎng)址:
官方文檔 http://docs.oracle.com/cd/B19306_01/network.102/b14266/cnctslsh.htm#g1033548
Stefan Oehrli的Blog http://www.oradba.ch/2014/07/secure-external-password-store-for-rman/
如果您覺得此篇文章對您有幫助,歡迎關(guān)注微信公眾號:guestart的DBA學(xué)習(xí)筆記,您的支持是對我最大的鼓勵!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。