Thứ Tư, 4 tháng 5, 2022

Transparent Data Encryption (TDE) trong Oracle 10g Database Release 2

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)

Nội dung:
  • 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:

  1. Nếu có, vị trí được chỉ định bởi tham số ENCRYPTION_WALLET_LOCATION trong tệp sqlnet.ora.
  2. Nếu có, vị trí được chỉ định bởi tham số WALLET_LOCATION trong tệp sqlnet.ora.
  3. 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:

Hy vọng hữu ích cho bạn.
=============================
* 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

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master