Thứ Tư, 31 tháng 7, 2019

Transparent Data Encryption (TDE) oracle

 

Mã hóa dữ liệu không cần sử dụng dòng lệnh code

Đây là cơn ác mộng tồi tệ nhất của các tổ chức: Bị ăn cắp dữ liệu lưu trữ của cơ sở dữ liệu. Chắc chắn rằng bạn đã xây dựng 1 hệ thống an ninh, mã hóa hầu hết dữ liệu, và xây dựng 1 tường lửa xung quanh cơ sở dữ liệu trong máy chủ. Nhưng những tên trộm vẫn dễ dàng tiếp cận: chúng lấy dữ liệu lưu trữ, phát sinh dữ liệu của bạn trên 1 máy chủ khác, khởi động dữ liệu và chuyển dữ liệu thành của chính chúng. Bảo vệ cơ sở dữ liệu khỏi những tên trộm không chỉ là 1 bài tập, nó là 1 yêu cầu cấp thiết với hầu hết luật lệ, quy định và hướng dẫn. Làm cách nào để bảo vệ dữ liệu khỏi mối nguy hại này ?
Một giải pháp là mã hóa ẩn dữ liệu và lưu trữ khóa giải mã trong 1 khu vực khác. Nếu không có mã khóa, không thể ăn cắp dữ liệu. Tuy nhiên, bạn phải phối hợp 2 điều kiện trái ngược: ứng dụng có thể truy xuất khóa mã hóa 1 cách tiện lợi, và yêu cầu bảo mật ngăn cấm những tên trộm khóa. Và theo chỉ thị của công ty, bạn cần 1 giải pháp ngay lập tức, mà không cần bất cứ 1 bước code nào.
Một chức năng mới trong Oracle Database 10g Release 2 có thể giúp bạn làm điều đó: bạn có thể khai báo 1 cột được mã hóa mà không cần viết 1 dòng code nào. Khi người dùng thêm dữ liệu, cơ sở dữ liệu mã hóa ẩn nó đi và lưu trữ nó vào trong cột này. Tương tự, khi người dùng lấy dữ liệu của 1 cột, cơ sở dữ liệu tự động giải mã nó. Tất cả những điều đó được làm mà không hề thay đổi code của ứng dụng, chức năng này mang tên: Mã hóa dữ liệu – Tranparent Database Encryption (TDE)


Cách thức hoạt động



Tất cả những gì bạn phải làm là xác định 1 cột thuộc tính cần được mã hóa, và Oracle Database 10g tạo ra một khóa mật mã cho bảng chứa đựng thuộc tính và mã hóa toàn bộ dữ liệu trong thuộc tính đó,  bằng cách sử dụng thuật toán mã hóa mà bạn đã chỉ định. Việc bảo vệ khóa mật mã của bảng là vô cùng quan trọng, Oracle Database 10g mã hóa nó bằng 1 khóa chủ và khóa này được lưu trữ trong 1 khu vực bảo mật gọi là wallet, có thể là 1 file trong cơ sở dữ liệu của máy chủ. Khóa mật mã của bảng nằm trong từ điển dữ liệu. Khi người dùng nhập dữ liệu vào thuộc tính được mã hóa, Oracle Database 10g sẽ lấy khóa chủ từ wallet, giải mã để lấy khóa mã hóa từ điển dữ liệu, sử dụng khóa mã hóa đó trên dữ liệu đầu vào, và lưu trữ dữ liệu đã được mã hóa trong cơ sở dữ liệu.

TDE sử dụng kiến trúc mã hóa 2 lớp:
  • Table key/Tablespace key: table key dùng để mã hóa column trong table, được lưu trong dictionary. Tablespace key dùng để mã hóa tablespace, được lưu trong datafile header
  • Master encryption key: dùng để mã hóa table key/tablespace key. Master key được lưu bên ngoài db, có thể ở trong Oracle Wallet, hay lưu ở HSM

Cấu hình TDE

Đầu tiên ta cần 1 thư mục để làm wallet. Ta tạo thư mục trên OS và cấu hình thêm nội dung ENCRYPTION_WALLET_LOCATION vào file sqlnet.ora

ENCRYPTION_WALLET_LOCATION =
 (SOURCE=
   (METHOD=file)
     (METHOD_DATA=
       (DIRECTORY=/home/oracle/wallet )))


Tạo wallet với password bảo vệ

sql>alter system set encryption key identified by "walletPassword123456"

Trong thư mục wallet, 1 file ewallet.p12 được tạo ra, lưu giữ master key. Wallet sẽ được open ngay khi tạo xong

Kiểm tra wallet
sql>select * from v$encryption_wallet;

