MySQL基于SSL協(xié)議進(jìn)行主從復(fù)制的詳細(xì)操作教程
當(dāng)mysql跨越互聯(lián)網(wǎng)進(jìn)行復(fù)制時(shí)別人可以竊取到mysql的復(fù)制信息,這些信息是明文的,因此存在不安全性,這里通過(guò)ssl對(duì)復(fù)制的信息進(jìn)行加密。當(dāng)在客戶沒(méi)有固定ip而要訪問(wèn)服務(wù)器時(shí),mysql要允許任意地址的訪問(wèn),服務(wù)端和客戶端通過(guò)證書(shū)驗(yàn)證可以防止暴力破解。
開(kāi)始之前讓我們先來(lái)回顧一下SSL協(xié)議客戶端OpenSSL的安裝過(guò)程:
安裝openssl
mkdir /test/setup cd /test/setup tar zxvf openssl-0.9.8b.tar.gz cd openssl-0.9.8b ./config make && make install
開(kāi)啟mysql中ssl功能
登錄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 | | +---------------+----------+
如果mysql輸出如上所述,那么繼續(xù)操作開(kāi)啟ssl;如果不是,重新編譯安裝mysql,注意生成makefile時(shí)填寫(xiě)參數(shù)正確。
退出mysql,編輯/etc/my.cnf
在[mysqld]和[mysqldump]之間,加入下列配置信息:
ssl
保存后重新啟動(dòng)mysql,再次登錄mysql
mysql -uroot -p mysql> show variables like '%ssl%';
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+-------+
好了,下面進(jìn)入正題:
mysql基于ssl復(fù)制
1、創(chuàng)建證書(shū)中心
在主服務(wù)器上創(chuàng)建證書(shū)中心
cd /etc/pki/CA
生成私鑰
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自簽證書(shū),由于需要輸入大量用戶信息,因此編輯證書(shū)的配置文件,在私有的CA上創(chuàng)建證書(shū)要注意所有的用戶信息要和CA中的一致,從國(guó)家到部門(mén)都要相同,否則會(huì)造成證書(shū)無(wú)法使用
vim /etc/pki/tls/openssh.cnf
[ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = CN countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrpovinceName_default = FJ localityName = Locality Name (eg,city) localityName = FZ O.organizationName = Organization Name (eg,company) O.organizationName_default = zdz organizationalUnitName = Organizational Unit Name (eg,section) organizationalUnitName_default = zdz
生成自簽證書(shū)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
-x509是創(chuàng)建自簽證書(shū)是需要的參數(shù),在創(chuàng)建其他證書(shū)時(shí)不能加該參數(shù)
由于是自簽證書(shū)因此要修改證書(shū)路徑
vim /etc/pki/tls/openssl.cnf
[ CA_defalut ] dir = /etc/pki/CA certs = $dir/certs #存放生成證書(shū)的目錄 crl_dir = $dir/crl #存放吊銷(xiāo)證書(shū)的目錄 database = $dir/index.txt #證書(shū)的索引文件 new_certs_dir = $dir_newcerts #新簽的證書(shū)目錄 serial = $dir/serial #序列號(hào) crl = $dir/crl.pem private_key = $dir/private/cakey.pem #證書(shū)中心私鑰文件
創(chuàng)建證書(shū)編號(hào)
mkdir certs crl newcerts touch index.txt echo 00 > serial
2、為主服務(wù)器創(chuàng)建證書(shū)
服務(wù)器的名稱必須固定,在申請(qǐng)證書(shū)時(shí)要輸入服務(wù)器名稱,證書(shū)和服務(wù)器名稱對(duì)應(yīng)
創(chuàng)建私鑰
mkdir /usr/local/mysql/ssl cd /usr/local/mysql/ssl (umask 077;openssl genrsa -out /usr/local/mysql/ssl/master.key 2048)
生成證書(shū)申請(qǐng)
openssl req -new -key master.key -out master.csr
在證書(shū)服務(wù)器上對(duì)master的證書(shū)進(jìn)行簽發(fā)
openssl ca -in master.csr -out master.crt -days 365
3、創(chuàng)建從服務(wù)器證書(shū)
(umask 077;openssl genrsa -out /usr/local/mysql/ssl/slave.key 2048) openssl req -new -key slave.key -out slave.csr
將從服務(wù)器的證書(shū)申請(qǐng)文件復(fù)制到證書(shū)服務(wù)器上進(jìn)行簽發(fā)
opessl ca -in slave.csr -out slave.crt -days 356
4、修改證書(shū)權(quán)限和mysql配置文件
將證書(shū)的公鑰cacert.pem復(fù)制到主從服務(wù)器的目錄下
cd /usr/local/mysql/ssl cp /etc/pki/CA/cacert.pem ./ chown -R mysql:mysql master.crt master.key cacert.pem chmod 600 master.crt master.key cacert.pem vim /usr/local/mysql/my.cnf ssl ssl_ca = /usr/local/mysql/ssl/cacrt.pem ssl_cert = /usr/local/mysql/ssl/master.crt ssl_key = /usr/local/mysql/ssl/master.key
修改從服務(wù)器配置
cd /usr/local/mysql/ssl cp /etc/pki/CA/cacert.pem ./ chown -R mysql:mysql slave.crt slave.key cacert.pem chmod 600 slave.crt slave.key cacert.pem vim /usr/local/mysql/my.cnf ssl ssl_ca = /usr/local/mysql/ssl/cacrt.pem ssl_cert = /usr/local/mysql/ssl/slave.crt ssl_key = /usr/local/mysql/ssl/slave.key
5、在主服務(wù)器上創(chuàng)建復(fù)制用戶
grant replication slave on *.* to slave@'192.168.216.133' identified by 'slave' requere ssl; flush privileges;
查看主服務(wù)器當(dāng)前二進(jìn)制位置
mysql> show master status ;
+-------------------------+------------+---------------------+--------------------------+--------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------------+------------+---------------------+--------------------------+--------------------------+ | mysql-bin.000007 | 1015 | | | | +-------------------------+------------+---------------------+--------------------------+---------------------------+ 1 row in set (0.00 sec)
6、在從服務(wù)器上開(kāi)始復(fù)制
change master to master_host='192.168.216.132', master_user='slave', master_password='slave', master_log_file='mysql-bin.000007', master_log_pos=1015, master_ssl=1, master_ssl_ca=' /usr/local/mysql/ssl/cacrt.pem', master_ssl_cert='/usr/local/mysql/ssl/slave.crt', master_ssl_key='/usr/local/mysql/ssl/slave.key'; start slave;
查看狀態(tài)
錯(cuò)誤1:
如果要確保證書(shū)沒(méi)有問(wèn)題可以通過(guò)建立測(cè)試的用戶同ssl進(jìn)行連接在主服務(wù)器上開(kāi)一個(gè)權(quán)限很大的用戶,進(jìn)行ssl的登錄測(cè)試
grant all privileges on *.* to root@'192.168.216.133′ identified by ‘root' require ssl; [root@slave ssl]# mysql -uroot -proot -h192.168.216.133 –ssl-ca=cacrt.pem –ssl-cert=slave.crt –ssl-key=slave.key
Warning: Using a password on the command line interface can be insecure. ERROR 2026 (HY000): SSL connection error: ASN: before date in the future
這是由于虛擬的時(shí)間不正確導(dǎo)致
如果這時(shí)候不使用ssl方式進(jìn)行連接則會(huì)報(bào)出錯(cuò)誤
[root@slave ssl]# mysql -uroot -proot -h192.168.216.133;
Warning: Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user ‘root'@'192.168.216.132′ (using password: YES)
錯(cuò)誤2:
在配置文件中添加證書(shū)配置后執(zhí)行 show variables like ‘%ssl%'顯示
這是由于沒(méi)有將證書(shū)的屬主改為mysql,可以從日志中得知是無(wú)權(quán)限獲取私鑰
相關(guān)文章
淺談為什么MySQL不建議delete刪除數(shù)據(jù)
這篇文章主要介紹了淺談為什么MySQL不建議delete刪除數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01mysql between實(shí)現(xiàn)選取介于兩個(gè)值之間的數(shù)據(jù)范圍
這篇文章主要介紹了mysql between實(shí)現(xiàn)選取介于兩個(gè)值之間的數(shù)據(jù)范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07解決mysql報(bào)錯(cuò):1264-Out of range value for&nb
這篇文章主要介紹了解決mysql報(bào)錯(cuò):1264-Out of range value for column ‘字段‘ at row 1問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Mysql select in 按id排序?qū)崿F(xiàn)方法
有時(shí)候我們?cè)诤笈_(tái)選擇了一系列的id,我們想安裝填寫(xiě)id的順序進(jìn)行排序,那么就需要下面的order by方法,測(cè)試通過(guò)2013-03-03使用Python的Django框架中的壓縮組件Django Compressor
這篇文章主要介紹了使用Python的Django框架中的壓縮組件Django Compressor,這個(gè)工具主要用于實(shí)現(xiàn)js/css的壓縮,需要的朋友可以參考下2015-05-05mysql如何導(dǎo)出服務(wù)器內(nèi)所有的數(shù)據(jù)庫(kù)
這篇文章主要介紹了mysql如何導(dǎo)出服務(wù)器內(nèi)所有的數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10