學長告訴我,大廠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進行連接的。

在介紹這兩種方案時發現了很多可以擴展的知識點,也一併寫了出來,當你看這篇文章時就不用再一次進行查資料了。

堅持學習、堅持寫作、堅持分享是咔咔從業以來所秉持的信念。願文章在偌大的互聯網上能給你帶來一點幫助,我是咔咔,下期見。

Tags: