學長告訴我,大廠MySQL都是通過SSH連線的

2022-08-09 12:03:04

大家好,我是咔咔 不期速成,日拱一卒

一、背景

之前待的幾個公司,資料庫、伺服器許可權都是給所有後端直接拉滿的,但也會出現員工離職的情況,每次有人離職時都需要改資料庫密碼、伺服器密碼。

每次密碼修改後得告知所有開發修改本地密碼,但這樣的事情也不是經常發生,公司雖小但很穩定。

假設你所待的公司是一個開發非常多的公司,有可能你待了一年還沒認識全,人員流動的速度也非常快,這時上面那種方案的執行成本就非常高了。

若此時把這個問題拋給你,讓你解決你會有什麼方案?

接下來給大家介紹兩種方案,一種傳統方案另一種是通過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進行連線的。

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

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