mysql連接可分為socket連接和TCP|IP連接兩種。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),谷城企業(yè)網(wǎng)站建設(shè),谷城品牌網(wǎng)站建設(shè),網(wǎng)站定制,谷城網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,谷城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
[root@localhost bin]# mysql -uroot -p123456 -S/tmp/mysql.sock
-S/tmp/mysql.sock可以省略,因為默認參數(shù)如下:
假如sock文件另有其它,那么就后面不能省略,需要指定下。
mysql -h127.0.0.1 -P3306 -uroot -p123456
那么問題來了,如何知道當(dāng)前連接的連接方式?
查看當(dāng)前連接方式,使用\s 或者status命令
Connection: Localhost via UNIX socket 表示使用 socket 進行本地的連接
SSL: Not in use 沒有使用SSL
Connection: 127.0.0.1 via TCP/IP 使用TCP/IP 協(xié)議進行遠程連接
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256 使用了SSL加密
mysql5.7默認是使用SSL的方式來進行通訊的。
/s輸出SSL: Not in use,說明當(dāng)前沒有使用SSL連接。
再看下error.log有一個waning:failed to set up SSL because of the following SSL liberary error:SSL context is not usable withut certificate and private key。公密鑰文件不存在,所以無法啟用SSL的連接方式。
1、進入bin目錄執(zhí)行命令: mysql_ssl_rsa_setup 在/data 根目錄 生成相關(guān)的*.pem 密鑰文件。
2、對新生成到pem文件授權(quán)chown mysql:mysql *.pem
3、 /etc/init.d/mysqld restart 重啟mysql
4、進入命令客戶端執(zhí)行\(zhòng)s
使用IP/TCP遠程連接時,\s輸出 SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256。說明已經(jīng)用上SSL加密。
使用socket進行本地連接,就不會使用SSL加密。\s輸出SSL: Not in use;
因為SSL開啟可能有性能影響。如果不希望使用ssl加密登錄連接,那么可以使用下面命令進行禁用:mysql -h127.0.0.1 -uroot -p123456 --ssl-mode=DISABLED
強制一個用戶使用ssl
之后david用戶就必須使用ssl登錄了,否則報錯如下:
取消一個用戶強制使用ssl
x509認證在開啟SSL的基礎(chǔ)下,還強制指定用戶必須使用client-cert.pem和client-key.pem證書、密鑰文件來登錄,否則登錄不了。x509是mysql最高等級的認證機制。
之前已經(jīng)在data根目錄生成了8個 *.pem文件
把其中client-cert.pem和client-key.pem導(dǎo)出
如下,再使用之前的命令登錄。發(fā)現(xiàn)登錄不了了。
此時想要登錄必須在客戶端指定SSL CERT File和SSL Key File 如下在navicat中
在mysql workbench中
在MySQL中修改用戶的語法如下:
看了這么一大坨東西,感覺啥也沒有告訴我,一臉懵逼。下面我們一起來解讀一下具體的每一個選項的含義。
對于這個大家應(yīng)該有所了解。
首先它是被中括號包裹起來的,表示是可選的不是必須的,也就是說在我們的 alter user 語句中,這個 IF EXISTS 可以不出現(xiàn)不是必須要寫的。但是為什么還要有這個呢,這個選項出現(xiàn)的目的是為了讓你在執(zhí)行一個 alter user 語句的時候,如果語句中指定的數(shù)據(jù)庫用戶不存在(或者你寫用戶名稱的是寫錯了),而不至于出現(xiàn)一個錯誤的信息,如果指定了 IF EXISTS 這個詞,他就會以一個警告的信息提示你而不是直接給你一個錯誤信息。
更直白一下就是:如果你的 alter user 的語句中指定的用戶確實存在,那么就執(zhí)行你的語句,如果不存在呢,就不執(zhí)行你的語句,跳過這個 alter user 的指令??词纠?/p>
在上面的例子中,第一個修改用戶的語句,沒有使用 if exists 關(guān)鍵詞直接修改了一個不存在的用戶的信息,結(jié)果直接出現(xiàn)了錯誤信息,接著我們使用了 if exists 關(guān)鍵詞,結(jié)果SQL語句執(zhí)行成功,只是出現(xiàn)了一個 warning 警告,然后我們通過 show warnings 命令查看警告信息的內(nèi)容,提示我們用戶 'zhangsanfeng'@'%' 不存在。這就是 if exists 關(guān)鍵詞的存在的意義。
當(dāng)我們修改一個用戶的信息的時候,我們需要指定用戶的名稱。這個名稱,不僅僅使我們平時登錄數(shù)據(jù)庫的時候,輸入的用戶的名字,還有一個隱含的部分就是用戶登錄的 host 網(wǎng)段,這個網(wǎng)段表示只允許該用戶通過這個網(wǎng)段登錄,如果用戶不在這個定義的網(wǎng)段內(nèi),即便是用戶名和密碼正確,也不能爭取的登錄。
下面的創(chuàng)建用戶是兩個不同的用戶。
上面的兩個用戶中,分別表示如下:
當(dāng)然,我們可以使用模糊匹配的方式來限定用戶登錄的網(wǎng)段,比如我們創(chuàng)建下面第一個用戶表示只要這個用戶登錄的時候,使用的主機的IP地址是在 10.10.0.0~10.10.255.255 這個網(wǎng)段質(zhì)檢的任何一個IP地址都可以登錄。
特殊的網(wǎng)段 localhost 。如果我們創(chuàng)建如下的用戶,則表示該用戶只能在 MySQL 數(shù)據(jù)庫所在的服務(wù)器本機上登錄。
還有另外一個特殊的網(wǎng)段 % 。它表示用戶可以通過任何一個IP地址來登錄,不對用戶登錄的主機所在的網(wǎng)段做任何限制。如下用戶就是不對它登錄的主機IP地址做任何限制。
auth_option 選項的含義表示指定用戶登錄數(shù)據(jù)庫的時候使用的驗證插件和密碼。它的選項有如下幾種,下面我們分別展開分析一下各個選項的使用場景和示例。
如果在 IDENTIFIED 關(guān)鍵字后面沒有使用 WITH 關(guān)鍵字指定使用的密碼插件名稱,則會使用 MySQL 默認的密碼插件。對于 MySQL 默認的密碼插件是什么,可以使用下面的命令進行查看:
通過上面的輸出,我們可以看出默認的密碼插件采用的是 mysql_native_password 插件,參數(shù) default_authentication_plugin 的值是可以在 MySQL 的配置文件 my.cnf 中指定的,它可以有以下兩種取值:
MySQL 的配置文件 my.cnf 中配置默認的密碼認證插件的方式如下:
如果我們要修改某一個用戶的密碼認證插件,就可以使用到 IDENTIFIED WITH auth_plugin 這個語句了。如果一個用戶它的密碼認證插件使用的是默認的 mysql_native_password ,我們想把它的密碼認證插件修改為 sha256_password ,此時我們就可以使用下面的命令來修改:
執(zhí)行完成上述命令后, xyz 這個用戶的密碼就會設(shè)置為空,并更新它的密碼為已經(jīng)過期,同時更新了它的密碼認證插件為 sha256_password ,結(jié)果如下所示:
更改用戶的密碼認知方式之后,當(dāng) xyz 再次嘗試登錄 MySQL 數(shù)據(jù)庫的時候,輸入空密碼登錄成功后,會要求其修改一下自己的密碼,然后才可以執(zhí)行其他SQL語句的操作,這個要求和我們剛安裝 MySQL 數(shù)據(jù)庫后,第一次使用 root 登錄的時候要求修改 root 的密碼是一樣的。下面是修改完成用戶 xyz 的密碼認證插件之后,嘗試使用空密碼登錄后的操作示例:
指定用戶的密碼認證插件,并設(shè)置密碼。
當(dāng)我們想給用戶指定密碼的認證插件,并且想為其設(shè)置密碼的時候,可以使用這個命令,示例如下:
這樣用戶 xyz 的密碼認證方式修改為了 mysql_native_password ,并且修改它的密碼為 xyz 。需要我們主要的是 by 關(guān)鍵字后面跟的是密碼的明文,也就是我們嘗試登錄的時候,輸入的密碼的值。
指定用戶的密碼認證插件,并設(shè)置密碼。
當(dāng)我們想給用戶指定密碼的認證插件,并且想為其設(shè)置密碼的時候,可以使用這個命令,示例如下:
這樣用戶 xyz 的密碼認證方式修改為了 mysql_native_password ,并且修改它的密碼為 xyz 。需要我們主要的是 as 關(guān)鍵字后面跟的是加密后的密碼,而不是我們的明文的密碼。如果我們想知道得到一個加密后的密碼,則可以使用下面 password() 函數(shù)來得到加密后的密碼。
這里主要是指定用戶在連接到MySQL數(shù)據(jù)庫的時候,是否需要使用加密的方式,如果使用加密的方式,則需要啟用SSL加密協(xié)議,同時也需要對MySQL進行證書的配置。
考慮到性能的問題,使用TLS加密的方式連接MySQL數(shù)據(jù)庫會對MySQL數(shù)據(jù)庫的性能有一定的影響。非必要情況下,一般不建議啟用TLS加密連接到數(shù)據(jù)庫,因為大家的MySQL數(shù)據(jù)庫一般都是針對內(nèi)網(wǎng)開放的。所以,啟用TLS加密協(xié)議連接沒有必要。
resource_option 選項中,主要是為每一個用戶設(shè)置它所能使用到資源,做資源的使用限制。示例如下:
上面四個參數(shù)的值如果為 0 ,則表示對應(yīng)的資源限制不做任何限制。
password_option 選項用來配置用戶的密碼,指定其密碼的效期。下面看幾個示例:
對于MySQL系統(tǒng)默認的有效期是多少,可以通過如下命令查看,下面的值為 0 表示密碼有效期為永久有效。
lock_option 選擇是用來鎖定和解鎖用戶的。示例如下:
用戶想要與MySQL服務(wù)器建立一條安全連接時,常常依賴VPN隧道或SSH隧道。不過,獲得MySQL連接的另一個辦法是,啟用MySQL服務(wù)器上的SSL封裝器(SSL wrapper)。這每一種方法各有其優(yōu)缺點。比如說,在出現(xiàn)多條短時間MySQL連接的高度動態(tài)環(huán)境下,VPN或SSH隧道也許是比SSL更好的選擇,因為后者建立每條連接時需要成本高昂的SSL握手計算。另一方面,如果是長時間運行的MySQL連接比較少的那些應(yīng)用,基于SSL的加密可能很合理。由于MySQL服務(wù)器已經(jīng)內(nèi)置了SSL支持功能,你不需要實施VPN或SSH隧道之類單獨的安全層,這種隧道有其自己的維護開銷。
在MySQL服務(wù)器中實施SSL可以加密在服務(wù)器與客戶機之間來回傳輸?shù)乃袛?shù)據(jù),因而防止廣域網(wǎng)或數(shù)據(jù)中心里面可能出現(xiàn)的竊聽或數(shù)據(jù)嗅探行為。此外,SSL還通過SSL證書提供了身份驗證機制,因而可以保護用戶,遠離可能出現(xiàn)的網(wǎng)絡(luò)釣魚攻擊。
我們在本文中將介紹如何啟用MySQL服務(wù)器上的SSL。請注意:同樣過程適用于MariaDB服務(wù)器。
創(chuàng)建Server SSL證書和私鑰
我們必須為MySQL服務(wù)器創(chuàng)建SSL證書和私鑰,通過SSL連接到服務(wù)器時要用到它們。
首先,創(chuàng)建一個臨時的工作目錄,我們將把私鑰和證書文件放在該目錄下。
$ sudo mkdir ~/cert $ cd ~/cert
確保OpenSSL已安裝在運行MySQL服務(wù)器的系統(tǒng)上。通常,所有Linux發(fā)行版在默認情況下都安裝了OpenSSL。想檢查一下OpenSSL有沒有安裝,不妨使用下面這個命令。
$ openssl version OpenSSL 1.0.1f 6 Jan 2014
現(xiàn)在,繼續(xù)創(chuàng)建CA私鑰和證書。下面這些命令將創(chuàng)建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
第二個命令會詢問你幾個問題。你在這些字段里填入什么并不重要。只管填好那些字段。
下一步是為服務(wù)器創(chuàng)建私鑰。
$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem server-req.pem
這個命令會再次詢問幾個問題,你可以填寫上一步中提供的相同答案。
下一步,使用下面這個命令,將服務(wù)器的私鑰導(dǎo)出成RSA類型的密鑰。
$ openssl rsa -in server-key.pem -out server-key.pem
最后,使用CA證書,創(chuàng)建服務(wù)器證書。
$ 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服務(wù)器上的SSL
完成上述過程后,我們應(yīng)該有了CA證書、服務(wù)器的私鑰及其證書。下一步就是配置MySQL服務(wù)器,以便使用私鑰和證書。
在配置MySQL服務(wù)器之前,檢查一下SSL選項已被啟用還是被禁用。為此,登錄進入到MySQL服務(wù)器,輸入下面這個查詢。
mysql SHOW GLOBAL VARIABLES LIKE 'have_%ssl';,
該查詢的結(jié)果會如同下圖。
請注意:“have_openssl”和“have_ssl”變量的默認值是“被禁用”,如下所示。想啟用MySQL服務(wù)器中的SSL,繼續(xù)執(zhí)行下列步驟。
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. 使用文本編輯工具,打開服務(wù)器的my.cnf配置文件。添加或去掉注釋[mysqld]部分中類似下面內(nèi)容的幾行。這些應(yīng)該指向你放在/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服務(wù)器了。
4. 重啟MySQL服務(wù)。
$ sudo service mysql restart 或 $ sudo systemctl restart mysql 或 $ sudo /etc/init.d/mysql restart
你只要查看MySQL錯誤日志文件(比如/var/log/mysql/mysql.log),就可以檢查SSL配置有沒有問題。要是錯誤日志中沒有警告或錯誤(就像下面的屏幕截圖),這表明SSL配置沒有問題。
驗證SSL配置的另一個辦法就是,在MySQL服務(wù)器里面再次運行“have_%ssl”查詢。
mysql SHOW GLOBAL VARIABLES LIKE 'have_%ssl';
創(chuàng)建擁有SSL權(quán)限的用戶
服務(wù)器端的SSL配置完成后,下一步就是創(chuàng)建有權(quán)通過SSL訪問MySQL服務(wù)器的用戶。為此,登錄進入到MySQL服務(wù)器,輸入下面內(nèi)容:
mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;
把“ssluser”(用戶名)和“dingdong”(密碼)換成你自己的用戶名和密碼。
如果你想分配一個特定的IP地址(比如192.168.2.8),以便用戶從該地址來訪問服務(wù)器,那就改而使用下列查詢。
mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’192.168.2.8’ IDENTIFIED BY 'dingdong' REQUIRE SSL; mysql FLUSH PRIVILEGES;
配置MySQL客戶機上的SSL
鑒于MySQL服務(wù)器端配置已完成,不妨將目光轉(zhuǎn)移到客戶機端。就MySQL客戶機而言,我們就需要基于服務(wù)器的CA私鑰和證書,創(chuàng)建新的私鑰和證書。
在服務(wù)器的CA私鑰和證書駐留于其中的MySQL服務(wù)器主機上運行下列命令。
$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem client-req.pem
類似服務(wù)器端配置,上述命令會詢問幾個問題。只管填好字段,就像前面所做的那樣。
我們還需要將創(chuàng)建的客戶機私鑰轉(zhuǎn)換成RSA類型,如下所示。
$ openssl rsa -in client-key.pem -out client-key.pem,
最后,我們需要使用服務(wù)器的CA私鑰和證書,創(chuàng)建客戶機證書。
$ openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 client-cert.pem
現(xiàn)在,將ca-cert.pem、client-cert.pem和client-key.pem文件轉(zhuǎn)移到你想要運行MySQL客戶機的任何主機上。
在客戶機主機上,使用下面這個命令,通過SSL連接到MySQL服務(wù)器。
$ mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h -u ssluser -p
在輸入ssluser的密碼后,你會看到如往常那樣的MySQL提示符。
想檢查一下你有沒有使用SSL,在提示符處輸入狀態(tài)命令。
mysql status;
如果你已通過SSL連接上去,它會在SSL字段顯示密碼信息,如下所示。
1、首先明確你的MySQL版本是否支持或是否開啟SSL:
show global variables like 'have_%ssl';
2、確認OpenSSL安裝并加入PATH系統(tǒng)路徑環(huán)境變量
3、正確創(chuàng)建號證書
4、通過my.cnf或者命令行在mysql啟動的時候加載證書配置,例如:
mysqld --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem
5、客戶端連接時同樣要記得加載證書