MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Khái niệm cơ bản về mã hóa cơ sở dữ liệu máy chủ MariaDB

Mã hóa là một trong những tính năng bảo mật quan trọng nhất để giữ cho dữ liệu của bạn an toàn nhất có thể. Tùy thuộc vào dữ liệu mà bạn đang xử lý, không phải lúc nào cũng bắt buộc nhưng dù sao thì ít nhất bạn cũng nên coi đó là một cải tiến bảo mật trong tổ chức của mình và nó thực sự được khuyến khích để tránh bị đánh cắp dữ liệu hoặc truy cập trái phép.

Trong blog này, chúng tôi sẽ mô tả hai kiểu mã hóa cơ bản và cách định cấu hình nó trên Máy chủ MariaDB.

Mã hóa Dữ liệu là gì?

Có hai kiểu mã hóa dữ liệu cơ bản:tại chế độ nghỉ và khi chuyển tiếp. Hãy xem ý nghĩa của chúng.

Mã hóa dữ liệu lúc còn lại

Dữ liệu được lưu trữ trong hệ thống được gọi là data-at-rest. Việc mã hóa dữ liệu này bao gồm việc sử dụng một thuật toán để chuyển đổi văn bản hoặc mã thành không thể đọc được. Bạn phải có khóa mã hóa để giải mã dữ liệu đã mã hóa.

Việc mã hóa toàn bộ cơ sở dữ liệu nên được thực hiện một cách thận trọng vì nó có thể dẫn đến tác động nghiêm trọng đến hiệu suất. Do đó, điều khôn ngoan là chỉ mã hóa các trường hoặc bảng riêng lẻ.

Mã hóa data-at-rest bảo vệ dữ liệu khỏi bị đánh cắp vật lý đối với ổ cứng hoặc truy cập lưu trữ tệp trái phép. Mã hóa này cũng tuân thủ các quy định về bảo mật dữ liệu, đặc biệt nếu có dữ liệu tài chính hoặc sức khỏe được lưu trữ trên hệ thống tệp.

Mã hóa dữ liệu trong quá trình chuyển đổi

Dữ liệu được truyền hoặc di chuyển giữa các giao dịch được gọi là dữ liệu đang chuyển. Dữ liệu di chuyển giữa máy chủ và máy khách trong khi duyệt các trang web là một ví dụ điển hình về loại dữ liệu này.

Vì nó luôn di chuyển, nó cần được bảo vệ bằng mã hóa thích hợp để tránh bất kỳ hành vi trộm cắp hoặc thay đổi dữ liệu nào trước khi đến đích.

Tình huống lý tưởng để bảo vệ dữ liệu khi truyền dữ liệu là dữ liệu được mã hóa trước khi di chuyển và chỉ được giải mã khi đến đích cuối cùng.

Mã hóa dữ liệu lúc phục hồi của MariaDB

Mã hóa bảng và không gian bảng đã được thêm vào MariaDB từ phiên bản 10.1 và nó hỗ trợ mã hóa cho các công cụ lưu trữ XtraDB, InnoDB và Aria cũng như các bản ghi nhị phân.

Bạn có thể chọn các cách mã hóa khác nhau:

  • Tất cả các bảng
  • Bảng cá nhân
  • Mọi thứ, trừ các bảng riêng lẻ

Theo tài liệu, việc sử dụng mã hóa có chi phí khoảng 3-5%, vì vậy điều quan trọng là phải có một môi trường thử nghiệm để nhấn mạnh nó và xem nó phản ứng như thế nào, để tránh các vấn đề trong quá trình sản xuất.

Cách định cấu hình mã hóa dữ liệu lúc khôi phục trên MariaDB

Hãy kiểm tra bảng "thành phố" hiện có trong cơ sở dữ liệu MariaDB:

$ strings city.ibd |head

infimum

supremum

infimum

supremum

3ABW

3KHM

infimum

supremum

Kabul                              AFGKabol

Qandahar                           AFGQandahar

Như bạn thấy, bạn có thể đọc dữ liệu từ đó mà không gặp vấn đề gì bằng cách sử dụng lệnh string Linux chẳng hạn. Bây giờ, hãy xem cách mã hóa nó.

Tạo khóa mã hóa bằng lệnh openssl rand:

$ mkdir -p /etc/mysql/encryption

$ for i in {1..4}; do openssl rand -hex 32 >> /etc/mysql/encryption/keyfile;  done;

Chỉnh sửa tệp được tạo / etc / mysql / crypt / keyfile và thêm các ID khóa sẽ được tham chiếu khi tạo bảng được mã hóa. Định dạng phải như sau:

<encryption_key_id1>;<hex-encoded_encryption_key1>

<encryption_key_id2>;<hex-encoded_encryption_key2>

Bạn có thể chỉnh sửa nó bằng cách sử dụng lệnh sed linux theo cách này:

$ for i in {1..4}; do sed -i -e "$i s/^/$i;/" keyfile; done

Vì vậy, tệp phải có dạng như sau:

$ cat /etc/mysql/encryption/keyfile

1;f237fe72e16206c0b0f6f43c3b3f4accc242564d77f5fe17bb621de388c193af

2;0c0819a10fb366a5ea657a71759ee6a950ae8f25a5ba7400a91f59b63683edc5

3;ac9ea3a839596dbf52492d9ab6b180bf11a35f44995b2ed752c370d920a10169

4;72afc936e16a8df05cf994c7902e588de0d11ca7301f9715d00930aa7d5ff8ab

Bây giờ, tạo mật khẩu ngẫu nhiên bằng lệnh openssl tương tự mà bạn đã thấy trước đó:

$ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key

Trước khi tiếp tục bước tiếp theo, điều quan trọng là phải biết các chi tiết sau về mã hóa tệp khóa:

  • Thuật toán duy nhất mà MariaDB hiện hỗ trợ để mã hóa tệp khóa là chế độ Cipher Block Chaining (CBC) của Advanced Encryption Standard (AES).
  • Kích thước khóa mã hóa có thể là 128 bit, 192 bit hoặc 256 bit.
  • Khóa mã hóa được tạo từ hàm băm SHA-1 của mật khẩu mã hóa.
  • Mật khẩu mã hóa có độ dài tối đa là 256 ký tự.

Bây giờ, để mã hóa tệp khóa bằng lệnh mã openssl, hãy chạy lệnh sau:

$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc

Cuối cùng, bạn cần thêm các tham số sau vào tệp cấu hình my.cnf của mình (nằm trong / etc / trên Hệ điều hành dựa trên RedHat hoặc / etc / mysql / trên Hệ điều hành dựa trên Debian):

[mysqld]

…

#################### DATABASE ENCRYPTION ####################

plugin_load_add = file_key_management

file_key_management_filename = /etc/mysql/encryption/keyfile.enc

file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key

file_key_management_encryption_algorithm = aes_cbc

encrypt_binlog = 1



innodb_encrypt_tables = ON

innodb_encrypt_log = ON

innodb_encryption_threads = 4

innodb_encryption_rotate_key_age = 0 

…

Và khởi động lại dịch vụ MariaDB để thực hiện các thay đổi:

$ systemctl restart mariadb

Tại thời điểm này, mọi thứ đã sẵn sàng để sử dụng tính năng mã hóa. Hãy mã hóa cùng một bảng mà chúng tôi đã hiển thị trước đó, “thành phố”. Đối với điều này, bạn cần sử dụng câu lệnh ALTER TABLE thiết lập tham số ENCRYPTED trong YES:

MariaDB [world]> ALTER TABLE city ENCRYPTED=YES;

Query OK, 0 rows affected (0.483 sec)

Records: 0  Duplicates: 0  Warnings: 0

Bây giờ, nếu bạn cố gắng truy cập bảng trực tiếp từ hệ thống tệp, bạn sẽ thấy như sau:

$ strings city.ibd |head

PU%O

!ybN)b

9,{9WB4

T3uG:

?oiN

,35sz

8g)Q

