Thứ sáu, 17/05/2019 | 00:00 GMT+7

Cách cấu hình SSL / TLS cho MySQL trên Ubuntu 18.04

MySQL là hệ quản trị database quan hệ nguồn mở phổ biến nhất trên thế giới. Mặc dù các trình quản lý gói hiện đại đã giảm bớt một số khó khăn trong việc chạy MySQL, nhưng vẫn còn một số cấu hình khác cần được thực hiện sau khi bạn cài đặt nó. Một trong những khía cạnh quan trọng nhất cần dành thêm thời gian là bảo mật.

Theo mặc định, MySQL được cấu hình để chỉ chấp nhận các kết nối local hoặc các kết nối bắt nguồn từ cùng một máy mà MySQL được cài đặt. Nếu bạn cần truy cập database MySQL của bạn từ xa , điều quan trọng là bạn phải làm như vậy một cách an toàn. Trong hướng dẫn này, ta sẽ trình bày cách cấu hình MySQL trên Ubuntu 18.04 để chấp nhận các kết nối từ xa với mã hóa SSL / TLS.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần :

  • Hai server Ubuntu 18.04. Ta sẽ sử dụng một trong những server này làm server MySQL trong khi ta sẽ sử dụng server kia làm client . Tạo user không phải root với quyền sudo và kích hoạt firewall với ufw trên mỗi server này. Làm theo hướng dẫn cài đặt server ban đầu Ubuntu 18.04 của ta để đưa cả hai server vào trạng thái ban đầu thích hợp.
  • Trên một trong các máy , cài đặt và cấu hình server MySQL. Làm theo các bước từ 1 đến 3 trong hướng dẫn cài đặt MySQL cho Ubuntu 18.04 của ta để thực hiện việc này. Khi bạn làm theo hướng dẫn này, hãy đảm bảo cấu hình user MySQL gốc của bạn để xác thực bằng password , như được mô tả trong Bước 3 của hướng dẫn, vì điều này là cần thiết để kết nối với MySQL bằng TCP thay vì socket Unix local .

Xin lưu ý trong suốt hướng dẫn này, server mà bạn đã cài đặt MySQL sẽ được gọi là server MySQL và bất kỳ lệnh nào sẽ được chạy trên máy này sẽ được hiển thị với nền màu xanh lam, như sau:

Tương tự, hướng dẫn này sẽ tham chiếu đến server khác là máy khách MySQL và bất kỳ lệnh nào phải chạy trên máy đó sẽ được hiển thị với nền màu đỏ:

Hãy ghi nhớ những điều này khi bạn làm theo hướng dẫn này để tránh bất kỳ sự nhầm lẫn nào.

Bước 1 - Kiểm tra Trạng thái SSL / TLS hiện tại của MySQL

Trước khi thực hiện bất kỳ thay đổi cấu hình nào, bạn có thể kiểm tra trạng thái SSL / TLS hiện tại trên version server MySQL .

Sử dụng lệnh sau để bắt đầu phiên MySQL với quyền là user MySQL gốc . Lệnh này bao gồm tùy chọn -p , lệnh này hướng dẫn mysql nhắc bạn nhập password để đăng nhập. Nó cũng bao gồm tùy chọn -h được sử dụng để chỉ định server lưu trữ để kết nối. Trong trường hợp này, nó trỏ nó đến 127.0.0.1 , giao diện lặp lại IPv4 còn gọi là localhost . Điều này sẽ buộc client kết nối với TCP thay vì sử dụng file socket local . MySQL cố gắng tạo kết nối thông qua tệp socket Unix theo mặc định. Điều này thường nhanh hơn và an toàn hơn, vì các kết nối này chỉ có thể được thực hiện local và không phải trải qua tất cả các hoạt động kiểm tra và định tuyến mà các kết nối TCP phải thực hiện. Tuy nhiên, kết nối với TCP cho phép ta kiểm tra trạng thái SSL của kết nối:

  • mysql -u root -p -h 127.0.0.1

Bạn sẽ được yêu cầu nhập password gốc MySQL mà bạn đã chọn khi cài đặt và cấu hình MySQL. Sau khi nhập nó, bạn sẽ được đưa vào một phiên MySQL tương tác.

Hiển thị trạng thái của các biến SSL / TLS đưa ra lệnh sau:

  • SHOW VARIABLES LIKE '%ssl%';
Output
+---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | | +---------------+----------+ 9 rows in set (0.01 sec)

Các have_opensslhave_ssl biến đều được đánh dấu là DISABLED . Điều này nghĩa là chức năng SSL đã được biên dịch vào server , nhưng nó vẫn chưa được kích hoạt.

Kiểm tra trạng thái kết nối hiện tại của bạn để xác nhận điều này:

  • \s
Output
-------------- mysql Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using EditLine wrapper Connection id: 9 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.26-0ubuntu0.18.04.1 (Ubuntu) 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: 40 min 11 sec Threads: 1 Questions: 33 Slow queries: 0 Opens: 113 Flush tables: 1 Open tables: 106 Queries per second avg: 0.013 --------------

Như kết quả ở trên cho biết, SSL hiện không được sử dụng cho kết nối này, mặc dù bạn đã kết nối qua TCP.

Đóng phiên MySQL hiện tại khi bạn kết thúc:

  • exit

Đến đây bạn đã xác nhận server MySQL của bạn không sử dụng SSL, bạn có thể chuyển sang bước tiếp theo, nơi bạn sẽ bắt đầu quá trình bật SSL bằng cách tạo một số certificate và khóa. Những điều này sẽ cho phép server và client của bạn giao tiếp với nhau một cách an toàn.

Bước 2 - Tạo khóa và certificate SSL / TLS

Để bật kết nối SSL với MySQL, trước tiên bạn cần tạo certificate và file khóa thích hợp. MySQL version 5.7 trở lên cung cấp một tiện ích được gọi là mysql_ssl_rsa_setup giúp đơn giản hóa quá trình này. Phiên bản MySQL bạn đã cài đặt theo hướng dẫn MySQL tiên quyết bao gồm tiện ích này, vì vậy ta sẽ sử dụng nó ở đây để tạo các file cần thiết.

Quy trình MySQL phải có thể đọc các file được tạo, vì vậy hãy sử dụng tùy chọn --uid để khai báo mysql là user hệ thống sở hữu các file được tạo:

  • sudo mysql_ssl_rsa_setup --uid=mysql

Điều này sẽ tạo ra kết quả giống như sau:

Output
Generating a 2048 bit RSA private key .+++ ..........+++ writing new private key to 'ca-key.pem' ----- Generating a 2048 bit RSA private key ........................................+++ ............+++ writing new private key to 'server-key.pem' ----- Generating a 2048 bit RSA private key .................................+++ ............................................................+++ writing new private key to 'client-key.pem' -----

Các file mới này sẽ được lưu trữ trong folder dữ liệu của MySQL, được đặt theo mặc định tại /var/lib/mysql . Kiểm tra các file đã tạo bằng lệnh :

  • sudo find /var/lib/mysql -name '*.pem' -ls
Output
258930 4 -rw-r--r-- 1 mysql mysql 1107 May 3 16:43 /var/lib/mysql/client-cert.pem 258919 4 -rw-r--r-- 1 mysql mysql 451 May 3 16:43 /var/lib/mysql/public_key.pem 258925 4 -rw------- 1 mysql mysql 1675 May 3 16:43 /var/lib/mysql/server-key.pem 258927 4 -rw-r--r-- 1 mysql mysql 1107 May 3 16:43 /var/lib/mysql/server-cert.pem 258922 4 -rw------- 1 mysql mysql 1675 May 3 16:43 /var/lib/mysql/ca-key.pem 258928 4 -rw------- 1 mysql mysql 1675 May 3 16:43 /var/lib/mysql/client-key.pem 258924 4 -rw-r--r-- 1 mysql mysql 1107 May 3 16:43 /var/lib/mysql/ca.pem 258918 4 -rw------- 1 mysql mysql 1679 May 3 16:43 /var/lib/mysql/private_key.pem

Các file này là cặp khóa và cặp certificate cho tổ chức phát hành certificate (bắt đầu bằng “ca”), quy trình server MySQL (bắt đầu bằng “ server ”) và cho client MySQL (bắt đầu bằng “máy khách”). Ngoài ra, các file private_key.pempublic_key.pem được MySQL sử dụng để chuyển password một cách an toàn khi không sử dụng SSL.

