閱讀384 返回首頁    go 阿裏雲 go 技術社區[雲棲]


DB賬號防泄密,請立刻為數據庫加把鎖!(附演示視頻)

作者介紹

賀春暘金融MySQL專家,《MySQL管理之道》第一版、第二版作者。曾任職於中國移動飛信、機鋒安卓市場,擁有豐富的數據庫管理經驗。目前致力於MySQL、Linux等開源技術的研究。

 

一、技術實施背景

 

區別於傳統型互聯網公司,互聯網金融公司對數據安全性要求較高。目前我們是用MariaDB的多源複製技術把線上的核心業務庫同步過來,聚集成一個大的匯總庫提供給數據模型部門分析數據,以及開發人員排查問題等。

 

由於業務日漸壯大,擁有DB賬號的人數也越來越多,這裏就存在著一個安全隱患:周末我們在咖啡廳連接數據庫排查問題,如果被別人用嗅探工具監聽,那麼發生數據泄密的幾率就會大大增加。

 

為了防止這種情況,我們就需要用SSL(Secure Sockets Layer 安全套接層協議)來實現客戶端與服務器端之間的通信是進行加密的,沒有了密鑰,就無法解開加密的數據,從而保證通信的私密性。

 

二、安全連接概述

 

默認情況下客戶端(PHP/JAVA等)連接MySQL/MariaDB傳輸數據是不加密的,可以通過下麵的命令來驗證這一點:

 


\

 

如果服務器支持安全連接,則值將設置為YES。如果未編譯TLS模塊,則值將設置為NO。DISABLED表示服務器已使用TLS模塊進行編譯,但未使用TLS模塊啟動,這通常是缺省情況。

 

你可以驗證下TLS庫是否動態鏈接,例:

 


\

 

三、設置MariaDB SSL和安全客戶端連接

 

SSL是利用密鑰的加密技術(RSA)來作為用戶端與服務器端在傳送數據時的加密通訊協議。這裏我們用通俗的語言來解釋下這幾個文件的含義:ca-cert.pem就是房產證,server-cert.pem就是門鎖,client-key.pem就是鑰匙。當你的證件齊全時,進到你家裏才是合法的。

 

0?wx_fmt=png

 

Step 1 - 升級OpenSSL

 

由於Centos6.8自帶的OpenSSL版本太低,其自身的漏洞可能會帶來安全隱患,故這裏升級到最新版。

 


\

 

默認是安裝在/usr/local/bin/目錄下。

 

Step 2 - 創建CA證書

 

# mkdir -p /etc/mysql/ssl/

# cd /etc/mysql/ssl/

 

1、創建CA證書頒發機構的密鑰文件

 

# sudo /usr/local/bin/openssl genrsa 2048 > ca-key.pem

 

20170324093333666.jpg

 

2、創建CA證書頒發機構的證書文件

 

# sudo /usr/local/bin/openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem

 

20170324093343834.jpg

 

注:Common Name (e.g. server FQDN or YOUR name) []:這裏的名字不能有重複的,分表設置為:

 

CA common Name : MariaDB admin

Server common Name: MariaDB server

Client common Name: MariaDB client

 

Step 3 - 創建server端證書

 

1、創建server端密鑰文件

 

# sudo /usr/local/bin/openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem

 

20170324093353252.jpg

 

2、創建server端RSA密鑰文件

 

# sudo /usr/local/bin/openssl rsa -in server-key.pem -out server-key.pem

 

20170324093403359.jpg

 

3、創建server端證書

 

20170324093410761.jpg

 

Step 4 - 創建client端證書

 

創建client端密鑰文件

# sudo /usr/local/bin/openssl req -newkey rsa:2048 -days 7 -nodes

-keyout client-key.pem -out client-req.pem

 

20170324093418835.jpg

 

注:-days 7是密鑰有效期為7天,過期後失效。

 

2、創建client端RSA密鑰文件

 

# sudo /usr/local/bin/openssl rsa -in client-key.pem -out client-key.pem

 

20170324093427810.jpg

 

3、創建client端證書

 

#sudo /usr/local/bin/openssl x509 -req -in client-req.pem -days 7 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

 

20170324093435252.jpg

 

注:-days 7是證書有效期為7天,過期後失效。

 

Step 5 - 如何驗證證書?

 

#sudo /usr/local/bin/openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

 

20170324093442839.jpg

 

注:如上圖兩個OK,代表成功。

 

Step 6 - MariaDB服務端開啟SSL加密

 

1、編輯my.cnf添加如下參數

 


\

 

注:在[mysqld]下麵添加。

 

2、重啟mysqld進程

 

# mysqladmin shutdown

# mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &

 

3、輸入show variables like '%ssl%';查看是否生效,如出現下圖的兩個YES,代表成功開啟SSL

 

20170324093451619.jpg

 

Step 7 - MariaDB客戶端使用SSL加密連接

 

1、創建SSL賬號權限

 


\

 

2、mysql命令行登錄連接

 

將ca-cert.pem文件、client-cert.pem文件、client-key.pem拷貝到客戶端目錄下,輸入下麵的命令進行登錄連接:

 

# cd /etc/mysql/ssl

# mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem

--ssl-key=client-key.pem -h192.168.143.244 -udemo -pdemo -P3308

 

20170324093501629.jpg

 

沒有密鑰文件是無法連接的,如上圖所示。

 

登錄進去後,輸入status命令,可以看到已經使用SSL信息:

 

20170324093509156.jpg

 

3、Sqlyog/Navicat客戶端登錄連接

 

由於我是用最新的OpenSSL,所以Sqlyog/Navicat客戶端也需要下載最新版本,才可以驗證通過。

 

Sqlyog連接:

 

20170324093517624.jpg

 

Navicat連接:

 

20170324093525107.jpg

 

注:打個廣告,誰有Navicat for MySQL v11.2.16的注冊碼?

 

Step 8 - SSL加密驗證

 

1、使用360開源的MySQL Sniffer工具嗅探

 

測試結果:DB開啟了SSL,mysql-sniffer工具失效,無法探測到傳輸數據

視頻地址:https://pan.baidu.com/s/1kVzAvK7

 

2、使用tcpdump工具嗅探

 

注:感謝DBA邱文輝協同測試

 

# tcpdump -i em2 port 3308 -l -s 0 -w - | strings > 1.txt

 

1)用未加密用戶連接,腳本:

 


\

 

測試結果:

# more 1.txt(可以看到是明文傳輸的)

 

20170324093535513.jpg

 

2)用SSL加密用戶連接

 

測試結果:

# more 2.txt(可以看到是數據已經是亂碼了,加密成功)

 

20170324093544348.jpg

文發布時間為:2017-03-24

本文來自雲棲社區合作夥伴DBAplus


最後更新:2017-05-16 11:31:35

  上一篇:go  如何使用數據庫12.2簡化數據驗證代碼?
  下一篇:go  觸類旁通,從400錯誤看Nginx常見故障與修複