溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

發(fā)布時間:2020-07-18 16:24:15 來源:網(wǎng)絡(luò) 閱讀:628 作者:zhqw8315 欄目:數(shù)據(jù)庫

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

作者:趙全文  網(wǎng)名:guestart

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  在今年國內(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的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

中文翻譯如下,

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的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

中文翻譯如下,

  使用安全外部密碼存儲,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官方文檔的一段描述:

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  一般來說,用戶(包括應(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)中隨處可見)。

  比如,下面這樣的連接形式:

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中ORASALES為TNS別名,ourhost37:1527:DB17為主機名:端口號:sid。

  然而,如果客戶端配置了安全外部密碼存儲的話,就可以使用下面的連接語法來連接到數(shù)據(jù)庫,而不需要指定用戶名和密碼。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(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)

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 從上圖可以看出,wallet的類型是以文件形式存在,而且默認(rèn)的wallet就是位于$ORACLE_BASE/admin/$ORACLE_SID/wallet目錄,狀態(tài)為關(guān)閉。那么,我們再去相應(yīng)的位置查看一下wallet目錄是否存在,

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  從上圖可以得知,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目錄,

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  2、在Oracle客戶端開啟external password store(外部密碼存儲)。

  (1)使用mkstore命令先創(chuàng)建一個wallet,命令語法來自官方文檔

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  wallet_location參數(shù)指定為我們剛才創(chuàng)建的wallet目錄

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  上面提示,要給wallet輸入一個密碼(在wallet打開時需要輸入,在創(chuàng)建完wallet以后,Oracle會自動打開),這里輸入Oracle123(輸入的密碼不回顯哦),再輸入一遍(同樣不回顯,如果2次輸入的不一樣,Oracle會提示重新輸入的)。

  那么,我們到wallet目錄下面查看一下是生成了什么文件。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中cwallet.sso文件是用于保存wallet是否自動登錄的信息,ewallet.p12文件是用來保存相關(guān)的證書信息,而我們要使用的用戶名和密碼的信息就保存在證書里。

  (2)使用mkstore命令來給剛才創(chuàng)建的wallet創(chuàng)建證書,命令語法來自官方文檔

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中帶<>的參數(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)建一個。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中BASE是我們剛才新建的TNS別名,而YSYKTEST是原先存在的TNS別名。

  現(xiàn)在開始用mkstore命令創(chuàng)建wallet的證書,見下圖

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  在創(chuàng)建證書時,需要輸入wallet的密碼,就第1步創(chuàng)建wallet時輸入的密碼。

  其中,base是剛剛創(chuàng)建的TNS別名,而且用戶名和密碼一定要輸入正確,否則即使創(chuàng)建成功,一會兒也連不上Oracle數(shù)據(jù)庫。

  其實用mkstore命令創(chuàng)建wallet的證書時,也可以不將用戶的密碼寫在命令行中,而是根據(jù)命令提示進(jìn)行輸入(輸入的密碼不回顯),見下圖操作:

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中,前兩次輸入的密碼為用戶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ù),參考語法來自官方文檔

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

WALLET_LOCATION = ( SOURCE = ( METHOD = FILE )( METHOD_DATA = ( DIRECTORY = /private/ora102/network/admin ) ) )

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中,WALLET_LOCATION參數(shù)當(dāng)中DIRECTORY的取值為wallet目錄。下面在sqlnet.ora文件中增加這2個參數(shù),

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  進(jìn)入$ORACLE_HOME/network/admin目錄,發(fā)現(xiàn)沒有sqlnet.ora文件,可能是沒有配置sqlnet.ora文件。那么我們在圖形界面下,用netca命令生成sqlnet.ora文件,然后再增加那2個參數(shù)。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 選擇第2個單選按鈕,命名方法配置,進(jìn)入下一步

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  將上圖中的Local Naming加到右邊空白窗格,最后點finish。那么,此時在$ORACLE_HOME/network/admin目錄下就會生成sqlnet.ora文件。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 sqlnet.ora文件剛創(chuàng)建以后,里面的內(nèi)容只有下面幾行,

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 現(xiàn)在添加WALLET_LOCATION和SQLNET.WALLET_OVERRIDE這2個參數(shù),

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  現(xiàn)在,Oracle客戶端的安全外部密碼存儲已經(jīng)配置完畢。

 為了簡化操作步驟,也可以將操作步驟(1)和(2)合為一步,直接創(chuàng)建wallet及其證書,如下圖所示:

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中,前兩次輸入的密碼為wallet本身的密碼,這里輸入Oracle123,后兩次輸入的密碼為用戶szd_base_v2的密碼ysyktest。

  現(xiàn)在,我們嘗試去用base的連接串去連接Oracle數(shù)據(jù)庫,查看其登錄用戶為szd_base_v2,這樣就達(dá)到了不用輸密碼登錄數(shù)據(jù)庫的目的。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 那么,用szd_base_v2用戶去連接Oracle數(shù)據(jù)庫,也是一樣的效果。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 現(xiàn)在我們看一下視圖v$encryption_wallet的內(nèi)容有什么變化,

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 下面是沒有使用Security External Password Store之前,視圖v$encryption_wallet的內(nèi)容(前面在創(chuàng)建wallet之前也提到過,呵呵)

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  通過上面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登錄,看有什么報錯。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

 現(xiàn)在,我們用mkstore命令將wallet里的證書進(jìn)行更改,然后再用sqlplus /@base登錄,就會正常連接。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  其中,前兩次輸入的密碼為剛剛更改的用戶szd_base_v2的密碼,第三次輸入的密碼為wallet的密碼。

  除了用sqlplus直接登錄Oracle數(shù)據(jù)庫以外,在導(dǎo)入導(dǎo)出數(shù)據(jù)和一些對數(shù)據(jù)庫日常維護(hù)的SHELL腳本中也可以使用,而且不會暴露明文密碼,可以消除一定的安全隱患。例如,下面的1個expdp腳本和1個SHELL腳本。

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

  至此,用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í)筆記,您的支持是對我最大的鼓勵!

使用Oracle的Security External Password Store功能實現(xiàn)無密碼登錄數(shù)據(jù)庫

向AI問一下細(xì)節(jié)

免責(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)容。

AI