1 概述
本文主要講述了如何在主從複制的過程中使用
SSL
進行加密,還有
binlog
加密(
MySQL 8.0.14+
)的實作。
2 環境
-
MySQL 8.0.25
-
Docker
- 一主一從
3 準備容器
先拉取鏡像并啟動,主庫
3306
,從庫
3307
,還需要加上
--ssl
參數,以開啟
SSL
加密連接配接的功能:
docker pull mysql
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql --ssl
docker run -itd -p 3307:3306 -p 33061:33060 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql --ssl
啟動容器之後進入容器并安裝
vim
和
net-tools
:
apt install vim net-tools
同時進入
MySQL
準備好資料源:
create database test;
use test;
create table user(
id int primary key auto_increment,
name varchar(30) not null,
age int not null
);
4 SSL
連接配接準備
SSL
4.1 確定 SSL
開啟
SSL
首先可以進入
MySQL
確定
SSL
功能開啟:
4.2 生成 CA
和私鑰
CA
預設情況下,在
/var/lib/mysql
下已經有生成的證書和私鑰檔案,如果不想用預設的,可以重新生成:
sudo mkdir /mysql
sudo chown mysql:mysql /mysql
mysql_ssl_rsa_setup --datadir=/mysql
生成的檔案包括:
-
:ca-key.pem
私鑰CA
-
:自簽名的ca.pem
證書CA
-
:用戶端連接配接時使用的私鑰client-key.pem
-
:用戶端連接配接時使用的證書client-cert.pem
-
:伺服器端私鑰server-key.pem
-
:伺服器端證書server-cert.pem
-
/public_key.pem
:密鑰對的公鑰和私鑰private_key.pem
實際使用隻需要用到
ca.pem
、服務端私鑰證書、用戶端私鑰證書這五個檔案。由于主從複制的時候,主庫作為服務端,從庫作為用戶端,是以
ca.pem
/
server-key.pem
/
server-client.pem
隻需要在主庫中配置,而
ca.pem
/
client-key.pem
/
client-cert.pem
需要通過
scp
傳到從庫中。
4.3 修改權限
權限錯誤會導緻
MySQL
無法正常使用
SSL
的功能:
sudo chown mysql:mysql /mysql/*.pem
sudo chmod 400 /mysql/*.pem
sudo chmod 444 /mysql/ca.pem
4.4 修改配置檔案
修改主庫的配置檔案,如下所示:
[mysqld]
ssl_ca=/mysql/ca.pem
ssl_cert=/mysql/server-cert.pem
ssl_key=/mysql/server-key.pem
而從庫配置檔案 修改如下:
[client]
ssl-ca=/mysql/ca.pem
ssl-cert=/mysql/client-cert.pem
ssl-key=/mysql/client-key.pem
此時從庫是沒辦法連接配接自己的,隻能連接配接主庫,如果需要連接配接自己,需要将主庫的
server-key.pem
/
server-cert.pem
拷貝到從庫中,并配置從庫的
[mysqld]
:
[mysqld]
ssl_ca=/mysql/ca.pem
ssl_cert=/mysql/server-cert.pem
ssl_key=/mysql/server-key.pem
5 主從複制的其他配置
下面是一些主從複制的最正常最簡單的配置,主庫僅配置了
id
和需要複制的庫:
[mysqld]
server-id=1
binlog-do-db=test
從庫的配置如下:
[mysqld]
server-id=2
replicate-do-db=test
修改完後重新開機主庫和從庫。
6 建立主從複制的使用者
在主庫中建立主從複制的使用者(具體
ip
請使用
ifconfig
檢視):
create user 'repl'@'172.17.0.3' identified with mysql_native_password by '123456' require ssl;
grant replication slave on *.* to 'repl'@'172.17.0.3';
7 修改從庫配置指向主庫
首先檢視主庫的狀态:
把
File
和
Position
記錄下來,并在從庫中使用
change master to
/
change replication source to
(
8.0.23+
)設定主庫資訊:
change master to
master_host = '172.17.0.2',
master_user = 'repl',
master_password = '123456',
master_log_file = 'binlog.000005',
master_log_pos = 156,
master_ssl = 1;
或
change replication source to
source_host = '172.17.0.2',
source_user = 'repl',
source_password = '123456',
source_log_file = 'binlog.000005',
source_log_pos = 156;
source_ssl = 1;
8 啟動從庫并測試
可以使用
start slave
/
start replica
(
8.0.22+
)啟動從庫開啟複制功能:
start slave
# 或
start replica
啟動完成後使用
show slave stauts\G
檢視從庫狀态:
需要顯示兩個
Yes
才算成功,如果
Slave_IO_Running
一直顯示
Connecting
,可能原因是:
- 在從庫中配置的主庫位址、端口、使用者名、密碼等錯誤
-
配置錯誤,比如使用了錯誤的SSL
client-key.pem
- 防火牆問題
請檢視日志自行檢查,日志位置可通過
檢視。
沒有問題後,嘗試在主庫中插入資料:
use test;
insert into user values('111',1);
在從庫中就可以查詢到了:
use test;
select * from user;
9 binlog
的加密
binlog
從
8.0.14
開始,
MySQL
提供了對
binlog
的加密功能,預設情況下,
binlog
是沒有加密的,加密需要使用
keyring
插件或者元件:
實作步驟如下:
- 安裝
插件keyring_file
- 修改配置
- 測試
9.1 安裝插件
MySQL
提供了以下插件的安裝:
由于使用的是社群版,社群版隻支援
keyring_file
插件,以此為例。
主庫和從庫修改配置檔案如下:
[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/mysql/keyring
重新開機後,進入
MySQL
檢視:
需要處于
ACTIVE
狀态,這樣就是成功了。
9.2 修改配置
binlog
的加密通過一個系統變量
binlog_encryption
控制,需要手動開啟:
set global binlog_encryption=ON;
set persist binlog_encryption=ON;
開啟後檢視日志:
可以看到是加密了的
binlog
:
而之前沒有加密的
binlog
可以手動遷移資料後進行删除。
加密完
binlog
後并不需要修改主從複制的配置,主從複制依然生效,如下圖所示:
主庫插入了一個使用者從庫依然能
select
到。
10 參考連結
- MySQL-17.3.2 Encrypting Binary Log Files and Relay Log Files
- MySQL-6.3.1 Configuring MySQL to Use Encrypted Connections
- MySQL-4.4.3 mysql_ssl_rsa_setup — Create SSL/RSA Files
- MySQL-6.4.4.6 Using the keyring_file File-Based Keyring Plugin
- MySQL-6.4.4.3 Keyring Plugin Installation
- MySQL-6.4.4.2 Keyring Component Installation
- MySQL-5.6.2 Obtaining Server Plugin Information
- MySQL High Availablity-Binary log encryption at rest
- StackOverflow-MySQL - SSL is required but the server doesn’t support it
如果覺得文章好看,歡迎點贊。
同時歡迎關注微信公衆号:氷泠之路。