Đến đây bạn đã có certificate và file khóa cần thiết, hãy tiếp tục để cho phép sử dụng SSL trên version MySQL của bạn.

Bước 3 - Bật kết nối SSL trên server MySQL

Các version MySQL hiện đại tìm kiếm các file certificate thích hợp trong folder dữ liệu MySQL khi nào server khởi động. Do đó, bạn sẽ không cần phải sửa đổi cấu hình của MySQL để kích hoạt SSL.

Thay vào đó, hãy bật SSL bằng cách khởi động lại dịch vụ MySQL:

  • sudo systemctl restart mysql

Sau khi khởi động lại, hãy mở một phiên MySQL mới bằng lệnh tương tự như trước. Máy khách MySQL sẽ tự động cố gắng kết nối bằng SSL nếu nó được server hỗ trợ:

  • mysql -u root -p -h 127.0.0.1

Hãy cùng xem lại thông tin tương tự mà ta đã yêu cầu lần trước. Kiểm tra giá trị của các biến liên quan đến SSL:

  • SHOW VARIABLES LIKE '%ssl%';
Output
+---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | ca.pem | | ssl_capath | | | ssl_cert | server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | server-key.pem | +---------------+-----------------+ 9 rows in set (0.00 sec)

Các have_opensslhave_ssl biến hiện nay đọc YES thay vì DISABLED . Hơn nữa, các ssl_ca , ssl_certssl_key đã được điền với tên của các file tương ứng mà ta vừa tạo.

Tiếp theo, hãy kiểm tra lại chi tiết kết nối:

  • \s
Output
-------------- . . . SSL: Cipher in use is DHE-RSA-AES256-SHA . . . Connection: 127.0.0.1 via TCP/IP . . . --------------

Lần này, mật mã SSL cụ thể được hiển thị, cho biết rằng SSL đang được sử dụng để bảo mật kết nối.

Thoát trở lại shell:

  • exit

Server của bạn hiện có thể sử dụng mã hóa, nhưng cần có một số cấu hình bổ sung để cho phép truy cập từ xa và bắt buộc sử dụng các kết nối an toàn.

Bước 4 - Cấu hình kết nối an toàn cho khách hàng từ xa

Đến đây bạn đã bật SSL trên server MySQL, bạn có thể bắt đầu cấu hình quyền truy cập từ xa an toàn. Để thực hiện việc này, bạn sẽ cấu hình server MySQL của bạn để yêu cầu mọi kết nối từ xa được thực hiện qua SSL, ràng buộc MySQL để lắng nghe trên giao diện công cộng và điều chỉnh các luật firewall của hệ thống để cho phép các kết nối bên ngoài

Hiện tại, server MySQL được cấu hình để chấp nhận kết nối SSL từ các client . Tuy nhiên, nó sẽ vẫn cho phép các kết nối không được mã hóa nếu khách hàng yêu cầu. Ta có thể thay đổi điều này bằng cách bật tùy chọn require_secure_transport . Điều này yêu cầu tất cả các kết nối phải được thực hiện với SSL hoặc với socket Unix local . Vì các socket Unix chỉ có thể truy cập từ bên trong server , tùy chọn kết nối duy nhất có sẵn cho user từ xa sẽ là với SSL.

Để bật cài đặt này, hãy mở file cấu hình MySQL trong editor bạn muốn . Ở đây, ta sẽ sử dụng nano :

  • sudo nano /etc/mysql/my.cnf

Bên trong sẽ có hai lệnh !includedir Includeir được sử dụng để tạo nguồn cho các file cấu hình bổ sung. Bạn phải thêm cấu hình của riêng mình bên dưới những dòng này để nó overrides mọi cài đặt xung đột được tìm thấy trong các file cấu hình bổ sung này.

Bắt đầu bằng cách tạo phần [mysqld] để nhắm đến quy trình server MySQL. Dưới tiêu đề phần đó, đặt require_secure_transport thành ON , điều này sẽ buộc MySQL chỉ cho phép các kết nối an toàn:

/etc/mysql/my.cnf
. . .  !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/  [mysqld] # Require clients to connect either using SSL # or through a local socket file require_secure_transport = ON 

