IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁數(shù)據(jù)庫Oracle → 超越口令的數(shù)據(jù)庫安全性

超越口令的數(shù)據(jù)庫安全性

時(shí)間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

??? Oracle 數(shù)據(jù)庫是實(shí)際安全實(shí)施的重要組成。一般說來,運(yùn)行 Oracle 數(shù)據(jù)庫引擎的服務(wù)器得到了防火墻的很好保護(hù),但這并不能排除未授權(quán)訪問嘗試(包括內(nèi)部員工的訪問嘗試)的可能性。除了傳統(tǒng)的用戶名/口令方法之外,Oracle 數(shù)據(jù)庫引擎還提供了自身的安全機(jī)制,以便即使在通過了其他所有安全障礙的情況下,仍能保護(hù)它的數(shù)據(jù)內(nèi)容。以下各部分中確定的安全措施都假定入侵已滲透到數(shù)據(jù)庫級(jí)別,這些措施將用作數(shù)據(jù)庫自身的最后一道防線,但它們并不能用來代替外部保護(hù)。

??? 在假定所有其他安全措施已被繞過,并且未授權(quán)數(shù)據(jù)庫訪問已經(jīng)開始了的前提下,以下各部分定義的解決方案都用于構(gòu)建數(shù)據(jù)庫防御特性,以確保:

??? Oracle 應(yīng)用服務(wù)器(作為數(shù)據(jù)庫的安全客戶端)可以在需要時(shí)讀取、插入和更新所有數(shù)據(jù)。Oracle 應(yīng)用服務(wù)器將使用它的內(nèi)部安全機(jī)制和應(yīng)用程序?qū)S玫陌踩珯C(jī)制來確保私人數(shù)據(jù)免遭表示層中的未授權(quán)用戶的入侵。

??? 使用 SQL*Plus,在錯(cuò)誤解決過程中能夠進(jìn)行安全的數(shù)據(jù)庫訪問,包括能夠查看機(jī)密信息。

??? 其他數(shù)據(jù)庫訪問無法檢索私人客戶端信息。

??? 演示安裝

??? 本練習(xí)包含一個(gè)典型的銷售類型數(shù)據(jù)模型,其中要保護(hù)的數(shù)據(jù)存儲(chǔ)在 CUSTOMER 數(shù)據(jù)庫中,具體而言是 CARD_NO 列中。該示例使整個(gè)表對(duì)未授權(quán)請(qǐng)求顯示為空,因此進(jìn)行 SELECT * from CUSTOMER; 將檢索不到任何記錄。一個(gè)表面上看起來不包含任何記錄的表將比包含記錄但將"令人感興趣"的列隱藏或屏蔽起來的表更不會(huì)引起入侵者的關(guān)注(他們認(rèn)為前者可能根本未被使用)。

??? 但對(duì) DBMS_RLS.ADD_POLICY 調(diào)用稍微進(jìn)行修改后,此解決方案將隱藏(顯示為 NULL)或屏蔽(顯示為 ****)受保護(hù)列 CARD_NO 的值,但顯示其他列的值的記錄??梢酝ㄟ^在 DBMS_RLS.ADD_POLICY 調(diào)用中指定 sec_relevant_cols 和 sec_relevant_cols_opt 參數(shù)來實(shí)現(xiàn)功能。本文的支持文件中的 initial_setup.sql 腳本創(chuàng)建了一個(gè)非?;镜?CUSTOMER 表,該表作為本過程中的示例。

??? 最好避免使用模式所有者身份來訪問數(shù)據(jù);而是應(yīng)一個(gè)不同的帳戶(如 AppSvr),該帳戶由所有客戶端連接共享,并由 Oracle 應(yīng)用服務(wù)器處理。AppSvr 數(shù)據(jù)庫用戶不擁有任何對(duì)象,并且只擁有 CREATE SESSION 系統(tǒng)權(quán)限,但擁有對(duì)所有包含模式所有者(如 SHIP2004 模式的所有者)應(yīng)用程序數(shù)據(jù)的表的 SELECT、INSERT、UPDATE 和 DELETE 權(quán)限。

??? 支持文件中的 enable_connection.sql 腳本創(chuàng)建一個(gè)通常由運(yùn)行在 Oracle 應(yīng)用服務(wù)器上的應(yīng)用程序使用的用戶(如上所述)。

??? 安全性實(shí)施

??? 為實(shí)現(xiàn)所述的安全目標(biāo),除非您"授權(quán)"了連接(由在預(yù)定的 IP 地址處運(yùn)行的 Oracle 應(yīng)用服務(wù)器啟用),我們將使用一個(gè)數(shù)據(jù)庫策略來隱藏 CUSTOMER 表中的記錄,。此策略在安全管理器用戶(如 Sec_Manager)下實(shí)現(xiàn),因此即使從 SHIP2004 或 AppSvr 模式中也看不到它。

