Mục đích: Transparent Data Encryption (TDE) trong Oracle 10g Database Release 2 để mã hóa datafile bảo vệ dữ liệu tránh bị copy trộm datafile làm thất thoát dữ liệu (hacker dùng trình đọc HEX để đọc dữ liệu)
- Thiết lập moi trường
- Cột chưa mã hóa
- Cột đã mã hóa
- Bật DB
- Hiệu năng
- External Tables
- Views
- Cập nhật từ 12c
Thiết lập môi trường
CONN sys/password AS SYSDBA CREATE TABLESPACE tde_test DATAFILE '/u01/oradata/DB10G/tde_test.dbf' SIZE 128K AUTOEXTEND ON NEXT 64K;
Tạo 1 user và 1 quota cho nó:
CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE tde_test; ALTER USER test QUOTA UNLIMITED ON tde_test; GRANT CONNECT TO test; GRANT CREATE TABLE TO test;
Cột chưa được mã hóa
Tạo bảng, thêm dữ liệu:
CONN test/test CREATE TABLE tde_test ( id NUMBER(10), data VARCHAR2(50) ) TABLESPACE tde_test; INSERT INTO tde_test (id, data) VALUES (1, 'This is a secret!'); COMMIT;
Flush buffer cache để đảm bảo dữ liệu được ghi vào datafile.
CONN sys/password AS SYSDBA ALTER SYSTEM FLUSH BUFFER_CACHE;
Mở bằng chương trình chỉnh sửa HEX (như UltraEdit) khi đó chuỗi "This is a secret!"được nhìn thấy
Cột đã mã hóa
Trước khi tạo bảng với với cột mã hóa, chúng ta phải tạo khóa bí mật lưu trong ví. Thứ tự tìm ví như sau:
- Nếu có, vị trí được chỉ định bởi
tham số ENCRYPTION_WALLET_LOCATION
trong tệp sqlnet.ora. - Nếu có, vị trí được chỉ định bởi
tham số WALLET_LOCATION
trong tệp sqlnet.ora. - Vị trí mặc định cho ví. Nếu $ORACLE_BASE được đặt, là "$ORACLE_BASE/admin/ DB_UNIQUE_NAME/wallet", nếu không nó sẽ nằm trong "$ORACLE_HOME/admin/DB_UNIQUE_NAME/wallet",
DB_UNIQUE_NAME
lấy từ tệp tham số khởi tạo.
Mặc dù các tablespace được mã hóa có thể chia sẻ ví cơ sở dữ liệu mặc định, Oracle khuyến cáo bạn nên sử dụng một ví riêng cho chức năng mã hóa dữ liệu trong suốt bằng cách chỉ định tham số ENCRYPTION_WALLET_LOCATION trong tệp sqlnet.ora. Để thực hiện điều này, chúng tôi thêm mục sau vào tệp sqlnet.ora trên máy chủ và đảm bảo rằng thư mục được chỉ định đã được tạo.
ENCRYPTION_WALLET_LOCATION= (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=/u01/app/oracle/admin/DB10G/encryption_wallet/)))
Lệnh tạo ví:
CONN sys/password AS SYSDBA -- 10g ALTER SYSTEM SET ENCRYPTION KEY AUTHENTICATED BY "oracle"; -- 11g ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "oracle";
Ví được mở lại sau khi instance restart và có thể đóng để ngăn chặn truy cập cột đã mã hóa:
-- 10g ALTER SYSTEM SET ENCRYPTION WALLET OPEN AUTHENTICATED BY "oracle";
-- 11g ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "oracle";
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
Tạo bảng với cột mã hóa và thêm dữ liệu. Sử dụng mệnh đề sing the ENCRYPT
tương đương với mệnh đề ENCRYPT USING 'AES192'
, do AES192 là thuật toán mã hóa mặc định:
CONN test/test
DROP TABLE tde_test;
PURGE RECYCLEBIN;
CREATE TABLE tde_test (
id NUMBER(10),
data VARCHAR2(50) ENCRYPT
)
TABLESPACE tde_test;
INSERT INTO tde_test (id, data) VALUES (1, 'This is a secret!');
COMMIT;
Flush buffer cache để đảm bảo dữ liệu được ghi xuống datafile.
CONN sys/password AS SYSDBA ALTER SYSTEM FLUSH BUFFER_CACHE;
Khi mở file bằng trình đọc HEX , cột chứa dữ liệu tương tự This is a secret! đã được mã hóa, trong khi đó dữ liệu vẫn truy xuất bình thường:
SELECT * FROM tde_test; ID DATA ---------- -------------------------------------------------- 1 This is a secret! 1 row selected.
Khơi động DB
Thủ tục dưới đây hướng dẫn cách dừng, bật DB với cột mã hóa. Chú ý wallet phải được mở trước khi cần truy cập dữ liệu.
SQL> CONN / AS SYSDBA
Connected.
SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP
ORACLE instance started.
Total System Global Area 626327552 bytes
Fixed Size 2255832 bytes
Variable Size 234882088 bytes
Database Buffers 381681664 bytes
Redo Buffers 7507968 bytes
Database mounted.
Database opened.
SQL> SELECT tablespace_name, encrypted, status FROM dba_tablespaces;
TABLESPACE_NAME ENC STATUS
------------------------------ --- ---------
SYSTEM NO ONLINE
SYSAUX NO ONLINE
UNDOTBS1 NO ONLINE
TEMP NO ONLINE
USERS NO ONLINE
EXAMPLE NO ONLINE
SOE NO ONLINE
TDE_TEST NO ONLINE
8 rows selected.
SQL> SELECT * FROM test.tde_test;
SELECT * FROM test.tde_test
*
ERROR at line 1:
ORA-28365: wallet is not open
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "oracle";
System altered.
SQL> SELECT * FROM test.tde_test;
ID DATA
---------- --------------------------------------------------
1 This is a secret!
1 row selected.
SQL>
Hiệu năng (Performance)
Do phải trải qua quá trình giải mã/mã hóa nên sẽ ảnh hưởng đến hiệu năng, chúng ta demo 2 bảng sau:
CONN test/test CREATE TABLE tde_test_1 ( id NUMBER(10), data VARCHAR2(50) ) TABLESPACE tde_test; CREATE TABLE tde_test_2 ( id NUMBER(10), data VARCHAR2(50) ENCRYPT ) TABLESPACE tde_test;
Script so sánh tốc độ mã hóa khi insert dữ liệu và giải mã khi truy vấn, lặp lại 1000 lần, báo cáo kết quả vào lần thứ 100 của mỗi chu kỳ:
SET SERVEROUTPUT ON SIZE UNLIMITED DECLARE l_loops NUMBER := 1000; l_data VARCHAR2(50); l_start NUMBER; BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE tde_test_1'; EXECUTE IMMEDIATE 'TRUNCATE TABLE tde_test_2'; l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP INSERT INTO tde_test_1 (id, data) VALUES (i, 'Data for ' || i); END LOOP; DBMS_OUTPUT.put_line('Normal Insert : ' || (DBMS_UTILITY.get_time - l_start)); l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP INSERT INTO tde_test_2 (id, data) VALUES (i, 'Data for ' || i); END LOOP; DBMS_OUTPUT.put_line('Encrypted Insert: ' || (DBMS_UTILITY.get_time - l_start)); l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP SELECT data INTO l_data FROM tde_test_1 WHERE id = i; END LOOP; DBMS_OUTPUT.put_line('Normal Query : ' || (DBMS_UTILITY.get_time - l_start)); l_start := DBMS_UTILITY.get_time; FOR i IN 1 .. l_loops LOOP SELECT data INTO l_data FROM tde_test_2 WHERE id = i; END LOOP; DBMS_OUTPUT.put_line('Decrypted Query : ' || (DBMS_UTILITY.get_time - l_start)); END; / Normal Insert : 31 Encrypted Insert: 45 Normal Query : 42 Decrypted Query : 58 PL/SQL procedure successfully completed. SQL>
Kết quả cho chúng ta thấy việc dữ liệu insert vào được mã hóa chậm hơn so với insert thông thường, tương tự như vậy với query cũng chậm hơn.
Bảng ngoài
Bảng ngoài được mã hóa tương tự như bảng thông thường.
CONN sys/password AS SYSDBA GRANT READ, WRITE ON DIRECTORY data_pump_dir TO test;
Tạo bảng ngoài và copy vào bảng trong dùng mệnh đềe ENCRYPT
CONN test/test CREATE TABLE tde_test_1_ext ( id, data ENCRYPT IDENTIFIED BY "oracle" ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY data_pump_dir location ('tde_test_1_ext.dmp') ) AS SELECT id, data FROM tde_test_1;
Các view truy vấn thông tin
View %_ENCRYPTED_COLUMNS
sẽ hiển thị thông tin về cột đã mã hóa:
SET LINESIZE 100 COLUMN owner FORMAT A15 COLUMN tble_name FORMAT A15 COLUMN column_name FORMAT A15 SELECT * FROM dba_encrypted_columns; OWNER TABLE_NAME COLUMN_NAME ENCRYPTION_ALG SAL --------------- ------------------------------ --------------- ----------------------------- --- TEST TDE_TEST_2 DATA AES 192 bits key YES TEST TDE_TEST_1_EXT DATA AES 192 bits key YES 2 rows selected. SQL>
Cập nhật từ 12c
Oracle database 12c giới thiệu cách mới để quản lý keystore, key mã hóa và bí mật sử dụng lệnh ADMINISTER KEY MANAGEMENT
. Thay vì dùng lệnh ALTER SYSTEM SET ENCRYPTION KEY
và ALTER SYSTEM SET ENCRYPTION WALLET để quản trị key và ví ở các phiên bản trước.
Tham khảo thêm:
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty