您好,登錄后才能下訂單哦!
Contents [hide]
在生產(chǎn)環(huán)境下,安全總是無法忽視的問題,數(shù)據(jù)庫安全則是重中之重,因為所有的數(shù)據(jù)都存放在數(shù)據(jù)庫中。MySQL在5.7版本之前對于安全問題的確考慮并不充分,導(dǎo)致存在比較大的隱患,比如下面的這些問題,可能有些小伙伴知道,有些卻還不知道:
1.MySQL數(shù)據(jù)庫默認(rèn)安裝的用戶密碼為空
2.所有用戶擁有對于MySQL默認(rèn)安裝test數(shù)據(jù)庫的訪問權(quán)限(即使沒有授予權(quán)限)
好在Oracle官方也已經(jīng)意識到安全的重要性,MySQL 5.7開始安裝完成后的root用戶的密碼不再是空,而是在安裝時隨機(jī)產(chǎn)生一個密碼,這也導(dǎo)致了用戶安裝5.7時發(fā)現(xiàn)的與5.6版本比較大的一個不同點。其次,官方已經(jīng)刪除了test數(shù)據(jù)庫,默認(rèn)安裝完后是沒有test數(shù)據(jù)庫的。更為重要的是,MySQL 5.7版本提供了更為簡單SSL安全訪問配置,并且默認(rèn)連接就采用SSL的加密方式。
首先看下維基百科是如何定義SSL的:
Transport Layer Security (TLS) and its predecessor, Secure Sockets Layer (SSL), both of which are frequently referred to as ‘SSL’, are cryptographic protocols designed to provide communications security over a computer network.
從上面的定義來看,SSL指的是SSL/TLS,其是一種為了在計算機(jī)網(wǎng)絡(luò)進(jìn)行安全通信的加密協(xié)議。假設(shè)用戶的傳輸不是通過SSL的方式,那么其在網(wǎng)絡(luò)中以明文的方式進(jìn)行傳輸,而這給別有用心的人帶來了可乘之機(jī)。所以,現(xiàn)在很多網(wǎng)站其實默認(rèn)已經(jīng)開啟了SSL功能,比如Facebook、Twtter、YouTube、淘寶等。
在數(shù)據(jù)庫領(lǐng)域,之前Inside君去某公司做技術(shù)交流時,該公司介紹其運維平臺能夠?qū)σ恍┟舾凶侄巫鎏幚?,比如取出的密碼或資金數(shù)據(jù)用***來表示,那么DBA就無法看到這部分的私人數(shù)據(jù)內(nèi)容。這本身是一個很不錯的安全處理方式,但若DBA在本地裝一個類似tcpdump的工具,則依然能夠通過獲取得到的包得到想要的數(shù)據(jù)。因此,除了在程序端進(jìn)行展示的安全處理,還需在MySQL服務(wù)器端開啟安全的加密通信功能,這時就是SSL發(fā)揮功能的時候了。
如果仔細(xì)閱讀MySQL 5.7的安裝文檔INSTALL-BINARY,會發(fā)現(xiàn)5.7的安裝文檔在初始化數(shù)據(jù)目錄之后還額外多做了一個操作,這是之前版本所沒有的操作,而該步驟即是對于SSL的安裝與配置:
1
2
3
4
|
......
shell> bin/mysqld --initialize --user=mysql
shell> bin/mysql_ssl_rsa_setup
......
|
運行完命令mysql_ssl_rsa_setup后會發(fā)現(xiàn)數(shù)據(jù)目錄下多出了一些以pem結(jié)尾的文件,而這些文件就是開啟SSL連接所需要的文件:
1
2
3
4
5
6
7
8
9
|
root@test-1:/usr/local/mysql/data# ls -lh *.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 client-cert.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 client-key.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 private_key.pem
-rw-r--r-- 1 mysql mysql 451 Nov 25 14:12 public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Nov 25 14:12 server-cert.pem
-rw------- 1 mysql mysql 1.7K Nov 25 14:12 server-key.pem
|
若這時啟動MySQL數(shù)據(jù)庫并啟動應(yīng)該可以發(fā)現(xiàn)如下狀態(tài):
1
2
3
4
5
6
7
|
mysql>SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
1 row in set (0.00 sec)
|
該參數(shù)表示MySQL服務(wù)器開啟了SSL功能,而在MySQL 5.7版本下默認(rèn)就會使用SSL的方式來進(jìn)行連接,比如:
1
2
3
4
5
6
7
8
9
|
root@test-1:~# mysql -h20.166.224.32 -udavid
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.9, for linux-glibc2.5 (x86_64) using EditLine wrapper
Connection id: 6119
Current database:
Current user: david@10.166.224.32
SSL: Cipher in use is DHE-RSA-AES256-SHA
......
|
通過STATUS的SSL列就能判斷連接的用戶是否使用了SSL,比如上述例子中的Cipher in use is DHE-RSA-AES256-SHA就表示當(dāng)前david用戶是通過SSL的方式進(jìn)行連接。若在創(chuàng)建用戶時,希望該用戶每次必須通過SSL方式,則需在創(chuàng)建用戶通過REQUIRE SSL來進(jìn)行設(shè)置,對于上述的david用戶,可以通過如下方式來進(jìn)行修改以確保每次通過SSL進(jìn)行連接,強(qiáng)制不使用SSL進(jìn)行連接則報錯:
1
2
3
4
|
mysql> ALTER USER david@'%' REQUIRE SSL;
......
root@test-1:~# mysql -h20.166.224.32 -udavid --ssl=0
ERROR 1045 (28000): Access denied for user 'david'@'10.166.224.32' (using password: YES)
|
MySQL 5.6同樣支持以SSL的方式進(jìn)行連接,但是操作相對5.7較為復(fù)雜,用戶需要自己通過openssl命令來創(chuàng)建各類公密鑰,具體可以查看相關(guān)官方文檔。
相信很多小伙伴關(guān)心開啟SSL加密連接后的性能表現(xiàn),不可否認(rèn)的是啟用SSL加密連接后,性能必然會有下降。這里的測試采用全內(nèi)存SELECT主鍵的方式,因此可以認(rèn)為是最壞情況的SSL性能開銷:
上述的測試是在Inside君的云主機(jī)環(huán)境下,云主機(jī)配置只有4核CPU,故QPS值整體不高,但是應(yīng)該能夠發(fā)現(xiàn)開啟SSL后的性能開銷在25%左右。
另外,由于SSL開銷較大的環(huán)節(jié)在建立連接,所以短鏈接的開銷可能會更大,因此推薦使用長連接或者連接池的方式來減小SSL所帶來的額外開銷,不過好在MySQL的應(yīng)用習(xí)慣大部分也是長連接的方式。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。