??? 確定要使用的環(huán)境變量以及要由安全謂詞檢查的特定值是實(shí)現(xiàn)的問題。大量的潛在組合和特殊的網(wǎng)站詳細(xì)信息將創(chuàng)建重要的入侵嘗試障礙。

??? 為安全實(shí)現(xiàn)中使用的所有定義創(chuàng)建一個(gè)沒有任何權(quán)限(甚至是 CONNECT)的單獨(dú)模式(如 Sec_Manager)作為占位符是比較可取的。所有對(duì)象將由 Sec_Manager 模式中的數(shù)據(jù)庫管理員帳戶創(chuàng)建。由于沒有權(quán)限,此用戶名甚至無法用于登錄到數(shù)據(jù)庫,因此所擁有的安全性定義將得到可靠地保護(hù)。(任何人甚至看不到與安全性相關(guān)的對(duì)象的定義。)

??? 但本文最初的目標(biāo)之一是為幾個(gè)維護(hù)和支持人員成員實(shí)現(xiàn) SQL*Plus 級(jí)別的訪問。此緊急訪問需要一個(gè)"安全通道",它可以被授權(quán)用戶輕松記住,但由于太長而無法寫入到桌面即時(shí)貼中(可由任何人看到),這種由于所保留的口令數(shù)目所導(dǎo)致的不利情況。本示例使用 CLIENT_IDENTIFIER 環(huán)境變量,但它可以為您所選擇的任何環(huán)境變量或環(huán)境變量組合。

??? create_setup.sql 腳本(位于支持文件中)演示了如何根據(jù)以上描述創(chuàng)建安全實(shí)現(xiàn)模式、謂詞函數(shù)以及安全策略。它還生成了幾個(gè)數(shù)據(jù)列表,并使用不同的數(shù)據(jù)庫登錄權(quán)限演示了將在 CUSTOMER 表中看到(或看不到)的不同連接。它還演示了如何使用 dbms_session.set_identifier 函數(shù)進(jìn)行解密,以通過 SQL*Plus 連接訪問數(shù)據(jù)。

??? 直接的 SQL*Plus 訪問

??? 由于 Oracle 應(yīng)用服務(wù)器具有強(qiáng)健的內(nèi)置安全特性(用于驗(yàn)證和授權(quán)請(qǐng)求),因此直接的 SQL*Plus 訪問是入侵者通常使用的入口點(diǎn)。實(shí)現(xiàn)如上所述的安全策略后,將具備以下功能:

??? 即使 AppSvr 口令已被破壞,且某個(gè)人使用 AppSvr 登錄以通過 SQL*Plus 進(jìn)行未授權(quán)訪問,CUSTOMER 數(shù)據(jù)也不會(huì)顯示,這是因?yàn)?IP 地址和/或外部會(huì)話名稱不是安全謂詞所預(yù)期的—系統(tǒng)甚至不會(huì)顯示受保護(hù)的表中存在有任何記錄。

??? 聯(lián)網(wǎng)應(yīng)用程序?qū)⒉粫?huì)使用模式所有者帳號(hào)登錄。它將只用于維護(hù)目的,因此會(huì)嚴(yán)格控制它的發(fā)放人數(shù)。此外,它們將必須正確地完成一個(gè)或多個(gè)環(huán)境設(shè)置(本示例中為 CLIENT_IDENTIFIER)才能查看 CUSTOMER 數(shù)據(jù)。即使口令遭到破壞(例如,某個(gè)人找到桌面上的即時(shí)貼),只要安全謂詞中隱藏的后門設(shè)置未被泄露,受保護(hù)的表也將對(duì)訪問它的未授權(quán)用戶顯示為空。由于入侵者甚至不知道該表中存在數(shù)據(jù),因此根本不可能對(duì)其進(jìn)行進(jìn)一步的研究。

??? 任何其他數(shù)據(jù)庫用戶(甚至擁有數(shù)據(jù)庫管理員權(quán)限的用戶)都看不到受保護(hù)表中的記錄。然而,即使其他數(shù)據(jù)庫用戶通過某種方式獲得了 SHIP2004 表的訪問權(quán)限,以上所述的注意事項(xiàng)也仍然有效。(用戶必須了解安全特性才能看到私人數(shù)據(jù)。)

??? 示例腳本中的數(shù)據(jù)列表演示了如上所述的內(nèi)容。

??? 加密數(shù)據(jù)和程序包

??? 加密 CARD_NO 數(shù)據(jù)可以確保為機(jī)密數(shù)據(jù)再添加一層數(shù)據(jù)保護(hù)。可以使用外部進(jìn)程中定義的靜態(tài)密鑰或數(shù)據(jù)庫的列中存儲(chǔ)的靜態(tài)密鑰進(jìn)行加密。一個(gè)比較可取的方法是將加密組件(密鑰和函數(shù))劃分到兩個(gè)單獨(dú)的服務(wù)器,以增加環(huán)境的復(fù)雜性和潛在的入侵者檢索所有所需信息以解密受保護(hù)數(shù)據(jù)所需的工作量。

