MySQL là một hệ thống cơ sở dữ liệu quan hệ mã nguồn mở hoạt động trên nhiều Hệ điều hành bao gồm Windows, Linux, MacOS và FreeBSD. Có lẽ đây là RDBMS mã nguồn mở phổ biến nhất và là thành phần trung tâm của LAMP và LEMP Stacks. Có nhiều ứng dụng phụ thuộc vào MySQL như Wordpress, Joomla, TYPO3, phpBB và nhiều ứng dụng khác.
Trong hướng dẫn này, tôi sẽ chỉ cho bạn từng bước để cấu hình MySQL an toàn cho các kết nối từ xa. Khi bạn cần truy cập MySQL từ xa, bạn phải sử dụng VPN vì MySQL không mã hóa dữ liệu được truyền hoặc bạn có thể cấu hình MySQL để sử dụng SSL, như tôi sẽ chỉ cho bạn trong hướng dẫn này. Trong cấu hình này, chỉ những người dùng có tệp chứng chỉ SSL chính xác mới được phép kết nối với máy chủ MySQL và lưu lượng được mã hóa. Chúng tôi sẽ cài đặt phiên bản MySQL mới nhất, sau đó cấu hình SSL cho kết nối từ xa. Đối với hệ thống cơ sở, tôi sẽ sử dụng máy chủ CentOS 7.
Những gì chúng ta sẽ làm:
Bạn sẽ được yêu cầu cài đặt gói mới, nhập 'y' và nhấn 'Enter' để xác nhận.
Bây giờ bạn có thể cài đặt MySQL phiên bản mới nhất 5.7 vào máy chủ như thế này:
Khi quá trình cài đặt hoàn tất, hãy khởi động dịch vụ MySQL và cho phép nó chạy tự động khi khởi động bằng lệnh systemctl.
Đảm bảo MySQL đang chạy bằng cách kiểm tra cổng được MySQL sử dụng (3306). Kiểm tra bằng lệnh netstat bên dưới.
MySQL đã được cài đặt trên CentOS 7 từ kho lưu trữ MySQL.
Để xem mật khẩu root MySQL mặc định, bạn có thể sử dụng lệnh grep bên dưới.
Bạn sẽ thấy kết quả tương tự như bên dưới, mật khẩu mặc định của tôi là 'wxtX8Te&Uh1K'.
Kết nối đến shell MySQL bằng mật khẩu mặc định và thay thế mật khẩu bằng mật khẩu của riêng bạn.
Bây giờ hãy thay thế mật khẩu mặc định bằng mật khẩu của riêng bạn. Trong hướng dẫn này, tôi sẽ sử dụng 'Hakase-labs123@' làm mật khẩu root MySQL mới. Chạy các truy vấn MySQL bên dưới.
Bây giờ bạn có thể kết nối lại với mật khẩu mới 'Hakase-labs123@'.
Trong bước này, chúng ta sẽ tạo tệp chứng chỉ tự ký mới. Chúng ta cần 3 chứng chỉ, Chứng chỉ CA, Chứng chỉ và Khóa máy chủ, Chứng chỉ và Khóa máy khách. Chúng ta sẽ tạo chúng bằng OpenSSL.
Tạo thư mục mới cho các tệp chứng chỉ SSL '/etc/certs/' và đi đến thư mục đó.
Tạo tệp chứng chỉ CA ca.pem mới.
Tiếp theo, chúng ta phải tạo chứng chỉ phía máy chủ. Tạo chứng chỉ máy chủ mới server-cert.pem và các tệp server-key.pem. Tạo các tệp chứng chỉ mới, xóa mật khẩu và ký chúng bằng chứng chỉ CA.
Bây giờ hãy tạo các tệp chứng chỉ cho máy khách. Máy chủ MySQL sẽ chỉ chấp nhận kết nối từ xa từ máy khách có các tệp chứng chỉ này. Tạo tệp chứng chỉ máy khách mới, xóa cụm mật khẩu và ký chúng bằng chứng chỉ CA.
Lưu ý:
Thông tin chứng chỉ CA phải khác với thông tin máy khách và máy chủ.
Tất cả các chứng chỉ mà chúng tôi yêu cầu cho thiết lập này đã được tạo. Bây giờ chúng ta có thể xác minh các tệp chứng chỉ bằng lệnh bên dưới.
Đảm bảo không có lỗi, kết quả như bên dưới.
Tất cả các tệp Chứng chỉ đã được xác minh. Thay đổi chủ sở hữu của thư mục certs thành người dùng 'mysql' và thay đổi quyền của tất cả các tệp khóa.
Tạo thư mục sao lưu mới 'mysql-certs' cho tất cả các chứng chỉ.
Đi tới thư mục '/var/lib/mysql' và di chuyển tất cả các chứng chỉ mặc định vào thư mục sao lưu.
Bây giờ hãy khởi động lại dịch vụ MySQL.
Tiếp theo, kiểm tra SSL từ shell MySQL. Đăng nhập vào mysql bằng mật khẩu mới:
Chạy truy vấn bên dưới để chúng ta có thể xem trạng thái SSL cho MySQL.
Bạn sẽ thấy trạng thái SSL là 'DISABLED' và người dùng root đã được kết nối mà không có SSL.
Tiếp theo, chúng ta sẽ bật kết nối SSL cho MySQL. Chúng ta phải chỉnh sửa tệp cấu hình MySQL 'my.cnf' bằng vim.
Trong phần '[mysqld]', dán cấu hình bên dưới.
Lưu tệp và thoát khỏi vim, khởi động lại dịch vụ MySQL.
Bây giờ hãy đăng nhập lại vào MySQL và kiểm tra SSL.
Chạy truy vấn bên dưới để đảm bảo giá trị phần SSL là 'YES'.
Bạn sẽ thấy SSL cho MySQL được bật, nhưng người dùng gốc vẫn chưa kết nối bằng kết nối SSL.
Để buộc tất cả người dùng cục bộ kết nối với SSL, hãy chỉnh sửa lại tệp cấu hình mysql 'my.cnf'.
Dán cấu hình bên dưới vào cuối dòng.
Lưu và thoát, sau đó khởi động lại MySQL.
Kết nối lại với MySQL và kiểm tra kết nối và SSL đã được bật chưa.
SSL đã được bật và kết nối cục bộ cũng sử dụng SSL.
Chỉnh sửa tệp cấu hình MySQL bằng vim.
Dán cấu hình này bên dưới vào cuối phần '[mysqld]'.
Lưu tệp và thoát khỏi trình chỉnh sửa, khởi động lại MySQL.
Tiếp theo, tạo người dùng mới cho kết nối từ xa. Tôi sẽ tạo một người dùng mới có tên là 'hakase' với mật khẩu 'Hakase-labs123@' và cấp mọi quyền cho người dùng 'hakase'. Người dùng 'hakase' chỉ có thể kết nối bằng khóa Chứng chỉ.
Người dùng mới cho kết nối từ xa đã được tạo.
Lưu ý:
Bạn có thể thấy '1 cảnh báo' trong kết quả truy vấn mysql. Chỉ là cảnh báo về việc sử dụng truy vấn ALTER USER thay vì GRANT vì truy vấn 'GRANT' sẽ không được khuyến khích trong bản phát hành tiếp theo.
10.0.15.11 = Địa chỉ IP của Máy chủ MySQL.
Bạn có thể xem trạng thái kết nối bằng truy vấn này bên dưới.
Người dùng hakase có địa chỉ IP 10.0.15.10 Đã kết nối đến máy chủ MySQL có địa chỉ IP 10.0.15.11, kết nối qua TCP/IP trên cổng 3306 và sử dụng SSL.
Khi bạn cố gắng kết nối mà không có tệp Chứng chỉ, bạn sẽ thấy lỗi như bên dưới.
Tiếp theo, tôi sẽ kiểm tra với GUI MySQLWorkbench từ máy chủ của mình.
Dưới đây là cấu hình của tôi - Thiết lập Tham số.
Cấu hình SSL - Thiết lập SSL.
Và bên dưới là kết quả của kết nối với tệp Chứng chỉ máy khách SSL.
Một người dùng mới đã kết nối thành công từ xa với máy chủ cơ sở dữ liệu MySQL bằng kết nối SSL. Khi người dùng cố gắng kết nối mà không có tệp Chứng chỉ, kết quả sẽ là 'bị từ chối'. Cài đặt và cấu hình MySQL với kết nối SSL đã thành công.
Trong hướng dẫn này, tôi sẽ chỉ cho bạn từng bước để cấu hình MySQL an toàn cho các kết nối từ xa. Khi bạn cần truy cập MySQL từ xa, bạn phải sử dụng VPN vì MySQL không mã hóa dữ liệu được truyền hoặc bạn có thể cấu hình MySQL để sử dụng SSL, như tôi sẽ chỉ cho bạn trong hướng dẫn này. Trong cấu hình này, chỉ những người dùng có tệp chứng chỉ SSL chính xác mới được phép kết nối với máy chủ MySQL và lưu lượng được mã hóa. Chúng tôi sẽ cài đặt phiên bản MySQL mới nhất, sau đó cấu hình SSL cho kết nối từ xa. Đối với hệ thống cơ sở, tôi sẽ sử dụng máy chủ CentOS 7.
Những gì chúng ta sẽ làm:
- Cài đặt MySQL.
- Cấu hình Mật khẩu gốc MySQL.
- Tạo Tệp chứng chỉ SSL tự ký mới.
- Bật SSL cho MySQL.
- Bật Kết nối từ xa.
- Kiểm tra.
- Máy chủ CentOS 7
- Quyền root
Bước 1 - Cài đặt MySQL Trong hướng dẫn này, chúng ta sẽ sử dụng MySQL 5.7, phiên bản mới nhất tại thời điểm này. Nó được cài đặt từ kho lưu trữ MySQL, vì vậy trước tiên chúng ta phải thêm kho lưu trữ CentOS mới vào hệ thống.
Thêm kho lưu trữ mới cho MySQL bằng lệnh yum bên dưới.
Mã:
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
Bây giờ bạn có thể cài đặt MySQL phiên bản mới nhất 5.7 vào máy chủ như thế này:
Mã:
yum -y install mysql-community-server
Mã:
systemctl start mysqld
systemctl enable mysqld
Mã:
netstat -plntu
MySQL đã được cài đặt trên CentOS 7 từ kho lưu trữ MySQL.
Bước 2 - Cấu hình Mật khẩu gốc MySQL
Theo mặc định, MySQL 5.7 tạo mật khẩu gốc mặc định cho bạn khi khởi động dịch vụ lần đầu tiên. Mật khẩu được lưu trữ trong tệp nhật ký MySQL '/var/log/mysqld.log'.Để xem mật khẩu root MySQL mặc định, bạn có thể sử dụng lệnh grep bên dưới.
Mã:
grep 'temporary' /var/log/mysqld.log
Mã:
Một mật khẩu tạm thời được tạo cho root@localhost: wxtX8Te&Uh1K
Mã:
mysql -u root -p
NHẬP MẬT KHẨU MẶC ĐỊNH
Mã:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hakase-labs123@';
flush privileges;
exit;
Bây giờ bạn có thể kết nối lại với mật khẩu mới 'Hakase-labs123@'.
Mã:
mysql -u root -p
LOG NEW PASSWORD 'Hakase-labs123@'
Bước 3 - Tạo các tệp chứng chỉ tự ký mới
Theo mặc định, MySQL 5.7 có các tệp chứng chỉ SSL riêng trong thư mục '/var/lib/mysql'. Nhưng trong hướng dẫn này, tôi sẽ chỉ cho bạn cách tạo tệp Chứng chỉ SSL của riêng bạn bằng OpenSSL, sau đó định cấu hình chúng bằng MySQL.Trong bước này, chúng ta sẽ tạo tệp chứng chỉ tự ký mới. Chúng ta cần 3 chứng chỉ, Chứng chỉ CA, Chứng chỉ và Khóa máy chủ, Chứng chỉ và Khóa máy khách. Chúng ta sẽ tạo chúng bằng OpenSSL.
Tạo thư mục mới cho các tệp chứng chỉ SSL '/etc/certs/' và đi đến thư mục đó.
Mã:
mkdir -p /etc/certs
cd /etc/certs
Mã:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Tiếp theo, chúng ta phải tạo chứng chỉ phía máy chủ. Tạo chứng chỉ máy chủ mới server-cert.pem và các tệp server-key.pem. Tạo các tệp chứng chỉ mới, xóa mật khẩu và ký chúng bằng chứng chỉ CA.
Mã:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Bây giờ hãy tạo các tệp chứng chỉ cho máy khách. Máy chủ MySQL sẽ chỉ chấp nhận kết nối từ xa từ máy khách có các tệp chứng chỉ này. Tạo tệp chứng chỉ máy khách mới, xóa cụm mật khẩu và ký chúng bằng chứng chỉ CA.
Mã:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Lưu ý:
Thông tin chứng chỉ CA phải khác với thông tin máy khách và máy chủ.
Tất cả các chứng chỉ mà chúng tôi yêu cầu cho thiết lập này đã được tạo. Bây giờ chúng ta có thể xác minh các tệp chứng chỉ bằng lệnh bên dưới.
Mã:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Tất cả các tệp Chứng chỉ đã được xác minh. Thay đổi chủ sở hữu của thư mục certs thành người dùng 'mysql' và thay đổi quyền của tất cả các tệp khóa.
Mã:
chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pem
Bước 4 - Bật SSL cho MySQL
Trong bước này, chúng ta sẽ bật SSL cho MySQL. Trước khi bắt đầu cấu hình và bật SSL trên MySQL, chúng ta cần sao lưu các tệp chứng chỉ mặc định vào thư mục sao lưu mới.Tạo thư mục sao lưu mới 'mysql-certs' cho tất cả các chứng chỉ.
Mã:
mkdir -p ~/mysql-certs/
Mã:
cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs/
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/
Mã:
systemctl restart mysqld
Tiếp theo, kiểm tra SSL từ shell MySQL. Đăng nhập vào mysql bằng mật khẩu mới:
Mã:
mysql -u root -p
TYPE NEW PASSWORD 'Hakase-labs123@'
Mã:
SHOW GLOBAL VARIABLES LIKE '%ssl%';
STATUS;
Tiếp theo, chúng ta sẽ bật kết nối SSL cho MySQL. Chúng ta phải chỉnh sửa tệp cấu hình MySQL 'my.cnf' bằng vim.
Mã:
vim /etc/my.cnf
Mã:
# Nhập thư mục chứng chỉ của riêng bạn
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key=/etc/certs/server-key.pem
Mã:
systemctl restart mysqld
Mã:
mysql -u root -p
NHẬP MẬT KHẨU MỚI 'Hakase-labs123@'
Mã:
SHOW VARIABLES LIKE '%ssl%';
STATUS;
Bạn sẽ thấy SSL cho MySQL được bật, nhưng người dùng gốc vẫn chưa kết nối bằng kết nối SSL.
Để buộc tất cả người dùng cục bộ kết nối với SSL, hãy chỉnh sửa lại tệp cấu hình mysql 'my.cnf'.
Mã:
vim /etc/my.cnf
Mã:
[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc/certs/client-key.pem
Mã:
systemctl restart mysqld
Mã:
mysql -u root -p
NHẬP MẬT KHẨU MỚI 'Hakase-labs123@'
HIỂN THỊ CÁC BIẾN NHƯ '%ssl%';
TRẠNG THÁI;
SSL đã được bật và kết nối cục bộ cũng sử dụng SSL.
Bước 5 - Bật Kết nối từ xa
Trong các bước trên, chúng tôi đã bật SSL cho máy chủ MySQL và các kết nối cục bộ buộc phải sử dụng SSL. Trong bước này, chúng tôi sẽ bật kết nối từ xa cho MySQL, nhưng chúng tôi chỉ cho phép các máy khách có tệp chứng chỉ do CA của chúng tôi ký để kết nối với máy chủ MySQL.Chỉnh sửa tệp cấu hình MySQL bằng vim.
Mã:
vim /etc/my.cnf
Mã:
bind-address = *
require_secure_transport = ON
Mã:
systemctl restart mysqld
Mã:
mysql -u root -p
NHẬP MẬT KHẨU MỚI 'Hakase-labs123@'
tạo người dùng 'hakase'@'%' được xác định bởi 'Hakase-labs123@' YÊU CẦU X509;
cấp tất cả các đặc quyền trên *.* cho 'hakase'@'%' được xác định bởi 'Hakase-labs123@' YÊU CẦU X509;
xóa bỏ các đặc quyền;
Người dùng mới cho kết nối từ xa đã được tạo.
Lưu ý:
Bạn có thể thấy '1 cảnh báo' trong kết quả truy vấn mysql. Chỉ là cảnh báo về việc sử dụng truy vấn ALTER USER thay vì GRANT vì truy vấn 'GRANT' sẽ không được khuyến khích trong bản phát hành tiếp theo.
Bước 6 - Kiểm tra
Trong phần cuối cùng của hướng dẫn này, chúng ta sẽ kiểm tra xem người dùng mới có tên 'hakase' có thể kết nối từ xa với máy chủ MySQL bằng các tệp chứng chỉ hay không. Phải tải xuống ba chứng chỉ cho máy khách.- Chứng chỉ CA - ca.pem
- Chứng chỉ máy khách - client-cert.pem
- Khóa máy khách - client-key.pem
Mã:
mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem -p
Bạn có thể xem trạng thái kết nối bằng truy vấn này bên dưới.
Mã:
TRẠNG THÁI;
Người dùng hakase có địa chỉ IP 10.0.15.10 Đã kết nối đến máy chủ MySQL có địa chỉ IP 10.0.15.11, kết nối qua TCP/IP trên cổng 3306 và sử dụng SSL.
Khi bạn cố gắng kết nối mà không có tệp Chứng chỉ, bạn sẽ thấy lỗi như bên dưới.
Tiếp theo, tôi sẽ kiểm tra với GUI MySQLWorkbench từ máy chủ của mình.
Dưới đây là cấu hình của tôi - Thiết lập Tham số.
Cấu hình SSL - Thiết lập SSL.
Và bên dưới là kết quả của kết nối với tệp Chứng chỉ máy khách SSL.
Một người dùng mới đã kết nối thành công từ xa với máy chủ cơ sở dữ liệu MySQL bằng kết nối SSL. Khi người dùng cố gắng kết nối mà không có tệp Chứng chỉ, kết quả sẽ là 'bị từ chối'. Cài đặt và cấu hình MySQL với kết nối SSL đã thành công.
Tham khảo
- https://dev.mysql.com/doc/refman/5.7/en/secure-connections.htmlhttps://dev.mysql.com/doc/refman/5.7/en/secure-connections.html?utm_source=diendancongnghe.com
- https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.htmlhttps://dev.mysql.com/doc/refman/5....g-openssl.html?utm_source=diendancongnghe.com
- http://mysqlresources.com/grant-connection-restrictions-types