Trong phần đầu tiên của loạt bài này, chúng tôi đã đề cập đến cấu hình mã hóa trong quá trình truyền cho các máy chủ sao chép MariaDB, nơi chúng tôi đã định cấu hình mã hóa máy khách và máy chủ nhân rộng. Được lấy từ bài đăng đầu tiên, nơi chúng tôi đã định cấu hình một phần mã hóa đầy đủ của mình (như được chỉ ra bởi các mũi tên màu xanh lá cây ở bên trái trong biểu đồ) và trong bài đăng blog này, chúng tôi sẽ hoàn thành thiết lập mã hóa với mã hóa không nghỉ để tạo thiết lập sao chép MariaDB được mã hóa hoàn toàn.
Sơ đồ sau minh họa thiết lập hiện tại của chúng tôi và thiết lập cuối cùng mà chúng tôi sẽ đạt được:
Mã hóa At-Rest
Mã hóa lúc nghỉ có nghĩa là dữ liệu ở trạng thái nghỉ như tệp dữ liệu và nhật ký được mã hóa trên đĩa, khiến ai đó hầu như không thể truy cập hoặc đánh cắp đĩa cứng và truy cập vào dữ liệu gốc (với điều kiện là khóa được bảo mật và không được lưu trữ cục bộ). Mã hóa dữ liệu tại chỗ, còn được gọi là Mã hóa dữ liệu minh bạch (TDE), được hỗ trợ trong MariaDB 10.1 trở lên. Lưu ý rằng việc sử dụng mã hóa có chi phí khoảng 5-10%, tùy thuộc vào khối lượng công việc và loại cụm.
Đối với MariaDB, các thành phần MariaDB sau có thể được mã hóa ở trạng thái nghỉ:
- Tệp dữ liệu InnoDB (vùng bảng dùng chung hoặc vùng bảng riêng lẻ, ví dụ:* .ibd và ibdata1)
- Dữ liệu Aria và các tệp chỉ mục.
- Hoàn tác / làm lại nhật ký (tệp nhật ký InnoDB, ví dụ:ib_logfile0 và ib_logfile1).
- Nhật ký nhị phân / chuyển tiếp.
- Các tệp và bảng tạm thời.
Hiện không thể mã hóa các tệp sau:
- Tệp siêu dữ liệu (ví dụ:tệp .frm).
- Nhật ký chung dựa trên tệp / nhật ký truy vấn chậm. Nhật ký chung dựa trên bảng / nhật ký truy vấn chậm có thể được mã hóa.
- Nhật ký lỗi.
Mã hóa dữ liệu ở trạng thái nghỉ ngơi của MariaDB yêu cầu sử dụng plugin mã hóa và quản lý khóa. Trong bài đăng trên blog này, chúng tôi sẽ sử dụng Trình cắm mã hóa quản lý khóa tệp, được cung cấp theo mặc định kể từ MariaDB 10.1.3. Lưu ý rằng có một số hạn chế khi sử dụng plugin này, ví dụ:khóa vẫn có thể được đọc bởi người dùng root và MySQL, như được giải thích trong trang Mã hóa dữ liệu tại chỗ của MariaDB.
Tạo Tệp Khoá
Hãy tạo một thư mục chuyên dụng để lưu trữ nội dung mã hóa an toàn của chúng ta:
$ mkdir -p /etc/mysql/rest
$ cd /etc/mysql/rest
Tạo tệp khóa. Đây là cốt lõi của mã hóa:
$ openssl rand -hex 32 > /etc/mysql/rest/keyfile
Nối chuỗi "1;" làm mã định danh khóa trong tệp khóa:
$ echo '1;'
sed -i '1s/^/1;/' /etc/mysql/rest/keyfile
Do đó, khi đọc keyfile, nó sẽ giống như sau:
$ cat /etc/mysql/rest/keyfile
1;4eb5770dcfa691bc634cbcd3c6bed9ed4ccd0111f3d3b1dae2c51a90fbf16ed7
Ở trên chỉ đơn giản là đối với mã định danh khóa 1, khóa là 4eb ... Tệp khóa cần chứa hai phần thông tin cho mỗi khóa mã hóa. Đầu tiên, mỗi khóa mã hóa cần được xác định bằng số nguyên 32 bit làm mã định danh khóa. Thứ hai, bản thân khóa mã hóa cần được cung cấp ở dạng mã hóa hex. Hai phần thông tin này cần được phân tách bằng dấu chấm phẩy.
Tạo mật khẩu để mã hóa khóa trên. Ở đây chúng tôi sẽ lưu trữ mật khẩu bên trong một tệp có tên "keyfile.passwd":
$ echo -n 'mySuperStrongPassword' > /etc/mysql/rest/keyfile.passwd
Bạn có thể bỏ qua bước trên nếu bạn muốn chỉ định mật khẩu trực tiếp trong tệp cấu hình bằng tùy chọn file_key_management_filekey. Ví dụ:file_key_management_filekey =mySuperStrongPassword
Nhưng trong ví dụ này, chúng ta sẽ đọc mật khẩu được lưu trữ trong một tệp, do đó sau này chúng ta phải xác định dòng sau trong tệp cấu hình:
file_key_management_filekey=FILE:/etc/mysql/encryption/keyfile.passwd
Chúng tôi sẽ mã hóa tệp keyfile văn bản rõ ràng thành một tệp khác có tên là keyfile.enc, sử dụng mật khẩu bên trong tệp mật khẩu:
$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/rest/keyfile.passwd -in /etc/mysql/rest/keyfile -out /etc/mysql/rest/keyfile.enc
Khi liệt kê ra thư mục, chúng ta sẽ thấy 3 tệp sau:
$ ls -1 /etc/mysql/rest/
keyfile
keyfile.enc
keyfile.passwd
Nội dung của keyfile.enc chỉ là một phiên bản mã hóa của keyfile:
Để kiểm tra, chúng tôi có thể giải mã tệp được mã hóa bằng OpenSSL bằng cách cung cấp tệp mật khẩu (keyfile.passwd):
$ openssl aes-256-cbc -d -md sha1 -pass file:/etc/mysql/rest/keyfile.passwd -in /etc/mysql/rest/keyfile.enc
1;4eb5770dcfa691bc634cbcd3c6bed9ed4ccd0111f3d3b1dae2c51a90fbf16ed7
Sau đó, chúng tôi có thể xóa khóa thuần túy vì chúng tôi sẽ sử dụng khóa được mã hóa (.enc) cùng với tệp mật khẩu:
$ rm -f /etc/mysql/encryption/keyfile
Bây giờ chúng ta có thể tiến hành định cấu hình mã hóa MariaDB ở trạng thái nghỉ.
Định cấu hình Mã hóa At-Rest
Chúng ta phải di chuyển tệp khóa được mã hóa và mật khẩu đến các nô lệ sẽ được MariaDB sử dụng để mã hóa / giải mã dữ liệu. Nếu không, một bảng được mã hóa đang được sao lưu từ chính bằng cách sử dụng sao lưu vật lý như MariaDB Backup sẽ gặp sự cố khi đọc bởi các nô lệ (do tổ hợp khóa / mật khẩu khác nhau). Sao lưu logic như mysqldump sẽ hoạt động với các khóa và mật khẩu khác nhau.
Trên nô lệ, hãy tạo một thư mục để lưu trữ nội dung mã hóa ở trạng thái nghỉ:
(slave1)$ mkdir -p /etc/mysql/rest
(slave2)$ mkdir -p /etc/mysql/rest
Trên trang cái, sao chép tệp keyfile và mật khẩu được mã hóa sang các tệp nô lệ khác:
(master)$ cd /etc/mysql/rest
(master)$ scp keyfile.enc keyfile.passwd [email protected]:/etc/mysql/rest/
(master)$ scp keyfile.enc keyfile.passwd [email protected]:/etc/mysql/rest/
Bảo vệ tệp khỏi quyền truy cập toàn cầu và chỉ định người dùng "mysql" làm quyền sở hữu:
$ chown mysql:mysql /etc/mysql/rest/*
$ chmod 600 /etc/mysql/rest/*
Thêm phần sau vào tệp cấu hình MariaDB trong phần [mysqld] hoặc [mariadb]:
# at-rest encryption
plugin_load_add = file_key_management
file_key_management_filename = /etc/mysql/rest/keyfile.enc
file_key_management_filekey = FILE:/etc/mysql/rest/keyfile.passwd
file_key_management_encryption_algorithm = AES_CBC
innodb_encrypt_tables = ON
innodb_encrypt_temporary_tables = ON
innodb_encrypt_log = ON
innodb_encryption_threads = 4
innodb_encryption_rotate_key_age = 1
encrypt-tmp-disk-tables = 1
encrypt-tmp-files = 1
encrypt-binlog = 1
aria_encrypt_tables = ON
Lưu ý về biến file_key_management_filekey, nếu mật khẩu nằm trong một tệp, bạn phải đặt trước đường dẫn bằng "FILE:". Ngoài ra, bạn cũng có thể chỉ định trực tiếp chuỗi mật khẩu (không được khuyến nghị do tính dài dòng):
file_key_management_filekey=mySuperStrongPassword
Khởi động lại máy chủ MariaDB từng nút một, bắt đầu với nô lệ:
(slave1)$ systemctl restart mariadb
(slave2)$ systemctl restart mariadb
(master)$ systemctl restart mariadb
Quan sát nhật ký lỗi và đảm bảo mã hóa MariaDB được kích hoạt trong khi khởi động:
$ tail -f /var/log/mysql/mysqld.log
...
2019-12-17 6:44:47 0 [Note] InnoDB: Encrypting redo log: 2*67108864 bytes; LSN=143311
2019-12-17 6:44:48 0 [Note] InnoDB: Starting to delete and rewrite log files.
2019-12-17 6:44:48 0 [Note] InnoDB: Setting log file ./ib_logfile101 size to 67108864 bytes
2019-12-17 6:44:48 0 [Note] InnoDB: Setting log file ./ib_logfile1 size to 67108864 bytes
2019-12-17 6:44:48 0 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
2019-12-17 6:44:48 0 [Note] InnoDB: New log files created, LSN=143311
2019-12-17 6:44:48 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-12-17 6:44:48 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-12-17 6:44:48 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-12-17 6:44:48 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2019-12-17 6:44:48 0 [Note] InnoDB: Waiting for purge to start
2019-12-17 6:44:48 0 [Note] InnoDB: 10.4.11 started; log sequence number 143311; transaction id 222
2019-12-17 6:44:48 0 [Note] InnoDB: Creating #1 encryption thread id 139790011840256 total threads 4.
2019-12-17 6:44:48 0 [Note] InnoDB: Creating #2 encryption thread id 139790003447552 total threads 4.
2019-12-17 6:44:48 0 [Note] InnoDB: Creating #3 encryption thread id 139789995054848 total threads 4.
2019-12-17 6:44:48 0 [Note] InnoDB: Creating #4 encryption thread id 139789709866752 total threads 4.
2019-12-17 6:44:48 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2019-12-17 6:44:48 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-12-17 6:44:48 0 [Note] Using encryption key id 1 for temporary files
...
Bạn sẽ thấy các dòng cho biết quá trình khởi tạo mã hóa trong nhật ký lỗi. Tại thời điểm này, phần lớn cấu hình mã hóa đã hoàn tất.
Kiểm tra mã hóa của bạn
Tạo cơ sở dữ liệu thử nghiệm để kiểm tra trên bản chính:
(master)MariaDB> CREATE SCHEMA sbtest;
(master)MariaDB> USE sbtest;
Tạo một bảng tiêu chuẩn không có mã hóa và chèn một hàng:
MariaDB> CREATE TABLE tbl_plain (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255));
MariaDB> INSERT INTO tbl_plain SET data = 'test data';
Chúng tôi có thể thấy dữ liệu được lưu trữ ở dạng văn bản rõ ràng khi duyệt tệp dữ liệu InnoDB bằng công cụ hexdump:
$ xxd /var/lib/mysql/sbtest/tbl_plain.ibd | less
000c060: 0200 1c69 6e66 696d 756d 0002 000b 0000 ...infimum......
000c070: 7375 7072 656d 756d 0900 0000 10ff f180 supremum........
000c080: 0000 0100 0000 0000 0080 0000 0000 0000 ................
000c090: 7465 7374 2064 6174 6100 0000 0000 0000 test data.......
000c0a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
Tạo bảng được mã hóa và chèn một hàng:
MariaDB> CREATE TABLE tbl_enc (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255)) ENCRYPTED=YES;
MariaDB> INSERT INTO tbl_enc SET data = 'test data';
Chúng tôi không thể biết những gì được lưu trữ trong tệp dữ liệu InnoDB cho các bảng được mã hóa:
$ xxd /var/lib/mysql/sbtest/tbl_enc.ibd | less
000c060: 0c2c 93e4 652e 9736 e68a 8b69 39cb 6157 .,..e..6...i9.aW
000c070: 3cd1 581c 7eb9 84ca d792 7338 521f 0639 <.X.~.....s8R..9
000c080: d279 9eb3 d3f5 f9b0 eccb ed05 de16 f3ac .y..............
000c090: 6d58 5519 f776 8577 03a4 fa88 c507 1b31 mXU..v.w.......1
000c0a0: a06f 086f 28d9 ac17 8923 9412 d8a5 1215 .o.o(....#......
Lưu ý rằng tệp siêu dữ liệu tbl_enc.frm không được mã hóa ở trạng thái nghỉ. Chỉ tệp dữ liệu InnoDB (.ibd) được mã hóa.
Khi so sánh nhật ký chuyển tiếp hoặc nhị phân "thuần túy", chúng ta có thể thấy rõ nội dung của nó bằng cách sử dụng công cụ hexdump:
$ xxd binlog.000002 | less
0000560: 0800 0800 0800 0b04 726f 6f74 096c 6f63 ........root.loc
0000570: 616c 686f 7374 0047 5241 4e54 2052 454c alhost.GRANT REL
0000580: 4f41 442c 4c4f 434b 2054 4142 4c45 532c OAD,LOCK TABLES,
0000590: 5245 504c 4943 4154 494f 4e20 434c 4945 REPLICATION CLIE
00005a0: 4e54 2c45 5645 4e54 2c43 5245 4154 4520 NT,EVENT,CREATE
00005b0: 5441 424c 4553 5041 4345 2c50 524f 4345 TABLESPACE,PROCE
00005c0: 5353 2c43 5245 4154 452c 494e 5345 5254 SS,CREATE,INSERT
00005d0: 2c53 454c 4543 542c 5355 5045 522c 5348 ,SELECT,SUPER,SH
00005e0: 4f57 2056 4945 5720 4f4e 202a 2e2a 2054 OW VIEW ON *.* T
Trong khi đối với nhật ký nhị phân được mã hóa, nội dung trông vô nghĩa:
$ xxd binlog.000004 | less
0000280: 4a1d 1ced 2f1b db50 016a e1e9 1351 84ba J.../..P.j...Q..
0000290: 38b6 72e7 8743 7713 afc3 eecb c36c 1b19 8.r..Cw......l..
00002a0: 7b3f 6176 208f 0000 00dc 85bf 6768 e7c6 {?av .......gh..
00002b0: 6107 5bea 241c db12 d50c 3573 48e5 3c3d a.[.$.....5sH.<=
00002c0: 3179 1653 2449 d408 1113 3e25 d165 c95b 1y.S$I....>%.e.[
00002d0: afb0 6778 4b26 f672 1bc7 567e da96 13f5 ..gxK&.r..V~....
00002e0: 2ac5 b026 3fb9 4b7a 3ef4 ab47 6c9f a686 *..&?.Kz>..Gl...
Mã hóa Bảng Aria
Đối với công cụ lưu trữ Aria, nó không hỗ trợ tùy chọn ENCRYPTED trong câu lệnh CREATE / ALTER vì nó tuân theo tùy chọn chung aria_encrypt_tables. Do đó, khi tạo bảng Aria, chỉ cần tạo bảng với tùy chọn ENGINE =Aria:
MariaDB> CREATE TABLE tbl_aria_enc (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255)) ENGINE=Aria;
MariaDB> INSERT INTO tbl_aria_enc(data) VALUES ('test data');
MariaDB> FLUSH TABLE tbl_aria_enc;
Sau đó, chúng tôi có thể xác minh nội dung của tệp dữ liệu của bảng (tbl_aria_enc.MAD) hoặc tệp chỉ mục (tbl_aria_enc.MAI) bằng công cụ hexdump. Để mã hóa bảng Aria hiện có, bảng cần được tạo lại:
MariaDB> ALTER TABLE db.aria_table ENGINE=Aria ROW_FORMAT=PAGE;
Câu lệnh này khiến Aria xây dựng lại bảng bằng cách sử dụng tùy chọn bảng ROW_FORMAT. Trong quá trình này, với cài đặt mặc định mới, nó sẽ mã hóa bảng khi ghi vào đĩa.
Mã hóa Nhật ký Chung / Nhật ký Truy vấn Chậm
Để mã hóa nhật ký truy vấn chung và chậm, chúng tôi có thể đặt tùy chọn MariaDB log_output thành 'TABLE' thay vì 'FILE' mặc định:
MariaDB> SET GLOBAL log_ouput = 'TABLE';
Tuy nhiên, MariaDB theo mặc định sẽ tạo các bảng cần thiết bằng công cụ lưu trữ CSV, không được mã hóa bởi MariaDB. Không có công cụ nào khác ngoài CSV, MyISAM hoặc Aria là hợp pháp cho các bảng nhật ký. Mẹo là xây dựng lại bảng CSV mặc định bằng công cụ lưu trữ Aria, với điều kiện là tùy chọn aria_encrypt_tables được đặt thành BẬT. Tuy nhiên, tùy chọn nhật ký tương ứng phải được tắt để thay đổi bảng thành công.
Vì vậy, các bước để mã hóa bảng nhật ký chung là:
MariaDB> SET GLOBAL general_log = OFF;
MariaDB> ALTER TABLE mysql.general_log ENGINE=Aria;
MariaDB> SET GLOBAL general_log = ON;
Tương tự, đối với nhật ký truy vấn chậm:
MariaDB> SET GLOBAL slow_query_log = OFF;
MariaDB> ALTER TABLE mysql.slow_log ENGINE=Aria;
MariaDB> SET GLOBAL slow_query_log = ON;
Xác minh đầu ra của nhật ký chung trong máy chủ:
MariaDB> SELECT * FROM mysql.general_log;
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------+
| event_time | user_host | thread_id | server_id | command_type | argument |
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------+
| 2019-12-17 07:45:53.109558 | root[root] @ localhost [] | 19 | 28001 | Query | select * from sbtest.tbl_enc |
| 2019-12-17 07:45:55.504710 | root[root] @ localhost [] | 20 | 28001 | Query | select * from general_log |
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------+
Cũng như nội dung được mã hóa của tệp dữ liệu Aria bên trong thư mục dữ liệu bằng công cụ hexdump:
$ xxd /var/lib/mysql/mysql/general_log.MAD | less
0002040: 1d45 820d 7c53 216c 3fc6 98a6 356e 1b9e .E..|S!l?...5n..
0002050: 6bfc e193 7509 1fa7 31e2 e22a 8f06 3c6f k...u...1..*..<o
0002060: ae71 bb63 e81b 0b08 7120 0c99 9f82 7c33 .q.c....q ....|3
0002070: 1117 bc02 30c1 d9a7 c732 c75f 32a6 e238 ....0....2._2..8
0002080: d1c8 5d6f 9a08 455a 8363 b4f4 5176 f8a1 ..]o..EZ.c..Qv..
0002090: 1bf8 113c 9762 3504 737e 917b f260 f88c ...<.b5.s~.{.`..
00020a0: 368e 336f 9055 f645 b636 c5c1 debe fbe7 6.3o.U.E.6......
00020b0: d01e 028f 8b75 b368 0ef0 8889 bb63 e032 .....u.h.....c.2
Mã hóa MariaDB at-rest hiện đã hoàn tất. Kết hợp điều này với mã hóa trong quá trình chuyển tiếp mà chúng tôi đã thực hiện trong bài đăng đầu tiên, kiến trúc cuối cùng của chúng tôi bây giờ trông giống như sau:
Kết luận
Giờ đây, bạn có thể bảo mật hoàn toàn cơ sở dữ liệu MariaDB của mình thông qua mã hóa để bảo vệ chống lại hành vi vi phạm hoặc trộm cắp vật lý và ảo. ClusterControl cũng có thể giúp bạn duy trì loại bảo mật này và bạn có thể tải xuống miễn phí tại đây.