mysql数据库加密方法l_使用透明数据库加密
使用透明數據庫加密
目的
本模塊介紹了如何使用透明數據庫加密對磁盤上存儲的數據進行加密。
所需時間
30 分鐘
主題
本模塊將討論以下主題:
查看屏幕截圖
將光標置于此圖標上以加載和查看本教程的所有屏幕截圖。(警告:此操作會同時加載所有屏幕截圖,網速較慢時,響應時間可能會比較長。)
注意:您還可以在下面的步驟中將光標放在每個單獨的圖標上,僅加載和查看與該步驟相關的屏幕截圖。
概述
Oracle 數據庫 10g 第 2 版透明數據庫加密功能簡化了信用卡號碼以及社會安全保險號等機密個人信息的加密。 使用透明數據加密功能,不必將加密例程嵌套到現有應用程序中,顯著降低了加密的成本和復雜性。 只需使用幾個簡單的命令即可對機密應用程序數據進行加密。
自加密機密信息
大多數加密解決方案都需要在應用程序代碼中對調用加密函數。 這樣做開銷很高,因為它通常需要深入了解應用程序并要能夠編寫和維護軟件。 通常,大多數企業沒有時間或相關的專業知識來修改現有應用程序,調用加密例程。 Oracle 透明數據加密通過將加密功能深層次地嵌套到 Oracle 數據庫,解決了加密問題。
通過 SQL 執行的應用程序邏輯不需要進行更改,仍能正常運行。 換言之,應用程序可以使用同一語法將數據插入到應用程序表中,并且 Oracle 數據庫在將信息寫入磁盤之前將自動對數據進行加密。 隨后的選擇操作將透明地解密數據,因此應用程序將繼續正常地運行。 這一點很重要,因為當前的應用程序通常期望未加密的應用程序數據。 顯示加密數據至少會使應用程序用戶迷惑不解,甚至還會破壞現有的應用程序。
設置加密密鑰
Oracle 透明數據加密提供了實施加密所必需的關鍵管理基礎架構。 加密的工作原理是將明文數據以及秘密(稱作密鑰)傳遞到加密程序中。 加密程序使用提供的密鑰對明文數據進行加密,然后返回加密數據。 以往,創建和維護密鑰的任務由應用程序完成。 Oracle 透明數據加密通過為整個數據庫自動生成一個萬能密鑰解決了此問題。 在啟動 Oracle 數據庫時,管理員必須使用不同于系統口令或 DBA 口令的口令打開一個 Oracle Wallet 對象。 然后,管理員對數據庫萬能密鑰進行初始化。 萬能密鑰是自動生成的。
性能
由于索引數據未被加密,因此加密通常會影響現有的應用程序索引。 Oracle 透明數據加密對與給定應用程序表關聯的索引值進行加密。 這意味著應用程序中的相等搜索對性能的影響很小,甚至沒有任何影響。 例如,假設應用程序 PERSON ID 存在一個索引,并且此應用程序執行以下語句:
SQL> Select rating from credit where person id = '23590';
Oracle 數據庫將使用現有的應用程序索引,盡管 PERSON ID 信息已經在數據庫中加密。
情景
在本教程中,您將創建一個包含加密列的表。 您將為加密列創建一個索引,并授予訪問某個用戶的列的權限。 該用戶隨后將更改數據。 然后,您將創建一個包含對加密數據進行相應訪問控制的函數,隨后通過 VPD 策略應用該函數。
透明數據加密在數據寫入磁盤之前對其進行加密,并在讀取該數據時將其解密。 這對所有使用 SQL 層的應用程序都是透明的。 因此,無法輕松地驗證數據是否真正被加密。 由于 Oracle LogMiner 對寫入磁盤的數據進行記錄,因此您可以訪問該信息。
準備用于加密的數據庫
在本部分內容中,您將更新 sqlnet.ora、創建一個加密錢夾 (ewallet.p12)、打開此錢夾并為 TDE 創建萬能密鑰。執行以下操作:1.
您需要更新
sqlnet.ora 文件以包含一個 ENCRYPTED_WALLET_LOCATION 條目。打開一個終端窗口,然后輸入以下命令:
cd $ORACLE_HOME/network/admin
gedit sqlnet.ora
將以下條目添加到文件末尾:
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=/u01/app/oracle/product/10.2.0/db_1/)))
保存您的更改并關閉文件。
注意: 可以為加密錢夾選擇任何目錄,但路徑不應指向在數據庫安裝過程中創建的標準模糊錢夾 (cwallet.sso)。
2.
接下來,您需要打開錢夾并創建萬能加密密鑰。從終端窗口中,輸入以下命令:
cd /home/oracle/wkdir
sqlplus /nolog
@tde00_dbsetupconnect / as sysdba
alter system set key identified by "welcome1";
上面的 alter 命令執行以下任務:
如果指定的目錄中不存在加密錢夾,則將創建加密錢夾 (ewallet.p12)、打開此錢夾并創建/重新創建 TDE 的萬能密鑰。
如果指定目錄中存在加密錢夾,則將打開此錢夾并創建/重新創建 TDE 的萬能密鑰。
注意: 只有擁有“alter system”權限的用戶才能創建萬能密鑰或打開錢夾。
萬能密鑰只能創建一次,除非您想要使用新的加密密鑰重新加密數據!!!
在后面的部分中,您不希望使用上面提供的命令;您需要打開錢夾(它在您關閉數據庫時已經關閉),但您不希望創建一個新的萬能密鑰。 于是,使用以下命令:
alter system set wallet open identified by "welcome1";
由于每個表都有各自的加密密鑰,因此萬能加密密鑰是必需的。 這些列密鑰存儲在數據庫中。 由于錢夾只能存儲有限數目的密鑰,并且可伸縮性不高,因此使用萬能密鑰加密列密鑰。 這樣,您便可以擁有所需數量的列密鑰,并且錢夾中只存儲少量的萬能密鑰(包括過期密鑰,當您某一天從舊的備份磁帶解密數據時可能需要它)。 默認情況下,以上命令使用 192 位的高級加密標準 (AES192) 生成一個密鑰。 也可以使用 3DES,或使用較小或較大的 AES 加密位數。
創建一個包含加密列的表
在本教程中,您將創建一些用戶,并創建一個包含加密列的表來存儲信用卡信息。 您將向該表中插入一些數據,為加密列創建索引并授予數據的訪問權限。執行以下操作:1.
首先需要創建一些用戶。從 SQL*Plus 會話中,執行以下腳本:
@tde01_crusersconnect 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;
注意: 您已經授予了 LSMITH DBA 角色,以演示 TDE 對相等性搜索索引的支持。 因此,dbms_xplan 的輸出應包含 INDEX RANGE SCAN。
2.
接下來,您將創建一個表,其中包含一個用于存儲加密(默認為 AES192)信用卡信息的列。 由于 credit_card_number 將有一個索引,因此未指定 SALT,當對加密值進行 salt 處理時將不會生成索引。從 SQL*Plus 會話中,執行以下腳本:
@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.
現在,可以向剛剛創建的表中添加一些數據。從 SQL*Plus 會話中,執行以下腳本:
@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.
為提高性能,您將為信用卡號碼創建一個索引。從 SQL*Plus 會話中,執行以下腳本:
@tde04_cridx create index cust_payment_info_idx on cust_payment_info (credit_card_number);
5.
需要向用戶授予客戶付款信息表的訪問權限。 在本實例中,LSMITH 是唯一一個可以更新此信息的用戶。 其他用戶只能查看它。從 SQL*Plus 會話中,執行以下腳本:
@tde05_grant_accessgrant 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 的身份對表進行更改。執行以下操作:1.
由于您授與了 LSMITH 更新訪問權限,因此能夠進行更改。從 SQL*Plus 會話中,執行以下腳本:
@tde06_make_updateprompt *** Connect as Lindsay Smith (Card_V)
conn LSMITH/welcome1;
update oe.CUST_PAYMENT_INFO set ACTIVE_CARD='NO'
where CREDIT_CARD_NUMBER='4556988708236902';
2.
要查看執行計劃,請執行以下腳本:
@tde06a_review_xplanselect * from table (dbms_xplan.display_cursor);
3.
表 user_encrypted_columns 將通知您哪個列已經加密以及它的加密算法。從 SQL*Plus 會話中,執行以下腳本:
@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 策略限制行的訪問權限。 首先,您將檢查登錄到數據庫的用戶是否是員工,然后將按信用卡號碼限制 oe.cust_payment_info 的訪問權限:Card_A 從“34”或“37”開始
Janette King
Card_V 從“4”開始
Lindsay Smith
Card_M 從“5”開始
Louise Doran
如果查看加載到表中的數據,則會看到,授權用戶將無法選擇與“Albert Einstein”關聯的信用卡號碼。 只有避開訪問控制策略的入侵者或不受這些策略約束的管理用戶才可以選擇它。 這可以對該表進行高度集中的審計。
執行以下操作:1.
首先需要創建包含信用卡和員工驗證所需邏輯的表。從 SQL*Plus 會話中,執行以下腳本:
@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.
現在,可以將該策略添加到
cust_payment_info 表中。從 SQL*Plus 會話中,執行以下腳本:
@tde09_addpolicyprompt
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;
/
測試策略
在本部分中,您將以每個員工的身份連接以查看該策略是否起作用。 有三個方面可以體現 TDE 的真正透明性:
加密列已經使用索引
即使加密存儲了信用卡號碼,VPD 策略中的 where 子句仍搜索明文格式的號碼并檢索相應的行。
對三名員工可見的行包含明文格式的信用卡號碼。 通常,員工甚至不知道已經加密存儲了數據。
執行以下操作:1.
您將首先以 Janette King 的身份連接。 她可以訪問從“34”或“37”開始的 Card_A。從 SQL*Plus 會話中,執行以下腳本:
@tde10_testpolicy_jkingprompt
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.
您現在將以 Louise Doran 的身份連接。 她可以訪問從“5”開始的 Card_M。從 SQL*Plus 會話中,執行以下腳本:
@tde11_testpolicy_ldoranprompt
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 會話中,執行以下腳本:
@tde12_testpolicy_lsmithprompt
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 是在寫入數據之前執行的并且對所有應用程序都是透明的,因此無法輕松地驗證是否真正加密了數據。 由于 Oracle LogMiner 記錄寫入磁盤的數據,因此可以使用它查看日志文件中包含的內容。執行以下步驟:1.
從 SQL*Plus 會話中,執行以下腳本:
@tde13_logminerconnect / 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 不支持加密數據,因此 credit_card_number 列中的加密值顯示為 Unsupported Type。
注意: 如果在您自己的環境中運行本教程,則需要運行以下命令來確定日志文件名稱,然后相應地修改腳本:
select member as LOG_FILE_LOCATION from v$logfile;
在無加密列的情況下重新創建表
為顯示在未對列進行加密的情況下將看到的內容之間的差異,要刪除該表并在無加密列的情況下重新創建它。執行以下操作:1.
從 SQL*Plus 會話中,執行以下腳本:
@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 會話中,執行以下腳本:
@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 顯示已寫入磁盤的名文數據。
清理
要清理環境,請執行以下步驟:1.
從 SQL*Plus 會話中,執行以下腳本:
@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;
總結
在本課程中,您學習了如何:
準備用于加密的數據庫
創建一個包含加密列的表
更改加密數據
應用 VPD 策略
使用 LogMiner 查看重做日志
在無加密列的情況下重新創建表
再次查看重做日志
將鼠標移到該圖標上可以隱藏所有屏幕截圖
總結
以上是生活随笔為你收集整理的mysql数据库加密方法l_使用透明数据库加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OJ刷题二——设计输出实数格式
- 下一篇: 对mysql优化关注_效率提高N倍的19