??? 如果在應(yīng)用程序中定義密鑰,則攻擊者將不但必須進(jìn)入數(shù)據(jù)庫服務(wù)器,而且必須進(jìn)入應(yīng)用服務(wù)器才能獲得此密鑰以解密數(shù)據(jù)。即使某個(gè)人攻破了以上各部分中描述的訪問保護(hù),他仍必須破解程序包代碼(按下個(gè)部分"保護(hù)安全環(huán)境"中的描述進(jìn)行編碼)才能知道所應(yīng)用的加密函數(shù)。攻擊者還必須破解位于應(yīng)用服務(wù)器中的已編譯的應(yīng)用程序代碼才能識(shí)別所使用的密鑰。如果此密鑰未存儲(chǔ)在任何明文文件(如參數(shù)文件或源代碼)中,而是只存儲(chǔ)在已編譯的版本中,則通過未授權(quán)訪問檢索實(shí)際加密數(shù)據(jù)所需的技能和難度將隨之提高。

??? 但為了獨(dú)立于應(yīng)用程序,支持文件中演示的示例將其他表列用作加密密鑰。密鑰列中存儲(chǔ)的值必須是靜態(tài)的,這是因?yàn)槿绻撝蹈?,則 CARD_NO 數(shù)據(jù)將無法再被解密。在本示例中,我們?yōu)榇嗣荑€選擇了 CREATED_BY 列,原因是記錄創(chuàng)建后它將不會(huì)進(jìn)行更新。

??? 最大限度地減少加密所需的額外工作的最便捷的解決方案是創(chuàng)建一個(gè)程序包,該程序?qū)⒂糜趶母旧想[藏對(duì) Oracle 的加密實(shí)用程序調(diào)用。開發(fā)人員將只需生成一個(gè)函數(shù)調(diào)用而不是直接使用受保護(hù)的列,這是為獲取安全保障而產(chǎn)生的一個(gè)很小的不便之處。本示例使用 DBMS_CRYPTO 程序包中的 ENCRYPT 和 DECRYPT 函數(shù),該程序包提供了許多加密方法(有關(guān)其他詳細(xì)信息,請(qǐng)參閱 Oracle 文檔)。大量的選項(xiàng)組合(針對(duì)所選擇的密鑰)增加了攻破所提供解決方案的復(fù)雜度,尤其是按如下所述對(duì)定制程序包的源代碼進(jìn)行了打包后。(create_packages.sql 腳本為本文描述的加密/解密函數(shù)提供了示例設(shè)置。)

??? Oracle 數(shù)據(jù)庫 10g 第 2 版提供了隨取隨用的透明數(shù)據(jù)加密,使您能夠透明地加密任何常規(guī)數(shù)據(jù)庫列(日期、字符串、數(shù)字)并在用戶通過了必需的訪問控制檢查時(shí)自動(dòng)將其解密。Oracle 引擎本身(不受數(shù)據(jù)庫用戶的控制)可以處理加密密鑰,因此對(duì)表的應(yīng)用程序或 SQL 訪問不必再管理這些密鑰。通過擴(kuò)展,數(shù)據(jù)庫管理員可以管理表但看不到實(shí)際的數(shù)據(jù)值,這將解決以上設(shè)置所涉及的部分問題。

??? 操作加密數(shù)據(jù)

??? Oracle 應(yīng)用服務(wù)器應(yīng)用程序使用 Sec_Manager.Secure_Package 程序包中的例程存儲(chǔ)加密格式的私人數(shù)據(jù)(如使用 Secure_Package.Secure_Data 存儲(chǔ) CARD_NO 數(shù)據(jù))。根據(jù) create_packages.sql(位于支持文件中)中描述的定制加密程序包的定義,對(duì) CARD_NO 列的訪問已被函數(shù)調(diào)用所取代,該函數(shù)調(diào)用的參數(shù)是要存儲(chǔ)在列中的值以及用于數(shù)據(jù)解密的密鑰。

??? 例如,要將"a1b2c3d4"用作加密密鑰,必須將最初如下所示的典型 INSERT 語句

insert into CUSTOMER (NAME, CARD_NO) values ('Jane Doe', '1234123412341234');?

??? 轉(zhuǎn)換為:

insert into CUSTOMER (NAME, CARD_NO) values ('Jane Doe', Sec_Manager.Secure_Package.Secure_Data('1234123412341234','a1b2c3d4'));?

??? 同樣,Oracle 應(yīng)用服務(wù)器應(yīng)用程序還使用 Sec_Manager.Secure_Package 中的例程讀取加密格式的數(shù)據(jù),如 CARD_NO 數(shù)據(jù)的 Secure_Package.Clear_Data。然后利用插入值時(shí)使用的加密密鑰來以明文格式取回受保護(hù)信息。這種情況下,必

關(guān)鍵詞標(biāo)簽:數(shù)據(jù)庫安全

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法