天天看點

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

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

連接配接準備

4.1 確定

SSL

開啟

首先可以進入

MySQL

確定

SSL

功能開啟:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

4.2 生成

CA

和私鑰

預設情況下,在

/var/lib/mysql

下已經有生成的證書和私鑰檔案,如果不想用預設的,可以重新生成:

sudo mkdir /mysql
sudo chown mysql:mysql /mysql
mysql_ssl_rsa_setup --datadir=/mysql
           
MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

生成的檔案包括:

  • 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 修改從庫配置指向主庫

首先檢視主庫的狀态:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

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
           

檢視從庫狀态:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

需要顯示兩個

Yes

才算成功,如果

Slave_IO_Running

一直顯示

Connecting

,可能原因是:

  • 在從庫中配置的主庫位址、端口、使用者名、密碼等錯誤
  • SSL

    配置錯誤,比如使用了錯誤的

    client-key.pem

  • 防火牆問題

請檢視日志自行檢查,日志位置可通過

檢視。

沒有問題後,嘗試在主庫中插入資料:

use test;
insert into user values('111',1);
           

在從庫中就可以查詢到了:

use test;
select * from user;
           
MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

9

binlog

的加密

8.0.14

開始,

MySQL

提供了對

binlog

的加密功能,預設情況下,

binlog

是沒有加密的,加密需要使用

keyring

插件或者元件:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

實作步驟如下:

  • 安裝

    keyring_file

    插件
  • 修改配置
  • 測試

9.1 安裝插件

MySQL

提供了以下插件的安裝:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

由于使用的是社群版,社群版隻支援

keyring_file

插件,以此為例。

主庫和從庫修改配置檔案如下:

[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=/mysql/keyring
           

重新開機後,進入

MySQL

檢視:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

需要處于

ACTIVE

狀态,這樣就是成功了。

9.2 修改配置

binlog

的加密通過一個系統變量

binlog_encryption

控制,需要手動開啟:

set global binlog_encryption=ON;
set persist binlog_encryption=ON;
           

開啟後檢視日志:

可以看到是加密了的

binlog

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

而之前沒有加密的

binlog

可以手動遷移資料後進行删除。

加密完

binlog

後并不需要修改主從複制的配置,主從複制依然生效,如下圖所示:

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結

主庫插入了一個使用者從庫依然能

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

如果覺得文章好看,歡迎點贊。

同時歡迎關注微信公衆号:氷泠之路。

MySQL 主從複制加密以及binlog的加密實作1 概述2 環境3 準備容器4 SSL連接配接準備5 主從複制的其他配置6 建立主從複制的使用者7 修改從庫配置指向主庫8 啟動從庫并測試9 binlog的加密10 參考連結