Theo mặc định, MySQL được cấu hình để chỉ lắng nghe các kết nối bắt nguồn từ 127.0.0.1 , địa chỉ IP lặp lại đại diện cho localhost . Điều này nghĩa là MySQL được cấu hình để chỉ lắng nghe các kết nối bắt nguồn từ máy mà server MySQL được cài đặt.

Để cho phép MySQL lắng nghe các kết nối bên ngoài, bạn phải cấu hình nó để lắng nghe các kết nối trên địa chỉ IP bên ngoài . Để thực hiện việc này, bạn có thể thêm cài đặt bind-address và trỏ nó đến 0.0.0.0 , một địa chỉ IP ký tự đại diện đại diện cho tất cả các địa chỉ IP. Về cơ bản, điều này sẽ buộc MySQL lắng nghe các kết nối trên mọi giao diện:

/etc/mysql/my.cnf
. . .  !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/  [mysqld] # Require clients to connect either using SSL # or through a local socket file require_secure_transport = ON bind-address = 0.0.0.0 

Lưu ý: Ngoài ra, bạn có thể đặt bind-address IP công cộng của server MySQL của mình. Tuy nhiên, bạn cần nhớ cập nhật file my.cnf của bạn nếu bạn đã từng di chuyển database của bạn sang một máy khác.

Sau khi thêm các dòng này, hãy lưu file . Nếu bạn đã sử dụng nano để chỉnh sửa file , bạn có thể thực hiện bằng cách nhấn CTRL+X , Y , sau đó ENTER .

Tiếp theo, khởi động lại MySQL để áp dụng các cài đặt mới:

  • sudo systemctl restart mysql

Xác minh MySQL đang lắng nghe trên 0.0.0.0 thay vì 127.0.0.1 bằng lệnh :

  • sudo netstat -plunt

Đầu ra của lệnh này sẽ giống như sau:

Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 13317/mysqld tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1293/sshd tcp6 0 0 :::22 :::* LISTEN 1293/sshd

0.0.0.0 đánh dấu trong kết quả ở trên cho biết MySQL đang lắng nghe các kết nối trên tất cả các giao diện có sẵn.

Tiếp theo, cho phép các kết nối MySQL thông qua firewall của server của bạn. Thêm một ngoại lệ cho các luật ufw của bạn bằng lệnh :

  • sudo ufw allow mysql
Output
Rule added Rule added (v6)

Như vậy, các nỗ lực kết nối từ xa hiện có thể đến được server MySQL của bạn. Tuy nhiên, bạn hiện không có mọi user được cấu hình có thể kết nối từ một máy từ xa. Ta sẽ tạo và cấu hình user MySQL có thể kết nối từ client của bạn trong bước tiếp theo.

Bước 5 - Tạo user MySQL chuyên dụng

Đến đây, server MySQL của bạn sẽ từ chối mọi nỗ lực kết nối từ một client từ xa. Điều này là do những user MySQL hiện tại đều chỉ được cấu hình để kết nối local từ server MySQL. Để giải quyết vấn đề này, bạn sẽ tạo một user chuyên dụng chỉ có thể kết nối từ client của bạn.

Để tạo một user như vậy, hãy đăng nhập lại vào MySQL với quyền là user gốc :

  • mysql -u root -p

Từ dấu nhắc , hãy tạo một user từ xa mới bằng CREATE USER . Bạn có thể đặt tên cho user này bạn muốn , nhưng trong hướng dẫn này, ta đặt tên là mysql_user . Đảm bảo chỉ định địa chỉ IP của client của bạn trong phần server của thông số kỹ thuật user để hạn chế kết nối với máy đó và thay thế password bằng password an toàn do bạn chọn. Ngoài ra, đối với một số dự phòng trong trường hợp tùy chọn require_secure_transport bị tắt trong tương lai, hãy chỉ định rằng user này yêu cầu SSL bằng cách bao gồm điều khoản REQUIRE SSL , như được hiển thị ở đây:

  • CREATE USER 'mysql_user'@'your_mysql_client_IP' IDENTIFIED BY 'password' REQUIRE SSL;

Tiếp theo, cấp quyền cho user mới đối với bất kỳ database hoặc bảng nào mà họ phải có quyền truy cập. Để chứng minh, tạo ra một example database :

  • CREATE DATABASE example;

Sau đó, cấp cho user mới của bạn quyền truy cập vào database này và tất cả các bảng của nó:

  • GRANT ALL ON example.* TO 'mysql_user'@'your_mysql_client_IP';

Tiếp theo, xóa các quyền để áp dụng các cài đặt đó ngay lập tức:

  • FLUSH PRIVILEGES;

Sau đó thoát trở lại shell khi bạn hoàn tất:

  • exit

Server MySQL của bạn hiện đã được cài đặt để cho phép kết nối từ user từ xa của bạn. Để kiểm tra xem bạn có thể kết nối với MySQL thành công hay không, bạn cần cài đặt gói mysql-client trên máy khách MySQL .

Đăng nhập vào client của bạn bằng ssh

  • ssh sammy@your_mysql_client_ip

Sau đó cập nhật index gói của client :

  • sudo apt update

Và cài đặt mysql-client bằng lệnh sau:

  • sudo apt install mysql-client

Khi được yêu cầu , hãy xác nhận cài đặt bằng cách nhấn ENTER .

Khi APT hoàn tất cài đặt gói, hãy chạy lệnh sau để kiểm tra xem bạn có thể kết nối thành công với server hay không. Lệnh này bao gồm tùy chọn user -u để chỉ định mysql_user và tùy chọn -h để chỉ định địa chỉ IP của server MySQL :

  • mysql -u mysql_user -p -h your_mysql_server_IP

Sau khi gửi password , bạn sẽ được đăng nhập vào server từ xa. Sử dụng \s để kiểm tra trạng thái của server và xác nhận kết nối của bạn là an toàn:

  • \s
Output
-------------- . . . SSL: Cipher in use is DHE-RSA-AES256-SHA . . . Connection: your_mysql_server_IP via TCP/IP . . . --------------

Thoát trở lại shell:

  • exit

Bạn đã xác nhận bạn có thể kết nối với MySQL qua SSL. Tuy nhiên, bạn vẫn chưa xác nhận server MySQL đang từ chối các kết nối không an toàn. Để kiểm tra điều này, hãy thử kết nối , nhưng lần này hãy thêm --ssl-mode=disabled vào lệnh đăng nhập. Thao tác này sẽ hướng dẫn mysql-client thử kết nối không được mã hóa:

  • mysql -u mysql_user -p -h mysql_server_IP --ssl-mode=disabled

Sau khi nhập password của bạn khi được yêu cầu , kết nối của bạn sẽ bị từ chối:

Output
ERROR 1045 (28000): Access denied for user 'mysql_user'@'mysql_server_IP' (using password: YES)

Điều này cho thấy rằng các kết nối SSL được phép trong khi các kết nối không được mã hóa bị từ chối.

Đến đây, server MySQL của bạn đã được cấu hình để chấp nhận các kết nối từ xa an toàn. Bạn có thể dừng ở đây nếu điều này đáp ứng các yêu cầu bảo mật của bạn, nhưng có một số phần bổ sung mà bạn có thể đưa vào để tăng cường bảo mật và sự tin cậy giữa hai server của bạn.

Bước 6 - (Tùy chọn) Cấu hình xác thực cho các kết nối MySQL

Hiện tại, server MySQL của bạn được cấu hình với certificate SSL do tổ chức phát hành certificate (CA) tạo local ký. Chứng chỉ và cặp khóa của server đủ để cung cấp mã hóa cho các kết nối đến.

Tuy nhiên, bạn vẫn chưa tận dụng hết mối quan hệ tin cậy mà tổ chức phát hành certificate có thể cung cấp. Bằng cách phân phối certificate CA cho khách hàng - cũng như certificate và khóa của client - cả hai bên có thể cung cấp bằng chứng rằng certificate của họ đã được ký bởi tổ chức phát hành certificate tin cậy . Điều này có thể giúp ngăn chặn các kết nối giả mạo từ các server độc hại.

Để triển khai biện pháp bảo vệ bổ sung, tùy chọn này, ta sẽ chuyển các file SSL thích hợp sang client , tạo file cấu hình client và thay đổi user MySQL từ xa để certificate request tin cậy .