o(o

q_A1

k=-w

Như bạn thấy, bảng này không thể đọc được. Bạn cũng có thể chỉ định ID khóa mã hóa bằng cách thêm tham số ENCRYPTION_KEY_ID = trong lệnh MySQL, trong đó là số ID từ tệp khóa đã tạo trước đó.

Các bảng mới sẽ được mã hóa theo mặc định khi chúng tôi đặt thông số innodb_encrypt_tables thành BẬT trong tệp cấu hình my.cnf.

Mã hóa dữ liệu trong quá trình truyền dữ liệu MariaDB

MariaDB cho phép bạn mã hóa dữ liệu truyền giữa máy chủ và máy khách bằng giao thức Bảo mật lớp truyền tải (TLS), trước đây được gọi là Lớp cổng bảo mật hoặc SSL.

Trước hết, bạn cần đảm bảo rằng máy chủ MariaDB của bạn được biên dịch với hỗ trợ TLS. Bạn có thể xác minh điều này bằng cách chạy câu lệnh SHOW GLOBAL VARIABLES sau:

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'version_ssl_library';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |

+---------------------+----------------------------+

1 row in set (0.001 sec)

Và kiểm tra xem nó hiện không được sử dụng hay không bằng cách sử dụng câu lệnh SHOW VARIABLES:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| have_openssl        | YES                        |

| have_ssl            | DISABLED                   |

| ssl_ca              |                            |

| ssl_capath          |                            |

| ssl_cert            |                            |

| ssl_cipher          |                            |

| ssl_crl             |                            |

| ssl_crlpath         |                            |

| ssl_key             |                            |

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |

+---------------------+----------------------------+

10 rows in set (0.001 sec)

Bạn cũng có thể xác minh trạng thái SSL bằng lệnh MariaDB trạng thái:

MariaDB [(none)]> status

--------------

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id: 22

Current database:

Current user: [email protected]

SSL: Not in use

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server: MariaDB

Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset: latin1

Db     characterset: latin1

Client characterset: utf8

Conn.  characterset: utf8

UNIX socket: /var/lib/mysql/mysql.sock

Uptime: 4 hours 28 min 25 sec

Threads: 11  Questions: 111668  Slow queries: 0  Opens: 92  Flush tables: 1  Open tables: 85  Queries per second avg: 6.933

--------------

Cách định cấu hình mã hóa dữ liệu trong quá trình truyền tải trên MariaDB

Hãy tạo thư mục chứng chỉ để lưu trữ tất cả các chứng chỉ:

$ mkdir -p /etc/mysql/certs

Bây giờ, hãy tạo chứng chỉ CA sẽ được định cấu hình để mã hóa kết nối:

$ openssl genrsa 2048 > ca-key.pem

$ openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem

Lệnh cuối cùng này sẽ yêu cầu bạn điền đầy đủ thông tin sau:

Country Name (2 letter code) [AU]:

State or Province Name (full name) [Some-State]:

Locality Name (eg, city) []:

Organization Name (eg, company) [Internet Widgits Pty Ltd]:

Organizational Unit Name (eg, section) []:

Common Name (e.g. server FQDN or YOUR name) []:

Email Address []:

Bây giờ, bạn cần tạo chứng chỉ máy chủ:

$ openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem

Lệnh này sẽ yêu cầu bạn điền cùng một thông tin mà trước đó cộng với mật khẩu chứng chỉ tùy chọn.

$ openssl rsa -in server-key.pem -out server-key.pem

$ openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

Và cuối cùng, bạn cần tạo chứng chỉ ứng dụng khách:

$ openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem

Thao tác này cũng sẽ yêu cầu bạn điền đầy đủ thông tin và mật khẩu chứng chỉ tùy chọn.

$ openssl rsa -in client-key.pem -out client-key.pem

$ openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Đảm bảo rằng bạn đang sử dụng Tên chung khác nhau trên mỗi chứng chỉ, nếu không chứng chỉ sẽ không hoạt động và bạn sẽ nhận được thông báo như:

ERROR 2026 (HY000): SSL connection error: self signed certificate

Tại thời điểm này, bạn sẽ có một cái gì đó như sau:

$ ls /etc/mysql/certs/

ca-cert.pem  ca-key.pem  client-cert.pem  client-key.pem  client-req.pem  server-cert.pem  server-key.pem  server-req.pem

Và bạn có thể xác thực các chứng chỉ bằng lệnh sau:

$ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

server-cert.pem: OK

client-cert.pem: OK

Vậy bây giờ chúng ta hãy định cấu hình nó trong tệp cấu hình my.cnf (nằm trong / etc / trên Hệ điều hành dựa trên RedHat hoặc / etc / mysql / trên Hệ điều hành dựa trên Debian):

[mysqld]

ssl_ca=/etc/mysql/certs/ca-cert.pem

ssl_cert=/etc/mysql/certs/server-cert.pem

ssl_key=/etc/mysql/certs/server-key.pem



[client-mariadb]

ssl_ca =/etc/mysql/certs/ca-cert.pem

ssl_cert=/etc/mysql/certs/client-cert.pem

ssl_key=/etc/mysql/certs/client-key.pem

Đảm bảo rằng bạn đang thêm nó vào phần tương ứng (mysqld và client-mariadb).

Thay đổi chủ sở hữu chứng chỉ và khởi động lại dịch vụ cơ sở dữ liệu:

$ chown mysql.mysql /etc/mysql/certs/

$ systemctl restart mariadb

Sau đó, nếu bạn xem đầu ra HIỂN THỊ BIẾN TẦN, bạn sẽ có:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

+---------------------+----------------------------------+

| Variable_name       | Value                            |

+---------------------+----------------------------------+

| have_openssl        | YES                              |

| have_ssl            | YES                              |

| ssl_ca              | /etc/mysql/certs/ca-cert.pem     |

| ssl_capath          |                                  |

| ssl_cert            | /etc/mysql/certs/server-cert.pem |

| ssl_cipher          |                                  |

| ssl_crl             |                                  |

| ssl_crlpath         |                                  |

| ssl_key             | /etc/mysql/certs/server-key.pem  |

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018       |

+---------------------+----------------------------------+

10 rows in set (0.001 sec)

Bây giờ, hãy tạo người dùng với thông số YÊU CẦU SSL để sử dụng:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 's9s'@'%' IDENTIFIED BY 'root123' REQUIRE SSL;

Query OK, 0 rows affected (0.005 sec)

Nếu bạn sử dụng người dùng này để truy cập cơ sở dữ liệu và kiểm tra lệnh trạng thái, bạn sẽ thấy SSL đang được sử dụng:

MariaDB [(none)]> status

--------------

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id: 15

Current database:

Current user: [email protected]

SSL: Cipher in use is TLS_AES_256_GCM_SHA384

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server: MariaDB

Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution

Protocol version: 10

Connection: 127.0.0.1 via TCP/IP

Server characterset: latin1

Db     characterset: latin1

Client characterset: utf8

Conn.  characterset: utf8

TCP port: 3306

Uptime: 16 sec

Threads: 11  Questions: 136  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 8.500

--------------

Cách Bật Mã hóa SSL với ClusterControl

Một cách khác, và thậm chí là một cách dễ dàng hơn, để kích hoạt SSL trên cơ sở dữ liệu MariaDB của bạn là sử dụng ClusterControl. Chúng tôi sẽ cho rằng bạn đã cài đặt ClusterControl và bạn đang quản lý cơ sở dữ liệu MariaDB của mình bằng cách sử dụng nó, vì vậy hãy đi tới ClusterControl -> Chọn Cụm MariaDB của bạn -> Bảo mật -> Mã hóa SSL -> Bật.

Vậy là xong, bạn sẽ bật mã hóa SSL trong cơ sở dữ liệu MariaDB của mình mà không cần bất kỳ tác vụ thủ công nào.

Giới hạn Mã hóa At-Rest trong MariaDB

Có một số hạn chế liên quan đến mã hóa không nghỉ MariaDB cần tính đến:

  • Siêu dữ liệu (ví dụ:tệp .frm) và dữ liệu được gửi đến máy khách không được mã hóa.
  • Chỉ máy chủ MariaDB mới biết cách giải mã dữ liệu, cụ thể là
    • mysqlbinlog chỉ có thể đọc nhật ký nhị phân được mã hóa khi sử dụng --read-from-remote-server.
    • Percona XtraBackup không thể sao lưu các phiên bản sử dụng InnoDB được mã hóa. Tuy nhiên, Mariabackup có thể sao lưu các phiên bản được mã hóa.
  • Galera gcache dựa trên đĩa không được mã hóa trong phiên bản cộng đồng của Máy chủ MariaDB, tuy nhiên, tệp này được mã hóa trong Máy chủ doanh nghiệp MariaDB 10.4.
  • Plugin Kiểm tra không thể tạo đầu ra được mã hóa. Gửi nó đến nhật ký hệ thống và định cấu hình bảo vệ ở đó.
  • Không thể mã hóa nhật ký truy vấn chung dựa trên tệp và nhật ký truy vấn chậm.
  • Nhật ký Aria không được mã hóa. Điều này chỉ ảnh hưởng đến các bảng Aria không tạm thời.
  • Nhật ký lỗi MariaDB không được mã hóa. Nhật ký lỗi có thể chứa văn bản truy vấn và dữ liệu trong một số trường hợp, bao gồm sự cố, lỗi xác nhận và các trường hợp InnoDB / XtraDB ghi đầu ra theo dõi vào nhật ký để hỗ trợ gỡ lỗi. Nó cũng có thể được gửi đến nhật ký hệ thống nếu cần.

Kết luận

Bảo vệ dữ liệu khi truyền dữ liệu cũng quan trọng như bảo vệ dữ liệu ở trạng thái nghỉ và ngay cả khi nó không phải là điều bắt buộc trong tổ chức của bạn, bạn nên cân nhắc áp dụng nó vì nó có thể giúp bạn tránh được dữ liệu trộm cắp hoặc truy cập trái phép.

MariaDB có một cách khá dễ dàng để triển khai nó theo các bước đã đề cập trước đó, nhưng chắc chắn nó thậm chí còn dễ dàng hơn khi sử dụng ClusterControl.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách MID () hoạt động trong MariaDB

  2. MariaDB LCASE () Giải thích

  3. Đo điểm chuẩn Triển khai cơ sở dữ liệu thủ công so với Triển khai tự động

  4. Cách trả lại tên tháng và ngày bằng một ngôn ngữ khác trong MariaDB

  5. Cách CHAR_LENGTH () hoạt động trong MariaDB