基於SSL實現MySQL的加密主從複製

來源:互聯網
上載者:User

大家都知道MySQL的主從複製是明文傳輸的,這對一些特殊業務來說是不允許的,下面來嘗試構建基於SSL的主從複製

環境:RHEL5.8 SELinux關閉,iptables關閉,MySQL 5.5.28-i686 tar包初始化安裝(非編譯)規劃:
 
  1. master: 172.16.1.18  master.laoguang.me 
  2. slave:  172.16.1.19  slave.laoguang.me 
準備工作:hostname與規劃一致,配置/etc/hosts做好解析,時間要同步,過程不再贅述,見http://laoguang.blog.51cto.com/6013350/1073891,mysql安裝見http://laoguang.blog.51cto.com/6013350/1039208,資料目錄為/data/mydata 一.在master上配置CA伺服器,並為master,slave頒發認證1.1 master建立CA伺服器,過程見http://laoguang.blog.51cto.com/6013350/10356081.2 master的MySQL認證申請
 
  1. mkdir /data/mydata/ssl 
  2. cd /data/mydata/ssl 
  3. openssl genrsa 1024 > mysql.key 
  4. openssl req -new -key mysql.key -out mysql.csr -days 3650
  5. ##接下來的輸入與建立CA時的一致,common name為master.laoguang.me 
  6. openssl ca openssl ca -in mysql.csr -out mysql.crt ##為MySQL簽證 
  7. cp /etc/pki/CA/cacert.pem .  ##將CA的認證也拷過來 
  8. chown mysql:mysql * 
  9. chmod 600 * 
1.3 slave上申請認證
 
  1. mkdir /data/mydata/ssl 
  2. cd /data/mydata/ssl 
  3. openssl genrsa 1024 > mysql.key 
  4. openssl req -new -key mysql.key -out mysql.csr -days 3650
  5. ##接下來的輸入與建立CA時的一致,common name為slave.laoguang.me 
  6. scp mysql.csr master:/root 
1.4 master上為slave簽發
 
  1. cd /root 
  2. openssl ca -in mysql.csr -out mysql.crt 
  3. scp mysql.crt slave:/data/mydata/ssl 
  4. scp /etc/pki/CA/cacert.pem slave:/data/mydata/ssl 
1.5 slave上更改許可權與屬主
 
  1. chown mysql:mysql mysql.* 
  2. chmod 600 mysql.* 
二.Master上編緝/etc/my.cnf啟用ssl, 並設定主從2.1 修改/etc/my.cnf
 
  1. [mysqld] 
  2. log-bin=mysql-bin 
  3. sync_binlog     = 1                  ##二進位日誌 
  4. server-id       = 1                  ##此id必須全域唯一 
  5. innodb_flush_log_at_trx_commit=1    ##每秒將交易記錄立刻刷寫到磁碟 
  6. ssl                     ##啟用ssl預設是不開啟的,mysql中show variables like '%ssl%'查看 
  7. ssl_ca =/data/mydata/ssl/cacert.pem  ##ca檔案的位置 
  8. ssl_cert= /data/mydata/ssl/mysql.crt ##認證檔案的位置 
  9. ssl_key = /data/mydata/ssl/mysql.key ##私密金鑰檔案的位置 
2.2 啟動mysql,並查看ssl資訊
 
  1. service mysqld start 
  2. mysql 
  3. mysql> show variables like '%ssl%'; 
  4. +---------------+-----------------------------+ 
  5. | Variable_name | Value                       | 
  6. +---------------+-----------------------------+ 
  7. | have_openssl  | YES                         | 
  8. | have_ssl      | YES                         | 
  9. | ssl_ca        | /data/mydata/ssl/cacert.pem | 
  10. | ssl_capath    |                             | 
  11. | ssl_cert      | /data/mydata/ssl/mysql.crt  | 
  12. | ssl_cipher    |                             | 
  13. | ssl_key       | /data/mydata/ssl/mysql.key  | 
  14. +---------------+-----------------------------+ 
2.3 為同步建立一最小許可權賬戶,並要求ssl
 
  1. mysql> create user 'backup_ssl'@'172.16.1.19' identified by 'redhat'; 
  2. mysql> revoke all privileges,grant option from 'backup_ssl'@'172.16.1.19'; 
  3. mysql> grant replication slave,replication client on *.* to 'backup_ssl'@'172.16.1.19' require ssl; 
  4. mysql> flush privileges; 
