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.