Lưu ý: Quá trình chuyển certificate CA, certificate client và khóa client sang client MySQL được nêu trong các đoạn sau bao gồm việc hiển thị nội dung của từng file với cat , sao chép những nội dung đó vào clipboard của bạn và dán chúng vào file mới trên client . Mặc dù có thể sao chép trực tiếp các file này bằng một chương trình như scp hoặc sftp , điều này cũng yêu cầu bạn cài đặt SSH key cho cả hai server để cho phép chúng giao tiếp qua SSH.

Mục tiêu của ta ở đây là giảm thiểu số lượng các con đường tiềm năng để kết nối với server MySQL của bạn. Mặc dù quá trình này tốn nhiều công sức hơn một chút so với việc chuyển trực tiếp các file , nhưng nó cũng an toàn như nhau và không yêu cầu bạn mở kết nối SSH giữa hai máy.

Bắt đầu bằng cách tạo một folder trên máy khách MySQL trong folder chính của user không phải root của bạn. Gọi folder này là client-ssl :

  • mkdir ~/client-ssl

Vì khóa certificate nhạy cảm, hãy khóa quyền truy cập vào folder này để chỉ user hiện tại mới có thể truy cập:

  • chmod 700 ~/client-ssl

Trên server MySQL , hiển thị nội dung của certificate CA bằng lệnh :

  • sudo cat /var/lib/mysql/ca.pem
Output
-----BEGIN CERTIFICATE----- . . . -----END CERTIFICATE-----

Sao chép toàn bộ kết quả kết quả , bao gồm các dòng BEGIN CERTIFICATEEND CERTIFICATE , vào clipboard của bạn.

Trên máy khách MySQL , tạo một file có cùng tên bên trong folder mới:

  • nano ~/client-ssl/ca.pem

Bên trong, dán nội dung certificate đã sao chép từ clipboard của bạn. Lưu file khi bạn hoàn tất.

Tiếp theo, hiển thị certificate ứng dụng client trên server MySQL :

  • sudo cat /var/lib/mysql/client-cert.pem
Output
-----BEGIN CERTIFICATE----- . . . -----END CERTIFICATE-----

Sao chép nội dung file vào clipboard của bạn. , hãy nhớ bao gồm dòng đầu tiên và dòng cuối cùng.

Mở file có cùng tên trên máy khách MySQL trong folder client-ssl :

  • nano ~/client-ssl/client-cert.pem

Dán nội dung từ clipboard của bạn. Lưu và đóng file .

Cuối cùng, hiển thị nội dung của file khóa client trên server MySQL :

  • sudo cat /var/lib/mysql/client-key.pem
Output
-----BEGIN RSA PRIVATE KEY----- . . . -----END RSA PRIVATE KEY-----

Sao chép nội dung được hiển thị, bao gồm cả dòng đầu tiên và dòng cuối cùng, vào clipboard của bạn.

Trên máy khách MySQL , hãy mở file có cùng tên trong folder client-ssl :

  • nano ~/client-ssl/client-key.pem

Dán nội dung từ clipboard của bạn. Lưu và đóng file .

Máy khách bây giờ có tất cả các thông tin cần thiết để truy cập server MySQL. Tuy nhiên, server MySQL vẫn chưa được cài đặt để certificate request tin cậy cho các kết nối client .

Để thay đổi điều này, hãy đăng nhập lại vào account gốc MySQL trên server MySQL :

  • mysql -u root -p

Từ đây, hãy thay đổi các yêu cầu bảo mật cho user từ xa của bạn. Thay vì mệnh đề REQUIRE SSL , hãy áp dụng mệnh đề REQUIRE X509 . Điều này ngụ ý tất cả bảo mật được cung cấp bởi điều khoản REQUIRE SSL , nhưng cũng yêu cầu ứng dụng client kết nối xuất trình certificate được ký bởi tổ chức phát hành certificate mà server MySQL tin cậy.

Để điều chỉnh các yêu cầu của user , hãy sử dụng ALTER USER :

  • ALTER USER 'mysql_user'@'mysql_client_IP' REQUIRE X509;

Sau đó, xóa các thay đổi đảm bảo rằng chúng được áp dụng ngay lập tức:

  • FLUSH PRIVILEGES;

Thoát trở lại shell khi bạn hoàn thành:

  • exit

Sau đó, hãy kiểm tra xem bạn có thể xác thực cả hai bên khi kết nối hay không.

