基于SSL加密的MySQL主从复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

在MySQL的主从复制中,其传输过程是明文传输,并不能保证数据的安全性,在编译安装Mysql时,基本上都会加上一个 --with-openssl这样的选项,即表示支openssl加密传输协议,因此就可以为mysql配置基于ssl加密传输啦。

规划:
Master:
IP地址:172.16.4.111
MySQL版本:5.5.20
操作系统:RHEL5.4

Slave:
IP地址:172.16.4.112
MySQL版本:5.5.20
操作系统:RHEL5.4

由于使用了ssl加密传输协议,即意味着,在传输之前,主从服务器是要进行互相认证的,因此要为两台服务器准备各自的证书,私钥,以及为其颁发证书的CA的证书,明晰了这些,就先为两台服务器准备私钥,证书。这里需要将Master配置为一台CA服务器,方便为主从服务器颁发证书。ps:将服务器配置为CA服务器,详见:Openssl的用法(搭建CA服务器)  http://grass51.blog.51cto.com/4356355/798505

一、设置主从服务
在172.16.4.111服务器上
编辑/etc/my.cnf
#vim /etc/my.cnf
将serier_id修改为11
server_id=11                #修改server_id=11
log_bin=mysql-bin            #开启二进制日志
sync_binlog=1                #任何一个事务提交之后就立即写入到磁盘中的二进制文件
innodb_flush_logs_at_trx_commit=1       #任何一个事物提交之后就立即写入到磁盘中的日志文件
保存退出
启动mysql
#service mysqld start

在172.16.4.112服务器上

编辑/etc/my.cnf
#vim /etc/my.cnf
server_id=12                #修改server_id=12
#log-bin                #注释掉log-bin,从服务器不需要二进制日志,因此将其关闭 
relay-log=mysql-relay                #定义中继日志名,开启从服务器中继日志 
relay-log-index=mysql-relay.index     #定义中继日志索引名,开启从服务器中继索引
read_only=1                    #设定从服务器只能进行读操作,不能进行写操作
保存退出
启动mysql
#service mysqld start


二、准备证书,私钥

1、配置Master为CA服务器
#vim /etc/pki/tls/openssl.cnf 
将  dir             = ../../CA修改为
dir             = /etc/pki/CA
#(umask 077;openssl genrsa 2048 > private/cakey.pem)
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
#mkdir certs crl newcerts
#touch index.txt
#echo 01 > serial

2、为Master上的Mysql准备私钥以及颁发证书
#mkdir /usr/local/mysql/ssl
#cd ssl/
#(umask 077;openssl genrsa 1024 > mysql.key)
#openssl req -new -key mysql.key -out mysql.csr
#openssl ca -in mysql.csr -out mysql.crt
#cp /etc/pki/CA/cacert.pem /usr/local/mysql/ssl/
#chown -R mysql.mysql ssl/

3、为Slave上的Mysql准备私钥以及申请证书
#mkdir /usr/local/mysql/ssl
#cd ssl/
#(umask 077;openssl genrsa 1024 > mysql.key)
#openssl req -new -key mysql.key -out mysql.csr
#scp ./mysql.csr 172.16.4.111:/root

4、在Master上为Slave签发证书

#cd
#openssl ca -in mysql.csr -out mysql.crt
#scp ./mysql.crt 172.16.4.112:/usr/local/mysql/ssl
#cd /etc/pki/CA
#scp ./cacert.pem 172.16.4.112:/usr/local/mysql/ssl

到此证书以及私钥已经准备好,请确认在Master以及Slave的/usr/local/mysql/ssl目录下具有以下文件,以及属主和属组:

 


三、开启Mysql的ssl功能

Master:
登录Mysql查看
mysql> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED | 
| have_ssl      | DISABLED | 
| ssl_ca        |          | 
| ssl_capath    |          | 
| ssl_cert      |          | 
| ssl_cipher    |          | 
| ssl_key       |          | 
+---------------+----------+
输出为DISABLED表示ssl还未开启,
编辑/etc/my.cnf
在[mysqld]和[mysqldump]之间,加入以下内容:
ssl                         #表示开启mysql的ssl功能

保存后重新启动mysql,再次登录mysql
mysql> show variables like '%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   | 
| have_ssl      | YES   | 
| ssl_ca        |       | 
| ssl_capath    |       | 
| ssl_cert      |       | 
| ssl_cipher    |       | 
| ssl_key       |       | 
+---------------+-------+
输出为YES表示ssl已经开启。

