1. 程式人生 > >通道信息加密工具--Qtunnel

通道信息加密工具--Qtunnel

mysql 容災備份 數據加密 異地傳輸 qtunnel

數據庫做異地容災是一個很常見的現象,既然信息要跨地域傳遞,要麽就很土豪的打通機房之間的鏈路或者動用VPN,要不然就不可避免的走公網網絡傳輸信息。既然選擇了公網,那麽數據庫的語句就很容易被人監聽到,所以把那些明文加密是必不可少的環節。


mysql支持tls/ssl加密方法對信息進行加密,這個方法的配置也很簡單,就是兩邊各加上一個nginx,一個是正向代理一個是反向代理,配上ssl證書,然後就像配置網站https協議那樣,在nginx.conf裏開啟ssl監聽即可。


但是這種方法有一點小問題,就是在進行SSL握手之前,mysql 會發送Server Greeting和Login Request數據包,然後才有可能使用SSL握手。這樣步驟就多了一步鑒權,對訪問性能有所影響。所以這個時候,我選擇了另一個用於加密client和server之間鏈路通信的工具----Qtunnel,因為它直接加密,速度更快。


Git的地址在這裏:https://github.com/arstercz/qtunnel ,感謝arstercz大神的再加工!


上面說過了Qtunnel是不需要認證的,默認加密方法是RC4,以字節流的方式加密明文的每一個字節,而且密鑰長度最長支持256位,可以很好的抵禦暴力搜索密鑰的攻擊,總而言之,Qtunnel是一個輕量且快速的加解密工具,而且還可以搭配atlas等數據庫中間件使用。


下面我們就做一個實驗,看一下Qtunnel實現加密的全過程。


由於Qtunnel是用go語言寫的,所以需要先安裝golang,centos服務器的yum安裝方法如下:

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install -y golang


go語言安裝完畢之後,我們就#git clone https://github.com/arstercz/qtunnel.git ,獲得qtunnel文件夾,文件夾內容如下:

技術分享


#make,如果沒有任何報錯,那麽就是安裝成功了,使用#./bin/qtunnel -h語句驗證一番:

技術分享


本次實驗的計劃是這樣的:用A機器訪問B機器的mysql,並且插入數據,在B機器上的3306端口抓包,查看數據是否是明文;然後再在A機器和B機器上都安裝qtunnel並且啟動,然後重新插入數據,在B機器上的端口抓包,查看數據是否被加密。流程圖如下:

技術分享

A機器和B機器都是使用阿裏雲虛擬服務器,版本都是6.4,現在我們的加密實驗正式開始。


首先A和B機器上都不啟動qtunnel,然後我們在A機器上登陸B機器的數據庫,(如果之前沒有授權,那麽授權語句是:

GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘A機器的IP地址‘ IDENTIFIED BY ‘密碼‘ WITH GRANT OPTION;


登陸之後,我們隨意的插一個語句,然後通過抓包發現無論這個語句還是數據庫的反饋都是以明文的形式呈現,如圖:

技術分享


這種讓數據裸奔的行為無疑於找死,那麽這個時候我們就要配置一下qtunnel,來看一下它的加密效果。


在A服務器上,我們設定qtunnel是客戶端,手動建立一個conf文件,比如#vim /etc/conn.conf,內容如下:

[client1]
faddr = 10.252.215.108:3309    #這裏是qtunnel客戶端的IP
baddr = 10.175.193.239:3310    #這裏是qtunnel服務端的IP
cryptoMethod = rc4             #這裏選用rc4的方式加密
secret = 3301_test%Iad      #rc4密鑰,服務端的密碼必須跟這個一致!
clientmode = true              #表示這端是客戶端


然後使用#./bin/qtunnel -conf=/etc/conn.conf -daemon -logto=syslog啟動qtunnel,看一下進程和端口情況,如圖:

技術分享


在B服務器上,同樣手動建立一個配置文件,假設也叫conn.conf,內容如下:

[server1]
faddr = 10.175.193.239:3310    #這裏是qtunnel服務端的IP
baddr = 10.175.193.239:3306    #這裏是數據庫的地址,由於在同一臺機器上,所以地址一樣
cryptoMethod = rc4    
secret = 3301_test%Iad      #rc4密鑰,跟client密鑰一致
clientmode = false             #表示這是服務器端


也用同樣的語句啟動,查看3310這個端口已經被監聽了:

技術分享


現在,我們在A服務器上來重新連接B數據庫,是要註意!這個時候mysql裏的-h不能再是B的IP地址了,而是A的地址!因為qtunnel現在已經打通了一個通道,訪問qtunnel的3310端口就等於是訪問B數據庫的3306端口(有點類似atlas的意思)。


連上之後,我們隨意插入一些語句,看一下qtunnel的能力:

技術分享


可見這個時候,抓包顯示都是加密的文字了,實驗成功!


總結一下:qtunnel 采用 rc4加密,在算法強度和速度方面是很好的選擇,不會引起 slave 太大的延遲,對管理員或開發而言數據都是透明的(如果在上面的實驗啟動了qtunnel之後,不監聽3310端口,而是監聽3306端口,得到的依舊是明文),只是在兩端傳輸的過程中增加了加解密處理。核心的業務(比如用戶和充值)在做異地架構的時候可以考慮該方式增強數據的安全性。


《mysql使用ssl簡析》:https://hsulei.com/2017/10/19/mysql%E4%BD%BF%E7%94%A8ssl%E7%AE%80%E6%9E%90/

《使用ssl加密mysql 5.6的官方文檔》:

https://dev.mysql.com/doc/refman/5.6/en/encrypted-connections.html


本文出自 “生活就是等待戈多” 博客,請務必保留此出處http://chenx1242.blog.51cto.com/10430133/1982020

通道信息加密工具--Qtunnel