Trên máy khách MySQL , trước tiên hãy thử kết nối mà không cần cung cấp certificate client :

  • mysql -u mysql_user -p -h mysql_server_IP
Output
ERROR 1045 (28000): Access denied for user 'mysql_user'@'mysql_client_IP' (using password: YES)

Như mong đợi, server từ chối kết nối khi không có certificate client nào được xuất trình.

Bây giờ, hãy kết nối trong khi sử dụng các --ssl-ca , --ssl-cert--ssl-key để trỏ đến các file có liên quan trong folder ~/client-ssl :

  • mysql -u mysql_user -p -h mysql_server_IP --ssl-ca=~/client-ssl/ca.pem --ssl-cert=~/client-ssl/client-cert.pem --ssl-key=~/client-ssl/client-key.pem

Bạn đã cung cấp cho khách hàng các certificate và khóa thích hợp, vì vậy nỗ lực này sẽ thành công:

Đăng xuất để lấy lại quyền truy cập vào phiên shell của bạn:

  • exit

Đến đây bạn đã xác nhận quyền truy cập vào server , hãy thực hiện một cải tiến nhỏ về khả năng sử dụng để tránh phải chỉ định file certificate mỗi khi bạn kết nối.

Bên trong folder chính của bạn trên máy khách MySQL , hãy tạo một file cấu hình ẩn có tên ~/.my.cnf :

  • nano ~/.my.cnf

Ở đầu file , tạo một phần có tên là [client] . Bên dưới, thêm các tùy chọn ssl-ca , ssl-certssl-key và trỏ chúng đến các file tương ứng mà bạn đã sao chép từ server . Nó sẽ trông giống thế này:

~ / .my.cnf
[client] ssl-ca = ~/client-ssl/ca.pem ssl-cert = ~/client-ssl/client-cert.pem ssl-key = ~/client-ssl/client-key.pem 

Tùy chọn ssl-ca cho khách hàng xác minh certificate do server MySQL cung cấp có được ký bởi tổ chức phát hành certificate mà bạn đã trỏ đến. Điều này cho phép client tin tưởng rằng nó đang kết nối với server MySQL tin cậy . Tương tự như vậy, các tùy chọn ssl-certssl-key trỏ đến các file cần thiết để chứng minh với server MySQL rằng nó cũng có certificate đã được ký bởi cùng một tổ chức phát hành certificate . Bạn cần điều này nếu bạn muốn server MySQL xác minh client cũng được CA tin cậy.

Lưu file khi bạn hoàn tất.

Bây giờ, bạn có thể kết nối với server MySQL mà không cần thêm các --ssl-ca , --ssl-cert--ssl-key trên dòng lệnh:

  • mysql -u remote_user -p -h mysql_server_ip

Máy khách và server của bạn bây giờ sẽ xuất trình các certificate khi thương lượng kết nối. Mỗi bên được cấu hình để xác minh certificate từ xa so với certificate CA mà bên đó có local .

Kết luận

Server MySQL của bạn hiện đã được cấu hình để yêu cầu kết nối an toàn từ các client từ xa. Ngoài ra, nếu bạn đã làm theo các bước để xác thực kết nối bằng cách sử dụng tổ chức phát hành certificate , một số cấp độ tin cậy được cài đặt bởi cả hai bên rằng bên từ xa là hợp lệ .


Tags:

Các tin liên quan

Cách thiết lập WordPress với MySQL trên Kubernetes bằng Helm
2019-05-07
Cách cho phép truy cập từ xa vào MySQL
2019-03-07
Cách sửa chữa bảng bị hỏng trong MySQL
2019-03-07
Cách khắc phục sự cố lỗi socket trong MySQL
2019-03-07
Cách giải quyết sự cố trong MySQL
2019-03-07
Cách khắc phục sự cố truy vấn MySQL
2019-03-07
Giới thiệu về Truy vấn trong MySQL
2018-10-17
Cách cài đặt MySQL mới nhất trên Debian 9
2018-09-05
Cách đặt lại mật khẩu gốc MySQL hoặc MariaDB của bạn trên Ubuntu 18.04
2018-09-04
Cách tạo một cụm MySQL nhiều node trên Ubuntu 18.04
2018-07-26