本文目錄一覽:
如何配置MySQL SSL?
MySQL默認的數據通道是不加密的,在一些安全性要求特別高的場景下,我們需要配置MySQL端口為SSL,使得數據通道加密處理,避免敏感信息泄漏和被篡改。
當然,啟用MySQL
SSL之後,由於每個數據包都需要加密和解密,這個對MySQL的性能是有不小影響的,讀者們在使用的時候,要根據實際情況斟酌。
MySQL客戶端登錄服務器時候的密碼不是明文傳輸,有加密策略處理。
筆者是在
ubuntu12.04
系統上使用MySQL
5.5版本測試的,其他環境請讀者自行匹配。
配置MySQL服務器證書
編輯
/etc/mysql/my.cnf
文件
#
ssl-ca=/etc/mysql/cacert.pem
#
ssl-cert=/etc/mysql/server-cert.pem
#
ssl-key=/etc/mysql/server-key.pem
把上面三行默認證書配置注釋打開,使用自己的證書。筆者就使用上次在搭建自己的CA服務
–
OpenSSL
CA
實戰文章中生成的證書
ssl-ca=/home/yunweipai/user_certs/ca_cert.cer
ssl-cert=/home/yunweipai/user_certs/web.cer
ssl-key=/home/yunweipai/user_certs/web_key_plain.pem
這裡需要注意的是,在ubuntu上,配置證書後如果不生效,參考這裡解決方法
注意上面配置的
web_key_plain.pem
文件,由於MySQL不支持加密後的私鑰,因此我們使用命令
openssl
rsa
-in
web_key.pem
-passin
pass:Yunweipai@123
-out
web_key_plain.pem
將私鑰解密。MySQL不支持私鑰加密的原因是從安全性角度考慮,因為如果要用戶傳遞一個加密的私鑰,那麼必須要用戶傳密碼,那麼MySQL怎麼存儲這個密碼呢?這就引出了我們在密碼存儲和傳輸的安全建議裡面提到的一系列問題了。
所以MySQL為了簡化實現,就不支持私鑰加密。
指定客戶端連接方式
MySQL服務端在對客戶端授權的時候,可以通過選項指定客戶端連接MySQL
服務器的SSL級別,參考MySQL賦權的
REQUIRE值:
ssl_option
SSL:
不認證客戶端,客戶端不需要提供證書
X509:
客戶端必須發送一個有效的X509證書
issuer:
客戶端的證書是否是服務器所配置的CA頒發的(在我們場景下是ca_cert.cer頒發的證書)
subject:
認證證書的subject(關於證書的subject在之前的文章有介紹)
cipher:
指定加密算法
這些選項可以疊加使用,如:X509|issuser
客戶端連接(SSL方式)
mysql
客戶端連接
mysql
-u
root
-pChangeme_123
-P
3306
–ssl-ca=/home/yunweipai/user_certs/ca_cert.cer
Welcome
to
the
MySQL
monitor.
Commands
end
with
;
or
\g.
Your
MySQL
connection
id
is
36
Server
version:
5.5.43-0ubuntu0.12.04.1
(Ubuntu)
Copyright
(c)
2000,
2015,
Oracle
and/or
its
affiliates.
All
rights
reserved.
Oracle
is
a
registered
trademark
of
Oracle
Corporation
and/or
its
affiliates.
Other
names
may
be
trademarks
of
their
respective
owners.
Type
‘help;’
or
‘\h’
for
help.
Type
‘\c’
to
clear
the
current
input
statement.
mysql
\s
————–
mysql
Ver
14.14
Distrib
5.5.43,
for
debian-linux-gnu
(i686)
using
readline
6.2
Connection
id:
36
Current
database:
Current
user:
root@localhost
SSL:
Cipher
in
use
is
DHE-RSA-AES256-SHA
Current
pager:
stdout
Using
outfile:
”
Using
delimiter:
;
Server
version:
5.5.43-0ubuntu0.12.04.1
(Ubuntu)
Protocol
version:
10
Connection:
Localhost
via
UNIX
socket
Server
characterset:
latin1
Db
characterset:
latin1
Client
characterset:
latin1
Conn.
characterset:
latin1
UNIX
socket:
/var/run/mysqld/mysqld.sock
Uptime:
29
sec
Threads:
1
Questions:
109
Slow
queries:
Opens:
48
Flush
tables:
1
Open
tables:
41
Queries
per
second
avg:
3.758
————–
JDBC連接
在jdbc字符串中增加下面參數
useSSL=trueverifyServerCertificate=false
這麼就不需要客戶端配置證書了,配置就簡單很多。因為mysql本身有賬號口令認證,因此不需要證書認證。
如何使用python連接mysql數據庫
在 Python 語言環境下我們這樣連接數據庫。
In [1]: from mysql import connector
In [2]: cnx = connector.connect(host=”172.16.192.100″,port=3306,user=”appuser”,password=”xxxxxx”)
但是連接數據庫的背後發生了什麼呢?
答案
當我們通過驅動程序(mysql-connector-python,pymysql)連接 MySQL 服務端的時候,就是把連接參數傳遞給驅動程序,驅動程序再根據參數會發起到 MySQL 服務端的 TCP 連接。當 TCP 連接建立之後驅動程序與服務端之間會按特定的格式和次序交換數據包,數據包的格式和發送次序由 MySQL 協議 規定。MySQL 協議:整個連接的過程中 MySQL 服務端與驅動程序之間,按如下的次序發送了這些包。
MySQL 服務端向客戶端發送一個握手包,包里記錄了 MySQL-Server 的版本,默認的授權插件,密碼鹽值(auth-data)。
2. MySQL 客戶端發出 ssl 連接請求包(如果有必要的話)。
3. MySQL 客戶端發出握手包的響應包,這個包時記錄了用戶名,密碼加密後的串,客戶端屬性,等等其它信息。
4. MySQL 服務端發出響應包,這個包里記錄了登錄是否成功,如果沒有成功也會給出錯誤信息。
如何解決MySQL在高版本需指明是否進行SSL連接問題
如何解決MySQL在高版本需指明是否進行SSL連接問題
Java使用mysql-jdbc連接MySQL出現如下警告:
Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
在mysql連接字符串url中加入ssl=true或者false即可,如下所示。
url=jdbc:mysql://127.0.0.1:3306/framework?characterEncoding=utf8useSSL=true
如何為MySQL服務器和客戶機啟用SSL
用戶想要與MySQL服務器建立一條安全連接時,常常依賴VPN隧道或SSH隧道。不過,獲得MySQL連接的另一個辦法是,啟用MySQL服務器上的SSL封裝器(SSL wrapper)。這每一種方法各有其優缺點。比如說,在出現多條短時間MySQL連接的高度動態環境下,VPN或SSH隧道也許是比SSL更好的選擇,因為後者建立每條連接時需要成本高昂的SSL握手計算。另一方面,如果是長時間運行的MySQL連接比較少的那些應用,基於SSL的加密可能很合理。由於MySQL服務器已經內置了SSL支持功能,你不需要實施VPN或SSH隧道之類單獨的安全層,這種隧道有其自己的維護開銷。
在MySQL服務器中實施SSL可以加密在服務器與客戶機之間來回傳輸的所有數據,因而防止廣域網或數據中心裏面可能出現的竊聽或數據嗅探行為。此外,SSL還通過SSL證書提供了身份驗證機制,因而可以保護用戶,遠離可能出現的網絡釣魚攻擊。
我們在本文中將介紹如何啟用MySQL服務器上的SSL。請注意:同樣過程適用於MariaDB服務器。
創建Server SSL證書和私鑰
我們必須為MySQL服務器創建SSL證書和私鑰,通過SSL連接到服務器時要用到它們。
首先,創建一個臨時的工作目錄,我們將把私鑰和證書文件放在該目錄下。
$ sudo mkdir ~/cert $ cd ~/cert
確保OpenSSL已安裝在運行MySQL服務器的系統上。通常,所有Linux發行版在默認情況下都安裝了OpenSSL。想檢查一下OpenSSL有沒有安裝,不妨使用下面這個命令。
$ openssl version OpenSSL 1.0.1f 6 Jan 2014
現在,繼續創建CA私鑰和證書。下面這些命令將創建ca-key.pem和ca-cert.pem。
$ openssl genrsa 2048 ca-key.pem $ openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem ca-cert.pem
第二個命令會詢問你幾個問題。你在這些字段里填入什麼並不重要。只管填好那些字段。
下一步是為服務器創建私鑰。
$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem server-req.pem
這個命令會再次詢問幾個問題,你可以填寫上一步中提供的相同答案。
下一步,使用下面這個命令,將服務器的私鑰導出成RSA類型的密鑰。
$ openssl rsa -in server-key.pem -out server-key.pem
最後,使用CA證書,創建服務器證書。
$ openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 server-cert.pem
配置MySQL服務器上的SSL
完成上述過程後,我們應該有了CA證書、服務器的私鑰及其證書。下一步就是配置MySQL服務器,以便使用私鑰和證書。
在配置MySQL服務器之前,檢查一下SSL選項已被啟用還是被禁用。為此,登錄進入到MySQL服務器,輸入下面這個查詢。
mysql SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;,
該查詢的結果會如同下圖。
請注意:“have_openssl”和“have_ssl”變量的默認值是“被禁用”,如下所示。想啟用MySQL服務器中的SSL,繼續執行下列步驟。
1. 將ca-cert.pem、server-cert.pem和server-key.pem拷貝或移動到/etc目錄下。
$ sudo mkdir /etc/mysql-ssl $ sudo cp ca-cert.pem server-cert.pem server-key.pem /etc/mysql-ssl
2. 使用文本編輯工具,打開服務器的my.cnf配置文件。添加或去掉注釋[mysqld]部分中類似下面內容的幾行。這些應該指向你放在/etc/mysql-ssl中的私鑰和證書。
[mysqld] ssl-ca=/etc/mysql-ssl/ca-cert.pem ssl-cert=/etc/mysql-ssl/server-cert.pem ssl-key=/etc/mysql-ssl/server-key.pem
3. 在my.cnf中,還要找到“bind-address = 127.0.0.1”,並將它改成:
bind-address = *
那樣一來,你就可以從另一個主機連接到MySQL服務器了。
4. 重啟MySQL服務。
$ sudo service mysql restart 或 $ sudo systemctl restart mysql 或 $ sudo /etc/init.d/mysql restart
你只要查看MySQL錯誤日誌文件(比如/var/log/mysql/mysql.log),就可以檢查SSL配置有沒有問題。要是錯誤日誌中沒有警告或錯誤(就像下面的屏幕截圖),這表明SSL配置沒有問題。
驗證SSL配置的另一個辦法就是,在MySQL服務器裡面再次運行“have_%ssl”查詢。
mysql SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;
創建擁有SSL權限的用戶
服務器端的SSL配置完成後,下一步就是創建有權通過SSL訪問MySQL服務器的用戶。為此,登錄進入到MySQL服務器,輸入下面內容:
mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;
把“ssluser”(用戶名)和“dingdong”(密碼)換成你自己的用戶名和密碼。
如果你想分配一個特定的IP地址(比如192.168.2.8),以便用戶從該地址來訪問服務器,那就改而使用下列查詢。
mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’192.168.2.8’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;
配置MySQL客戶機上的SSL
鑒於MySQL服務器端配置已完成,不妨將目光轉移到客戶機端。就MySQL客戶機而言,我們就需要基於服務器的CA私鑰和證書,創建新的私鑰和證書。
在服務器的CA私鑰和證書駐留於其中的MySQL服務器主機上運行下列命令。
$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem client-req.pem
類似服務器端配置,上述命令會詢問幾個問題。只管填好字段,就像前面所做的那樣。
我們還需要將創建的客戶機私鑰轉換成RSA類型,如下所示。
$ openssl rsa -in client-key.pem -out client-key.pem,
最後,我們需要使用服務器的CA私鑰和證書,創建客戶機證書。
$ openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 client-cert.pem
現在,將ca-cert.pem、client-cert.pem和client-key.pem文件轉移到你想要運行MySQL客戶機的任何主機上。
在客戶機主機上,使用下面這個命令,通過SSL連接到MySQL服務器。
$ mysql –ssl-ca=ca-cert.pem –ssl-cert=client-cert.pem –ssl-key=client-key.pem -h -u ssluser -p
在輸入ssluser的密碼後,你會看到如往常那樣的MySQL提示符。
想檢查一下你有沒有使用SSL,在提示符處輸入狀態命令。
mysql status;
如果你已通過SSL連接上去,它會在SSL字段顯示密碼信息,如下所示。
原創文章,作者:KXZK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148102.html