|
--官網(wǎng)文檔:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t 概述 Oracle 數(shù)據(jù)庫 10g 第 2 版透明數(shù)據(jù)庫加密功能簡(jiǎn)化了信用卡號(hào)碼以及社會(huì)安全保險(xiǎn)號(hào)等機(jī)密個(gè)人信息的加密。 使用透明數(shù)據(jù)加密功能,不必將加密例程嵌套到現(xiàn)有應(yīng)用程序中,顯著降低了加密的成本和復(fù)雜性。 大多數(shù)加密解決方案都需要在應(yīng)用程序代碼中對(duì)調(diào)用加密函數(shù)。 這樣做開銷很高,因?yàn)樗ǔP枰钊肓私鈶?yīng)用程序并要能夠編寫和維護(hù)軟件。 通過 SQL 執(zhí)行的應(yīng)用程序邏輯不需要進(jìn)行更改,仍能正常運(yùn)行。 Oracle 數(shù)據(jù)庫在將信息寫入磁盤之前將自動(dòng)對(duì)數(shù)據(jù)進(jìn)行加密,隨后的選擇操作將透明地解密數(shù)據(jù),因此應(yīng)用程序?qū)⒗^續(xù)正常地運(yùn)行。
設(shè)置加密密鑰:Oracle 透明數(shù)據(jù)加密提供了實(shí)施加密所必需的關(guān)鍵管理基礎(chǔ)架構(gòu)。 加密的工作原理是將明文數(shù)據(jù)以及秘密(稱作密鑰)傳遞到加密程序中。 加密程序使用提供的密鑰對(duì)明文數(shù)據(jù)進(jìn)行加密,然后返回加密數(shù)據(jù)。 以往,創(chuàng)建和維護(hù)密鑰的任務(wù)由應(yīng)用程序完成。 Oracle 透明數(shù)據(jù)加密通過為整個(gè)數(shù)據(jù)庫自動(dòng)生成一個(gè)萬能密鑰解決了此問題。 在啟動(dòng) Oracle 數(shù)據(jù)庫時(shí),管理員必須使用不同于系統(tǒng)口令或 DBA 口令的口令打開一個(gè) Oracle Wallet 對(duì)象。 然后,管理員對(duì)數(shù)據(jù)庫萬能密鑰進(jìn)行初始化。 萬能密鑰是自動(dòng)生成的。
性能:由于索引數(shù)據(jù)未被加密,因此加密通常會(huì)影響現(xiàn)有的應(yīng)用程序索引。 Oracle 透明數(shù)據(jù)加密對(duì)與給定應(yīng)用程序表關(guān)聯(lián)的索引值進(jìn)行加密。 這意味著應(yīng)用程序中的相等搜索對(duì)性能的影響很小,甚至沒有任何影響。 例如,假設(shè)應(yīng)用程序 PERSON ID 存在一個(gè)索引,并且此應(yīng)用程序執(zhí)行以下語句: --Oracle 數(shù)據(jù)庫將使用現(xiàn)有的應(yīng)用程序索引,盡管 PERSON ID 信息已經(jīng)在數(shù)據(jù)庫中加密。 SQL> Select rating from credit where person id = '23590';
創(chuàng)建一個(gè)包含加密列的表,為加密列創(chuàng)建一個(gè)索引,并授予訪問某個(gè)用戶的列的權(quán)限, 然后,您將創(chuàng)建一個(gè)包含對(duì)加密數(shù)據(jù)進(jìn)行相應(yīng)訪問控制的函數(shù),隨后通過 VPD 策略應(yīng)用該函數(shù)。 透明數(shù)據(jù)加密在數(shù)據(jù)寫入磁盤之前對(duì)其進(jìn)行加密,并在讀取該數(shù)據(jù)時(shí)將其解密。 這對(duì)所有使用 SQL 層的應(yīng)用程序都是透明的。 因此,無法輕松地驗(yàn)證數(shù)據(jù)是否真正被加密。 由于 Oracle LogMiner 對(duì)寫入磁盤的數(shù)據(jù)進(jìn)行記錄,因此您可以訪問該信息。
準(zhǔn)備用于加密的數(shù)據(jù)庫 在本部分內(nèi)容中,您將更新 sqlnet.ora、創(chuàng)建一個(gè)加密錢夾 (ewallet.p12)、打開此錢夾并為 TDE 創(chuàng)建萬能密鑰。執(zhí)行以下操作: 1.您需要更新 sqlnet.ora 文件以包含一個(gè) ENCRYPTED_WALLET_LOCATION 條目。打開一個(gè)終端窗口,然后輸入以下命令: cd $ORACLE_HOME/network/admin gedit sqlnet.ora
--將以下條目添加到文件末尾,可以為加密錢夾選擇任何目錄,但路徑不應(yīng)指向在數(shù)據(jù)庫安裝過程中創(chuàng)建的標(biāo)準(zhǔn)模糊錢夾 (cwallet.sso): ENCRYPTION_WALLET_LOCATION= (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=/u01/app/oracle/product/10.2.0/db_1/)))
2.接下來,您需要打開錢夾并創(chuàng)建萬能加密密鑰。從終端窗口中,輸入以下命令: cd /home/oracle/wkdir sqlplus /nolog @tde00_dbsetup
--只有擁有“alter system”權(quán)限的用戶才能創(chuàng)建萬能密鑰或打開錢夾;萬能密鑰只能創(chuàng)建一次,除非您想要使用新的加密密鑰重新加密數(shù)據(jù) connect / as sysdba --如果指定的目錄中不存在加密錢夾,則將創(chuàng)建加密錢夾 (ewallet.p12)、打開此錢夾并創(chuàng)建/重新創(chuàng)建 TDE 的萬能密鑰; 如果指定目錄中存在加密錢夾,則將打開此錢夾并創(chuàng)建/重新創(chuàng)建 TDE 的萬能密鑰。 alter system set key identified by "welcome1";
--需要打開錢夾(它在您關(guān)閉數(shù)據(jù)庫時(shí)已經(jīng)關(guān)閉),但您不希望創(chuàng)建一個(gè)新的萬能密鑰 alter system set wallet open identified by "welcome1";
由于每個(gè)表都有各自的加密密鑰,因此萬能加密密鑰是必需的。這些列密鑰存儲(chǔ)在數(shù)據(jù)庫中。 由于錢夾只能存儲(chǔ)有限數(shù)目的密鑰,并且可伸縮性不高,因此使用萬能密鑰加密列密鑰。 這樣,您便可以擁有所需數(shù)量的列密鑰,并且錢夾中只存儲(chǔ)少量的萬能密鑰(包括過期密鑰,當(dāng)您某一天從舊的備份磁帶解密數(shù)據(jù)時(shí)可能需要它)。 默認(rèn)情況下,以上命令使用 192 位的高級(jí)加密標(biāo)準(zhǔn) (AES192) 生成一個(gè)密鑰。 也可以使用 3DES,或使用較小或較大的 AES 加密位數(shù)。
--創(chuàng)建一個(gè)包含加密列的表,為加密列創(chuàng)建索引并授予數(shù)據(jù)的訪問權(quán)限。執(zhí)行以下操作: 1.首先需要?jiǎng)?chuàng)建一些用戶。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde01_crusers
connect system/oracle prompt Create users: JKING, LSMITH and LDORAN grant connect to JKING identified by welcome1; grant connect, DBA to LSMITH identified by welcome1; grant connect to LDORAN identified by welcome1; 注意: 您已經(jīng)授予了 LSMITH DBA 角色,以演示 TDE 對(duì)相等性搜索索引的支持。 因此,dbms_xplan 的輸出應(yīng)包含 INDEX RANGE SCAN。
2.接下來,您將創(chuàng)建一個(gè)表,其中包含一個(gè)用于存儲(chǔ)加密(默認(rèn)為 AES192)信用卡信息的列。 由于 credit_card_number 將有一個(gè)索引,因此未指定 SALT,當(dāng)對(duì)加密值進(jìn)行 salt 處理時(shí)將不會(huì)生成索引。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde02_crtabl
connect oe/oe create table cust_payment_info (first_name varchar2(11), last_name varchar2(10), order_number number(5), credit_card_number varchar2(16) ENCRYPT NO SALT, active_card varchar2(3));
3.現(xiàn)在,可以向剛剛創(chuàng)建的表中添加一些數(shù)據(jù)。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde03_poptabl
insert into cust_payment_info values ('Jon', 'Oldfield', 10001, '5446959708812985','YES'); insert into cust_payment_info values ('Chris', 'White', 10002, '5122358046082560','YES'); insert into cust_payment_info values ('Alan', 'Squire', 10003, '5595968943757920','YES'); insert into cust_payment_info values ('Mike', 'Anderson', 10004, '4929889576357400','YES'); insert into cust_payment_info values ('Annie', 'Schmidt', 10005, '4556988708236902','YES'); insert into cust_payment_info values ('Elliott', 'Meyer', 10006, '374366599711820','YES'); insert into cust_payment_info values ('Celine', 'Smith', 10007, '4716898533036','YES'); insert into cust_payment_info values ('Steve', 'Haslam', 10008, '340975900376858','YES'); insert into cust_payment_info values ('Albert', 'Einstein', 10009, '310654305412389','YES');
4.為提高性能,您將為信用卡號(hào)碼創(chuàng)建一個(gè)索引。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde04_cridx
create index cust_payment_info_idx on cust_payment_info (credit_card_number);
5.需要向用戶授予客戶付款信息表的訪問權(quán)限。 在本實(shí)例中,LSMITH 是唯一一個(gè)可以更新此信息的用戶。 其他用戶只能查看它。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde05_grant_access
grant select on oe.CUST_PAYMENT_INFO to LDORAN; grant select, update on oe.CUST_PAYMENT_INFO to LSMITH; grant select on oe.CUST_PAYMENT_INFO to JKING;
在本部分中,您將以 LSMITH 的身份對(duì)表進(jìn)行更改。執(zhí)行以下操作:
1.由于您授與了 LSMITH 更新訪問權(quán)限,因此能夠進(jìn)行更改。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde06_make_update
prompt *** Connect as Lindsay Smith (Card_V) conn LSMITH/welcome1; update oe.CUST_PAYMENT_INFO set ACTIVE_CARD='NO' where CREDIT_CARD_NUMBER='4556988708236902';
2.要查看執(zhí)行計(jì)劃,請(qǐng)執(zhí)行以下腳本: @tde06a_review_xplan
select * from table (dbms_xplan.display_cursor);
3.表 user_encrypted_columns 將通知您哪個(gè)列已經(jīng)加密以及它的加密算法。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde07_select_encrypt_col
connect oe/oe col TABLE_NAME format a18; col COLUMN_NAME format a19; col ENCRYPTION_ALG format a17; select * from user_encrypted_columns;
添加并應(yīng)用 VPD 策略 由于加密并不替換相應(yīng)的訪問控制,因此您將使用一個(gè)非常簡(jiǎn)單的 VPD 策略限制行的訪問權(quán)限。 首先,您將檢查登錄到數(shù)據(jù)庫的用戶是否是員工,然后將按信用卡號(hào)碼限制 oe.cust_payment_info 的訪問權(quán)限:
Card_A 從“34”或“37”開始 Janette King Card_V 從“4”開始 Lindsay Smith Card_M 從“5”開始 Louise Doran 如果查看加載到表中的數(shù)據(jù),則會(huì)看到,授權(quán)用戶將無法選擇與“Albert Einstein”關(guān)聯(lián)的信用卡號(hào)碼。 只有避開訪問控制策略的入侵者或不受這些策略約束的管理用戶才可以選擇它。 這可以對(duì)該表進(jìn)行高度集中的審計(jì)。
執(zhí)行以下操作: 1.首先需要?jiǎng)?chuàng)建包含信用卡和員工驗(yàn)證所需邏輯的表。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde08_crfunction
connect system/oracle; prompt prompt *** Create policy function to create the where-clause: create or replace function f_policy_oe_cust_payment_info -- Function must have the following parameters (schema in varchar2, tab in varchar2) -- Function will return a string that is used as a WHERE clause return varchar2 as v_manager_id number:=0; is_employee number:=0; v_user varchar2(20); out_string varchar2(70) default '1=2 '; begin -- get session user v_user := lower(sys_context('userenv','session_user')); -- Is the user an employee? begin select manager_id into v_manager_id from hr.employees where lower(email) = v_user; is_employee:=1; exception when no_data_found then is_employee:=2; end; -- create where clause when user is authorized to see parts of the table if is_employee=1 and lower(v_user)='jking' and v_manager_id=146 then out_string := out_string ||'or CREDIT_CARD_NUMBER like ''34%'' or CREDIT_CARD_NUMBER like ''37%'''; elsif is_employee=1 and lower(v_user)='lsmith' and v_manager_id=146 then out_string := out_string ||'or CREDIT_CARD_NUMBER like ''4%'''; elsif is_employee=1 and lower(v_user)='ldoran' and v_manager_id=146 then out_string := out_string ||'or CREDIT_CARD_NUMBER like ''5%'''; end if; return out_string; end; /
2.現(xiàn)在,可以將該策略添加到 cust_payment_info 表中。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde09_addpolicy
prompt prompt *** Add policy to 'oe.cust_payment_info' table: begin dbms_rls.add_policy('oe','cust_payment_info','ac_cust_payment_info', 'system','f_policy_oe_cust_payment_info', policy_type => dbms_rls.context_sensitive); end; /
--測(cè)試策略,將以每個(gè)員工的身份連接以查看該策略是否起作用。 有三個(gè)方面可以體現(xiàn) TDE 的真正透明性: 加密列已經(jīng)使用索引 即使加密存儲(chǔ)了信用卡號(hào)碼,VPD 策略中的 where 子句仍搜索明文格式的號(hào)碼并檢索相應(yīng)的行。 對(duì)三名員工可見的行包含明文格式的信用卡號(hào)碼。 通常,員工甚至不知道已經(jīng)加密存儲(chǔ)了數(shù)據(jù)。
1.您將首先以 Janette King 的身份連接。 她可以訪問從“34”或“37”開始的 Card_A。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde10_testpolicy_jking
prompt prompt *** Connect as Janette King (Card_A) conn JKING/welcome1; col CREDIT_CARD_NUMBER heading Card_A format a18; select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;
2.您現(xiàn)在將以 Louise Doran 的身份連接。 她可以訪問從“5”開始的 Card_M。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde11_testpolicy_ldoran
prompt prompt *** Connect as Louise Doran (Card_M) conn LDORAN/welcome1; col CREDIT_CARD_NUMBER heading Card_M format a18; select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER; 3.然后,您將以 Lindsay Smith 的身份連接。 她可以訪問從“4”開始的 Card_V。從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde12_testpolicy_lsmith
prompt prompt *** Connect as Lindsay Smith (Card_V) conn LSMITH/welcome1; col CREDIT_CARD_NUMBER heading Card_V format a18; select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;
--使用 LogMiner 查看重做日志 由于 TDE 是在寫入數(shù)據(jù)之前執(zhí)行的并且對(duì)所有應(yīng)用程序都是透明的,因此無法輕松地驗(yàn)證是否真正加密了數(shù)據(jù)。 由于 Oracle LogMiner 記錄寫入磁盤的數(shù)據(jù),因此可以使用它查看日志文件中包含的內(nèi)容。執(zhí)行以下步驟: 1.從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde13_logminer
connect / as sysdba; alter database add supplemental log data; REM select member as LOG_FILE_LOCATION from v$logfile; EXECUTE DBMS_LOGMNR.ADD_LOGFILE (' MY_DG2/racdb/onlinelog/group_3.263.562151437', DBMS_LOGMNR.NEW); EXECUTE DBMS_LOGMNR.ADD_LOGFILE (' MY_DG2/racdb/onlinelog/group_2.262.562151433', DBMS_LOGMNR.ADDFILE); EXECUTE DBMS_LOGMNR.ADD_LOGFILE (' MY_DG2/racdb/onlinelog/group_1.261.562151431', DBMS_LOGMNR.ADDFILE) prompt start LogMiner: EXECUTE DBMS_LOGMNR.START_LOGMNR (options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG DBMS_LOGMNR.COMMITTED_DATA_ONLY); select sql_redo from v$logmnr_contents where table_name = 'CUST_PAYMENT_INFO' and operation='INSERT';
--LogMiner 不支持加密數(shù)據(jù),因此 credit_card_number 列中的加密值顯示為 Unsupported Type。
--在無加密列的情況下重新創(chuàng)建表,為顯示在未對(duì)列進(jìn)行加密的情況下將看到的內(nèi)容之間的差異,要?jiǎng)h除該表并在無加密列的情況下重新創(chuàng)建它。執(zhí)行以下操作: 1.從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde14_crtabl2
connect oe/oe drop table cust_payment_info; create table cust_payment_info (first_name varchar2(11), last_name varchar2(10), order_number number(5), credit_card_number varchar2(20), active_card varchar2(3)); insert into cust_payment_info values ('Jon', 'Oldfield', 10001, 5446959708812985,'YES'); insert into cust_payment_info values ('Chris', 'White', 10002, 5122358046082560,'YES'); insert into cust_payment_info values ('Alan', 'Squire', 10003, 5595968943757920,'YES'); insert into cust_payment_info values ('Mike', 'Anderson', 10004, 4929889576357400,'YES'); insert into cust_payment_info values ('Annie', 'Schmidt', 10005, 4556988708236902,'YES'); insert into cust_payment_info values ('Elliott', 'Meyer', 10006, 374366599711820,'YES'); insert into cust_payment_info values ('Celine', 'Smith', 10007, 4716898533036,'YES'); insert into cust_payment_info values ('Steve', 'Haslam', 10008, 340975900376858,'YES'); insert into cust_payment_info values ('Albert', 'Einstein', 10009, 310654305412389,'YES'); create index cust_payment_info_idx on cust_payment_info (credit_card_number); grant select on oe.CUST_PAYMENT_INFO to LDORAN; grant select, update on oe.CUST_PAYMENT_INFO to LSMITH; grant select on oe.CUST_PAYMENT_INFO to JKING;
prompt *** Connect as Lindsay Smith (Card_V) conn LSMITH/welcome1; update oe.CUST_PAYMENT_INFO set ACTIVE_CARD='NO' where CREDIT_CARD_NUMBER=4556988708236902;
--查看重做日志,重新運(yùn)行 logminer 腳本來查看它所包含的內(nèi)容 1.從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde15_logminer2
connect / as sysdba; EXECUTE DBMS_LOGMNR.ADD_LOGFILE (' MY_DG2/racdb/onlinelog/group_3.263.562151437', DBMS_LOGMNR.NEW); EXECUTE DBMS_LOGMNR.ADD_LOGFILE (' MY_DG2/racdb/onlinelog/group_2.262.562151433', DBMS_LOGMNR.ADDFILE); EXECUTE DBMS_LOGMNR.ADD_LOGFILE (' MY_DG2/racdb/onlinelog/group_1.261.562151431', DBMS_LOGMNR.ADDFILE)
prompt start LogMiner: EXECUTE DBMS_LOGMNR.START_LOGMNR (options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG DBMS_LOGMNR.COMMITTED_DATA_ONLY); select sql_redo from v$logmnr_contents where table_name = 'CUST_PAYMENT_INFO' and operation='INSERT'; --該列未加密,且 LogMiner 顯示已寫入磁盤的名文數(shù)據(jù)。
--要清理環(huán)境,請(qǐng)執(zhí)行以下步驟: 1.從 SQL*Plus 會(huì)話中,執(zhí)行以下腳本: @tde16_cleanup
connect system/oracle drop user JKING cascade; drop user LSMITH cascade; drop user LDORAN cascade; drop function f_policy_oe_cust_payment_info; connect oe/oe drop table cust_payment_info; exit; 來源:http://www./content-2-96251.html
|