日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

ORACLE透明加密

 印度阿三17 2018-12-25

--官網(wǎng)文檔:https://www.oracle.com/technetwork/cn/tutorials/tde-096009-zhs.html#t
概述
Oracle 數(shù)據(jù)庫 10g 第 2 版透明數(shù)據(jù)庫加密功能簡化了信用卡號碼以及社會安全保險號等機密個人信息的加密。 使用透明數(shù)據(jù)加密功能,不必將加密例程嵌套到現(xiàn)有應用程序中,顯著降低了加密的成本和復雜性。
大多數(shù)加密解決方案都需要在應用程序代碼中對調用加密函數(shù)。 這樣做開銷很高,因為它通常需要深入了解應用程序并要能夠編寫和維護軟件。
通過 SQL 執(zhí)行的應用程序邏輯不需要進行更改,仍能正常運行。 Oracle 數(shù)據(jù)庫在將信息寫入磁盤之前將自動對數(shù)據(jù)進行加密,隨后的選擇操作將透明地解密數(shù)據(jù),因此應用程序將繼續(xù)正常地運行。

設置加密密鑰:Oracle 透明數(shù)據(jù)加密提供了實施加密所必需的關鍵管理基礎架構。 加密的工作原理是將明文數(shù)據(jù)以及秘密(稱作密鑰)傳遞到加密程序中。 加密程序使用提供的密鑰對明文數(shù)據(jù)進行加密,然后返回加密數(shù)據(jù)。 以往,創(chuàng)建和維護密鑰的任務由應用程序完成。 Oracle 透明數(shù)據(jù)加密通過為整個數(shù)據(jù)庫自動生成一個萬能密鑰解決了此問題。 在啟動 Oracle 數(shù)據(jù)庫時,管理員必須使用不同于系統(tǒng)口令或 DBA 口令的口令打開一個 Oracle Wallet 對象。 然后,管理員對數(shù)據(jù)庫萬能密鑰進行初始化。 萬能密鑰是自動生成的。

性能:由于索引數(shù)據(jù)未被加密,因此加密通常會影響現(xiàn)有的應用程序索引。 Oracle 透明數(shù)據(jù)加密對與給定應用程序表關聯(lián)的索引值進行加密。 這意味著應用程序中的相等搜索對性能的影響很小,甚至沒有任何影響。 例如,假設應用程序 PERSON ID 存在一個索引,并且此應用程序執(zhí)行以下語句:
--Oracle 數(shù)據(jù)庫將使用現(xiàn)有的應用程序索引,盡管 PERSON ID 信息已經(jīng)在數(shù)據(jù)庫中加密。
SQL> Select rating from credit where person id = '23590';

創(chuàng)建一個包含加密列的表,為加密列創(chuàng)建一個索引,并授予訪問某個用戶的列的權限, 然后,您將創(chuàng)建一個包含對加密數(shù)據(jù)進行相應訪問控制的函數(shù),隨后通過 VPD 策略應用該函數(shù)。
透明數(shù)據(jù)加密在數(shù)據(jù)寫入磁盤之前對其進行加密,并在讀取該數(shù)據(jù)時將其解密。 這對所有使用 SQL 層的應用程序都是透明的。 因此,無法輕松地驗證數(shù)據(jù)是否真正被加密。 由于 Oracle LogMiner 對寫入磁盤的數(shù)據(jù)進行記錄,因此您可以訪問該信息。

準備用于加密的數(shù)據(jù)庫
在本部分內容中,您將更新 sqlnet.ora、創(chuàng)建一個加密錢夾 (ewallet.p12)、打開此錢夾并為 TDE 創(chuàng)建萬能密鑰。執(zhí)行以下操作:
1.您需要更新 sqlnet.ora 文件以包含一個 ENCRYPTED_WALLET_LOCATION 條目。打開一個終端窗口,然后輸入以下命令:
cd $ORACLE_HOME/network/admin
gedit sqlnet.ora

--將以下條目添加到文件末尾,可以為加密錢夾選擇任何目錄,但路徑不應指向在數(shù)據(jù)庫安裝過程中創(chuàng)建的標準模糊錢夾 (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”權限的用戶才能創(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";

--需要打開錢夾(它在您關閉數(shù)據(jù)庫時已經(jīng)關閉),但您不希望創(chuàng)建一個新的萬能密鑰
alter system set wallet open identified by "welcome1";

由于每個表都有各自的加密密鑰,因此萬能加密密鑰是必需的。這些列密鑰存儲在數(shù)據(jù)庫中。 由于錢夾只能存儲有限數(shù)目的密鑰,并且可伸縮性不高,因此使用萬能密鑰加密列密鑰。 這樣,您便可以擁有所需數(shù)量的列密鑰,并且錢夾中只存儲少量的萬能密鑰(包括過期密鑰,當您某一天從舊的備份磁帶解密數(shù)據(jù)時可能需要它)。 默認情況下,以上命令使用 192 位的高級加密標準 (AES192) 生成一個密鑰。 也可以使用 3DES,或使用較小或較大的 AES 加密位數(shù)。

--創(chuàng)建一個包含加密列的表,為加密列創(chuàng)建索引并授予數(shù)據(jù)的訪問權限。執(zhí)行以下操作:
1.首先需要創(chuàng)建一些用戶。從 SQL*Plus 會話中,執(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 對相等性搜索索引的支持。 因此,dbms_xplan 的輸出應包含 INDEX RANGE SCAN。

2.接下來,您將創(chuàng)建一個表,其中包含一個用于存儲加密(默認為 AES192)信用卡信息的列。 由于 credit_card_number 將有一個索引,因此未指定 SALT,當對加密值進行 salt 處理時將不會生成索引。從 SQL*Plus 會話中,執(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 會話中,執(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.為提高性能,您將為信用卡號碼創(chuàng)建一個索引。從 SQL*Plus 會話中,執(zhí)行以下腳本:
@tde04_cridx

create index cust_payment_info_idx on cust_payment_info (credit_card_number);

5.需要向用戶授予客戶付款信息表的訪問權限。 在本實例中,LSMITH 是唯一一個可以更新此信息的用戶。 其他用戶只能查看它。從 SQL*Plus 會話中,執(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 的身份對表進行更改。執(zhí)行以下操作:

1.由于您授與了 LSMITH 更新訪問權限,因此能夠進行更改。從 SQL*Plus 會話中,執(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í)行計劃,請執(zhí)行以下腳本:
@tde06a_review_xplan

select * from table (dbms_xplan.display_cursor);

3.表 user_encrypted_columns 將通知您哪個列已經(jīng)加密以及它的加密算法。從 SQL*Plus 會話中,執(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;

添加并應用 VPD 策略
由于加密并不替換相應的訪問控制,因此您將使用一個非常簡單的 VPD 策略限制行的訪問權限。 首先,您將檢查登錄到數(shù)據(jù)庫的用戶是否是員工,然后將按信用卡號碼限制 oe.cust_payment_info 的訪問權限:

Card_A 從“34”或“37”開始 Janette King
Card_V 從“4”開始 Lindsay Smith
Card_M 從“5”開始 Louise Doran
如果查看加載到表中的數(shù)據(jù),則會看到,授權用戶將無法選擇與“Albert Einstein”關聯(lián)的信用卡號碼。 只有避開訪問控制策略的入侵者或不受這些策略約束的管理用戶才可以選擇它。 這可以對該表進行高度集中的審計。

執(zhí)行以下操作:
1.首先需要創(chuàng)建包含信用卡和員工驗證所需邏輯的表。從 SQL*Plus 會話中,執(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 會話中,執(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;
/

--測試策略,將以每個員工的身份連接以查看該策略是否起作用。 有三個方面可以體現(xiàn) TDE 的真正透明性:
加密列已經(jīng)使用索引
即使加密存儲了信用卡號碼,VPD 策略中的 where 子句仍搜索明文格式的號碼并檢索相應的行。
對三名員工可見的行包含明文格式的信用卡號碼。 通常,員工甚至不知道已經(jīng)加密存儲了數(shù)據(jù)。

1.您將首先以 Janette King 的身份連接。 她可以訪問從“34”或“37”開始的 Card_A。從 SQL*Plus 會話中,執(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 會話中,執(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 會話中,執(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í)行的并且對所有應用程序都是透明的,因此無法輕松地驗證是否真正加密了數(shù)據(jù)。 由于 Oracle LogMiner 記錄寫入磁盤的數(shù)據(jù),因此可以使用它查看日志文件中包含的內容。執(zhí)行以下步驟:
1.從 SQL*Plus 會話中,執(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)建表,為顯示在未對列進行加密的情況下將看到的內容之間的差異,要刪除該表并在無加密列的情況下重新創(chuàng)建它。執(zhí)行以下操作:
1.從 SQL*Plus 會話中,執(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;

--查看重做日志,重新運行 logminer 腳本來查看它所包含的內容
1.從 SQL*Plus 會話中,執(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)境,請執(zhí)行以下步驟:
1.從 SQL*Plus 會話中,執(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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多