Slave:
执行同样的操作
mysql> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED | 
| have_ssl      | DISABLED | 
| ssl_ca        |          | 
| ssl_capath    |          | 
| ssl_cert      |          | 
| ssl_cipher    |          | 
| ssl_key       |          | 
+---------------+----------+
输出为DISABLED表示ssl还未开启,
编辑/etc/my.cnf
在[mysqld]和[mysqldump]之间,加入一行ssl:
ssl

保存后重新启动mysql,再次登录mysql
mysql> show variables like '%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   | 
| have_ssl      | YES   | 
| ssl_ca        |       | 
| ssl_capath    |       | 
| ssl_cert      |       | 
| ssl_cipher    |       | 
| ssl_key       |       | 
+---------------+-------+
输出为YES表示ssl已经开启。


四、配置主从服务的ssl功能

Master:
编辑配置文件:
#vim /etc/my.cnf
在之间添加的ssl下面添加以下内容:
ssl-ca=/usr/local/mysql/ssl/cacert.pem
ssl-cert=/usr/local/mysql/ssl/mysql.crt
ssl-key=/usr/local/mysql/ssl/mysql.key

这里一定要对应到您所存放证书和私钥的绝对路径
保存退出,重新启动Mysql
mysql> show variables like '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| have_openssl  | YES                             | 
| have_ssl      | YES                             | 
| ssl_ca        | /usr/local/mysql/ssl/cacert.pem | 
| ssl_capath    |                                 | 
| ssl_cert      | /usr/local/mysql/ssl/mysql.crt  | 
| ssl_cipher    |                                 | 
| ssl_key       | /usr/local/mysql/ssl/mysql.key  | 
+---------------+---------------------------------+

Slave:
编辑配置文件:
#vim /etc/my.cnf
在之间添加的ssl下面添加以下内容:
ssl-ca=/usr/local/mysql/ssl/cacert.pem
ssl-cert=/usr/local/mysql/ssl/mysql.crt
ssl-key=/usr/local/mysql/ssl/mysql.key

这里一定要对应到您所存放证书和私钥的绝对路径
保存退出,重新启动Mysql
mysql> show variables like '%ssl%';
+---------------+---------------------------------+
| Variable_name | Value                           |
+---------------+---------------------------------+
| have_openssl  | YES                             | 
| have_ssl      | YES                             | 
| ssl_ca        | /usr/local/mysql/ssl/cacert.pem | 
| ssl_capath    |                                 | 
| ssl_cert      | /usr/local/mysql/ssl/mysql.crt  | 
| ssl_cipher    |                                 | 
| ssl_key       | /usr/local/mysql/ssl/mysql.key  | 
+---------------+---------------------------------+


五、记录主服务器的二进制日志文件以及事件,并且创建基于ssl复制的用户

ps:这里主从服务器的数据当前都是一致的,如果从服务器是新添加的,则需要将主服务器的最后的一个二进制日志之前的所有数据导入从服务器,具体步骤见:mysql的主从复制的场景二       http://grass51.blog.51cto.com/4356355/836600


Master:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000075 |      107 |              |                  | 
+------------------+----------+--------------+------------------+

mysql> grant replication client,replication slave on *.* to sslrepl@172.16.4.112 identified by '135246' require ssl;
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


六、启动从服务的从服务线程
Slave:
mysql> change master to \
    -> master_host='172.16.4.111',
    -> master_user='sslrepl',
    -> master_password='135246',
    -> master_log_file='mysql-bin.000075',
    -> master_log_pos=107,
    -> master_ssl=1,
    -> master_ssl_ca='/usr/local/mysql/ssl/cacert.pem',
    -> master_ssl_cert='/usr/local/mysql/ssl/mysql.crt',
    -> master_ssl_key='/usr/local/mysql/ssl/mysql.key';
Query OK, 0 rows affected (0.17 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 172.16.4.111
                  Master_User: sslrepl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000075
          Read_Master_Log_Pos: 608
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000075
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 608
              Relay_Log_Space: 107
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
           Master_SSL_CA_Path: /usr/local/mysql/ssl
              Master_SSL_Cert: /usr/local/mysql/ssl/mysql.crt
            Master_SSL_Cipher: 
               Master_SSL_Key: /usr/local/mysql/ssl/mysql.key
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: 172.16.4.111
                  Master_User: sslrepl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000075
          Read_Master_Log_Pos: 608
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000075
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 608
              Relay_Log_Space: 403
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /usr/local/mysql/ssl/cacert.pem
           Master_SSL_CA_Path: /usr/local/mysql/ssl
              Master_SSL_Cert: /usr/local/mysql/ssl/mysql.crt
            Master_SSL_Cipher: 
               Master_SSL_Key: /usr/local/mysql/ssl/mysql.key
        Seconds_Behind_Master: 2132
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1


输出信息为
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master_SSL_Allowed: Yes
说明,基于ssl的配置已经成功


七、验证是否使用了ssl加密
Slave:
使用ssrepl用户登录mysql
#mysql --ssl-ca=/usr/local/mysql/ssl/cacert.pem --ssl-cert=/usr/local/mysql/ssl/mysql.crt --ssl-key=/usr/local/mysql/ssl/mysql.key -usslrepl -h172.16.4.111 -p135246
mysql> \s
--------------
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i386) using readline 5.1

Connection id:        3
Current database:    
Current user:        sslrepl@172.16.4.112
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.5.19-log MySQL Community Server (GPL)
Protocol version:    10
Connection:        172.16.4.111 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:        3306
Uptime:            8 min 18 sec

Threads: 3  Questions: 47  Slow queries: 0  Opens: 34  Flush tables: 1  Open tables: 27  Queries per second avg: 0.094
--------------

输出信息:
SSL:            Cipher in use is DHE-RSA-AES256-SHA

说明是加密连接了。

由于SSL相关的配置写进了配置文件,则默认是加密连接的。
也可以使用--skip-ssl选项取消加密连接。


至此基于SSL加密的MySQL主从复制架构就配置成功了!

对于基于SSL机密的主主复制只需各自建立基于ssl加密的用户即可。








本文转自 向阳草米奇 51CTO博客,原文链接:http://blog.51cto.com/grass51/837589,如需转载请自行联系原作者
目录
打赏
0
0
0
0
235
分享
相关文章
SSL/TLS:构建数字世界的加密长城
**协议演进:从网景实验室到全球标准** 1994年,网景公司推出SSL协议,首次实现40位密钥加密传输,开启网络安全新纪元。此后,SSL 3.0、TLS 1.0相继问世,至2018年TLS 1.3将握手速度提升60%,强制前向加密确保历史会话安全。TLS协议通过非对称加密、对称加密和证书信任链等多层架构保障通信安全。2014年POODLE漏洞促使全行业禁用SSL 3.0,催生防降级机制。
SSL/TLS:互联网通信的加密基石与安全实践
**简介:** 在数字化时代,互联网每天传输海量敏感数据,网络攻击频发。SSL/TLS协议作为网络安全的基石,通过加密技术确保数据安全传输。本文解析SSL/TLS的技术架构、密码学原理、应用场景及常见误区,探讨其在未来的发展趋势,强调持续演进以应对新型威胁的重要性。 SSL/TLS不仅保障Web安全,还广泛应用于API、邮件、物联网等领域,并遵循合规标准如PCI DSS和GDPR。
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
165 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
MySQL 主从复制
主从复制是 MySQL 实现数据冗余和高可用性的关键技术。主库通过 binlog 记录操作,从库异步获取并回放这些日志,确保数据一致性。搭建主从复制需满足:多个数据库实例、主库开启 binlog、不同 server_id、创建复制用户、从库恢复主库数据、配置复制信息并开启复制线程。通过 `change master to` 和 `start slave` 命令启动复制,使用 `show slave status` 检查同步状态。常见问题包括 IO 和 SQL 线程故障,可通过重置和重新配置解决。延时原因涉及主库写入延迟、DUMP 线程性能及从库 SQL 线程串行执行等,需优化配置或启用并行处理
119 40
免费SSL证书:一键加密,守护网站安全
在互联网时代,网站安全至关重要。SSL证书是保护网站数据传输安全的核心工具,提供数据加密、提升信任度、提高搜索引擎排名及避免“不安全”警告等多重优势。现在,您可以通过JoySSL官网免费获取SSL证书,只需注册并填写注策码(230907),即可一键加密,轻松守护网站安全,提升用户体验和品牌形象。立即行动,为您的网站穿上“安全防护衣”!
69 11
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
317 11
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
168 14
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
153 24
SSL/TLS证书**是一种用于加密网络通信的数字证书
SSL/TLS证书**是一种用于加密网络通信的数字证书
221 6

推荐镜像

更多