三.Slave上編緝/etc/my.cnf,啟用ssl,並設定主從3.1 編緝/etc/my.cnf
 
  1. [mysqld] 
  2. server-id       = 2                  ##此id必須全域唯一 
    ##log-bin = mysql-bin ##注釋掉,從伺服器不需要二進位日誌
  3. relay-log = mysql-ralay              ##中繼日誌 
  4. relay-log-index = mysql-ralay.index  ##中繼目錄 
  5. read-only = 1 ##從伺服器唯讀
  6. ssl                          ##啟用ssl預設是不開啟的,mysql中show variables like '%ssl%'查看 
  7. ssl_ca =/data/mydata/ssl/cacert.pem  ##ca檔案的位置 
  8. ssl_cert= /data/mydata/ssl/mysql.crt ##認證檔案的位置 
  9. ssl_key = /data/mydata/ssl/mysql.key ##私密金鑰檔案的位置 
3.2 啟用mysqld並查看ssl相關資訊
 
  1. servie mysqld start 
  2. mysql> show variables like '%ssl%'; 
  3. +---------------+-----------------------------+ 
  4. | Variable_name | Value                       | 
  5. +---------------+-----------------------------+ 
  6. | have_openssl  | YES                         | 
  7. | have_ssl      | YES                         | 
  8. | ssl_ca        | /data/mydata/ssl/cacert.pem | 
  9. | ssl_capath    |                             | 
  10. | ssl_cert      | /data/mydata/ssl/mysql.crt  | 
  11. | ssl_cipher    |                             | 
  12. | ssl_key       | /data/mydata/ssl/mysql.key  | 
  13. +---------------+-----------------------------+ 
3.3 啟動slave同步進程,串連主伺服器
 
  1. mysql> change master to  
  2.     -> master_host='172.16.1.18', 
  3.     -> master_user='backup_ssl', 
  4.     -> master_password='redhat', 
  5.     -> master_log_file='mysql-bin.000001', 
  6.     -> master_ssl=1, 
  7.     -> master_ssl_ca='/data/mydata/ssl/cacert.pem', 
  8.     -> master_ssl_cert='/data/mydata/ssl/mysql.crt', 
  9.     -> master_ssl_key='/data/mydata/ssl/mysql.key'; 
  10. mysql> start slave 
  11. mysql> show slave status\G; ##查看slave狀態 
關注以下參數:
 
  1. Slave_IO_Running: Yes      ##IOthread是否運行,如果為No代表slave運行不正常 
  2. Slave_SQL_Running: Yes     ##SQLthread是否運行,如果為No代表slave運行不正常 
  3. Master_SSL_CA_File: /data/mydata/ssl/cacert.pem  ##是否啟用了ssl 
  4. Master_SSL_Cert: /data/mydata/ssl/mysql.crt 
  5. Master_SSL_Key: /data/mydata/ssl/mysql.key 
  6. Master_Log_File: mysql-bin.000023                ##最後接收的主伺服器的二進位 
  7. Exec_Master_Log_Pos: 1087                        ##最後執行的位置,查看master中是不是該位置 
  8. Last_IO_Errno: 0                                 ##最後一次IOthread有沒有報錯 
如果與累似,slave基本正常,下面測試 四.測試4.1 主伺服器上建立一資料庫
 
  1. mysql> create database testssl; 
4.2 從伺服器上查看有沒有同步過去
 
  1. mysql> show databases; 
如果同步成功,說明沒有錯誤4.3 從伺服器mysql基於ssl串連主伺服器,查看串連狀態是否加密
 
  1. mysql -ubackup_ssl -predhat -h172.16.1.18 --ssl-cert=/data/mydata/ssl/mysql.crt \
  2. --ssl-key=/data/mydata/ssl/mysql.key 
查看串連狀態
 
  1. mysql> status; 
  2. Current user:       backup_ssl@slave.laoguang.me 
  3. SSL:            Cipher in use is DHE-RSA-AES256-SHA 
由此可知串連是加密的,可以用tcpdump抓包測試到此基於SSL的mysql主從同步構建完畢,如果你的從伺服器是新加的,先將主伺服器最近一次的完整備份恢複到從伺服器,並從同步完整備份後的二進位日誌,即change master時添加master_log_op=n, n代表完整備份後的二進位位置,其它的基本一致。 後記:今天嘗試只給slave簽發認證,master擁有有CA的認證,理論上應該能成功的,不過就是串連不上,所以暫時放棄,然後嘗試master的認證名字為master.crt,slave的認證為slave.crt結果也連不上,後來google,把master與slave的認證,私密金鑰都叫mysql.crt,mysql.key才得以完成,有瞭解的人說明一下,單認證為何不行,兩個認證名稱不一致也不行在原因,感謝! 

本文出自 “Free Linux,Share Linux” 部落格,請務必保留此出處http://laoguang.blog.51cto.com/6013350/1079787

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.