學長告訴我,大廠MySQL都是通過SSH連接的
大家好,我是咔咔 不期速成,日拱一卒
一、背景
之前待的幾個公司,資料庫、伺服器許可權都是給所有後端直接拉滿的,但也會出現員工離職的情況,每次有人離職時都需要改資料庫密碼、伺服器密碼。
每次密碼修改後得告知所有開發修改本地密碼,但這樣的事情也不是經常發生,公司雖小但很穩定。
假設你所待的公司是一個開發非常多的公司,有可能你待了一年還沒認識全,人員流動的速度也非常快,這時上面那種方案的執行成本就非常高了。
若此時把這個問題拋給你,讓你解決你會有什麼方案?
接下來給大家介紹兩種方案,一種傳統方案另一種是通過SSH來實現的。
二、傳統方案
MySQL版本:8.0.26
其中最簡單的方案就是給每個人在資料庫添加一個帳號,具體步驟如下:
創建新用戶
create user "kaka"@"%" identified by 'qwerty123456';
其中kaka為自定義的用戶名;%為登錄域名,host為’%'時表示為 任意IP,為localhost時表示本機,或者填寫指定的IP地址;qwerty123456為密碼
為用戶授權
grant all privileges on kaka.* to "kaka"@"%" with grant option;
或
grant all on *.* to "kaka"@"%";
其中kaka.*,kaka為數據名,*為所有表,如果想授權全部表就把kaka.*寫成*.*,當然這裡是以開發庫為基礎的,所有的許可權都得給。當前也可以給予部分許可權。
刷新許可權
flush privileges;
使用用戶名:kaka進行登錄
發現kaka用戶只有兩個庫,kaka庫就是授權的庫,當切換系統庫時發現是沒有許可權的。
在切到kaka庫,是可以做正常的curd操作的
給予部分許可權
grant update on kaka.* to "kaka"@"%";
flush privileges;
若想給多個許可權,則逗號隔開即可,update,select,insert ….,執行完切記需要刷新許可權,否則不會生效
撤銷全部許可權
這塊有點小插曲,當執行撤銷命令後報了這樣一個錯
Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
查閱了一下官方文檔,原因是由於root用戶沒有SYSTEM_USER許可權,把許可權加入後即可解決
grant system_user on *.* to 'root';
revoke all privileges ,grant option from kaka;
或
revoke all privileges on kaka.* from kaka;
flush privileges;
插銷部分許可權
revoke select on kaka.* from kaka;
kaka.*為表名,kaka為用戶名
員工離職刪除用戶即可
drop from kaka;
kaka 為用戶名
嗯,成功的把MySQL許可權給複習了一遍…..
三、通過SSH隧道連接MySQL資料庫
準備工作
| 主機名 | 角色 | IP | 埠 |
|---|---|---|---|
| kaka1 | MySQL主機 | 47.93.12.204 | 3306 |
| kaka2 | 遠程伺服器 | 8.142.40.202 | 33888 |
修改MySQL主機僅允許遠程伺服器連接
use mysql;
update user set host='8.142.40.202' where user = "root";
此時在MySQL主機伺服器是直接登錄不了的
配置SSH連接MySQL主機
在遠程主機執行
ssh -fN -L33888:47.93.12.204:3306 [email protected]
在使用SSH連接使用時發現部分人員說是連接一直在斷,影響了正常開發,只需要加上下面這個參數重新執行即可,這個參數是每60秒發送一個KeepAlive請求,保證終端不會因為超時空閑而斷開連接
ssh -o ServerAliveInterval=60 -fN -L33888:47.93.12.204:3306 [email protected]
注意前邊是遠程伺服器 後邊是遠程主機的伺服器帳號、伺服器地址
命令執行完成後,可以通過命令
mysql -h 127.0.0.1 -P 33888 -uroot -p
密碼是MySQL伺服器的 MySQL密碼
四、本地開發連接
上述通過兩台伺服器給大家做了演示,接下來看看開發人員如何連接開發資料庫
同樣在本地也執行命令
ssh -fN -L3306:47.93.12.204:3306 [email protected]
在host配置文件中進行域名映射
// 127.0.0.1 MySQL伺服器地址
127.0.0.1 8.142.40.202
使用Navicat進行連接
可以看到已經連接上了
這樣就強制讓所有開發人員通過SSH來連接MySQL,當有一個開發離職後,只需要刪除對應的伺服器帳號即可
五、限制Linux用戶登錄
你肯定也想到了,通過SSH連接使用的伺服器帳號密碼,那麼就意味著所有開發者都可以用過自己的帳號密碼進行登錄伺服器。
上有政策,下有對策,接下來看看如何限制用戶登錄伺服器。
例如現在添加了用戶niuniu,此時該用戶是肯定可以連接到伺服器的
可以看到當前用戶通過Xsheel連接上了伺服器,伺服器許可權還是給部分人開通比較好,接下來就來限制該用戶登錄伺服器
執行命令
usermod -s /sbin/nologin niuniu
用戶niuniu通過Xsheel登錄伺服器,可以看到返回當前帳號不可用,說明我們想要的結果已經有了

再看看本地Navicat連接是否正常

截止到這裡就已經完成了所有的安全措施。
六、擴展一:WITH GRANT OPTION
這個參數是可選的,如果不加,那這句話到這就結束了,這個用戶就是一級,他不能再去建子用戶了,如果給了,就代表可以建子帳號,當然子用戶能分出去的許可權僅限他自己有的許可權
注意一點,這裡的操作只能分配給已有的賬戶,創建新賬戶需要另外的許可權
並且,還得有GRANT許可權,不然的話就算有這個許可權但是沒有執行這個許可權的許可權
七、擴展二:Linux用戶操作
添加用戶
useradd {username}
刪除用戶
vipw
進去之後刪除對應的用戶名即可
groupdel {username}
rm -rf /home/{username}
設置密碼
passwd {username}
需要輸入兩遍,注意
八、總結
本文給大家介紹兩種應對開發者離職後,資料庫許可權收回的方案。一種是通過MySQL本身欄位的許可權、另一種是通過SSH來連接,目前咔咔所在的公司是通過SSH進行連接的。
在介紹這兩種方案時發現了很多可以擴展的知識點,也一併寫了出來,當你看這篇文章時就不用再一次進行查資料了。
「
堅持學習、堅持寫作、堅持分享是咔咔從業以來所秉持的信念。願文章在偌大的互聯網上能給你帶來一點幫助,我是咔咔,下期見。
」