Cấu hình auto login

Nếu không cấu hình auto login, khi shutdown database và start lại, ta phải tự open wallet, nếu không dữ liệu mã hóa sẽ không truy cập được.
sql>alter system set encryption wallet open identified by "walletPassword123456";
Cấu hình auto login giúp wallet luôn được open. Ta sử dụng orapki để cấu hình auto login. 1 file cwallet.sso sẽ được tạo ra trong thư mục
sql>orapki wallet create -wallet /home/oracle/wallet -auto_login

Close wallet

sql>alter system set encryption wallet close identified by "walletPassword123456";


Thuộc tính mã hóa
Để mã hóa thuộc tính sử dụng TDE, tất cả những gì bạn cần làm là thêm vào 1 mệnh đề đơn giản —ENCRYPT— để định nghĩa thuộc tính. Tuy nhiên, trước khi bạn làm điều đó, bạn phải quyết định loại mã hóa và độ dài khóa sử dụng.  


Trên 1 lược đồ, bạn có 1 bảng tài khoản như sau:

ACC_NO      NUMBER
ACC_NAME    VARCHAR2(30)
SSN         VARCHAR2(9)

Thông thường, bảng này có tất cả dữ liệu dạng text. Bạn muốn chuyển đổi thuộc tính SSN (Social Security Number) lưu trữ dạng mã hóa. Bạn có thể đưa lệnh:

sql>alter table accounts modify (ssn encrypt);

Dòng lệnh này làm 2 việc:
  • Tạo một khóa mã hóa cho bảng. Nếu bạn thay đổi, muốn mã hóa 1 thuộc tính khác, khóa mã hóa của bảng vẫn sử dụng được.
  • Chuyển tất cả giá trị trong thuộc tính đó thành dạng mã hóa


Mặc định, thuật toán AES với khóa 192-bit được dùng để mã hóa. Bạn cũng có thể chọn 1 thuật toán khác bằng cách xác định mệnh đề điều kiện chính xác trong dòng lệnh. Chẳng hạn dùng mã hóa AES 128-bit, bạn có thể sử dụng:

sql>alter table accounts modify (ssn encrypt using 'AES128');

Bạn có thể dùng AES128, AES192, AES256, hay 3DES168 (thuật toán DES 168-bit Triple) như mệnh đề. Những giá trị này có thể tự giải thích về nó, chẳng hạn: AES256 là đại diện cho thuật toán Advanced Encryption Standard với khóa 256-bit.

Vì việc mã hóa và giải mã tiêu tốn chu kỳ CPU, bạn phải nghĩ đến ảnh hưởng của chúng trong việc thực thi. Khi bạn truy cập những thuộc tính không mã hóa của bảng, việc thực thi không khác gì nhiều so với bảng không dùng TDE. Tuy nhiên, khi bạn truy cập các thuộc tính được mã hóa, có một bộ xử lý thông tin phụ cho việc giải mã trong khi truy vấn, mã hóa trong khi thêm dữ liệu, để bạn có thể mã hóa các thuộc tính được chọn. Nếu bạn không còn cần mã hóa 1 thuộc tính, bạn có thể tắt nó đi theo bước sau:

sql>alter table account modify (ssn decrypt);
 
Việc mã hóa là tất cả về ẩn dữ liệu, nhưng thỉnh thoảng rất dễ để đoán được dữ liệu mã hóa nếu có sự lặp lại trong giá trị của dữ liệu gốc. Chẳng hạn, bảng thông tin lương nhân viên có thể chứa đựng những giá trị lặp lại. Trong truờng hợp đó, giá trị mã hóa sẽ tương tự, và 1 người xâm phạm có thể nhận ra tất cả những bộ có cùng mức lương. Để tránh sự cố này, một chút “muối” được thêm vào dữ liệu để làm cho dữ liệu mã hóa khác đi cho dù dữ liệu đầu vào giống nhau. Mặc định TDE có thêm “muối”


Tuy nhiên, nếu bạn tạo 1 chỉ mục trên 1 thuộc tính mã hóa, bạn không thể thêm “muối” vào nó. Ví dụ, để xóa bỏ “muối” khỏi thuộc tính SSN, thực thi như sau:

sql>alter table accounts modify (ssn encrypt no salt);

Bảo vệ dữ liệu của bạn khỏi tấn công và tuân theo vô số điều luật là điều không hề tầm thường. TDE giúp bạn cung cấp dữ liệu mã hóa đáp ứng yêu cầu mà không cần code và quản lý khóa phức tạp, từ đó bạn có thể tập trung vào những mục tiêu khác chiến lược hơn.