一、背景
之前待的幾個公司,數據庫、服務器權限都是給所有后端直接拉滿的,但也會出現員工離職的情況,每次有人離職時都需要改數據庫密碼、服務器密碼。
每次密碼修改后得告知所有開發修改本地密碼,但這樣的事情也不是經常發生,公司雖小但很穩定。
假設你所待的公司是一個開發非常多的公司,有可能你待了一年還沒認識全,人員流動的速度也非常快,這時上面那種方案的執行成本就非常高了。
若此時把這個問題拋給你,讓你解決你會有什么方案?
給大家介紹兩種方案,一種傳統方案另一種是通過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端口kaka1MySQL主機47.93.12.2043306kaka2遠程服務器8.142.40.20233888
修改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 root@8.142.40.202
在使用SSH連接使用時發現部分人員說是連接一直在斷,影響了正常開發,只需要加上下面這個參數重新執行即可,這個參數是每60秒發送一個KeepAlive請求,保證終端不會因為超時空閑而斷開連接
ssh -o ServerAliveInterval=60 -fN -L33888:47.93.12.204:3306 root@8.142.40.202
注意前邊是遠程服務器 后邊是遠程主機的服務器賬號、服務器地址
命令執行完成后,可以通過命令
mysql -h 127.0.0.1 -P 33888 -uroot -p
密碼是MySQL服務器的 MySQL密碼
四、本地開發連接
上述通過兩臺服務器給大家做了演示,接下來看看開發人員如何連接開發數據庫
同樣在本地也執行命令
ssh -fN -L3306:47.93.12.204:3306 root@8.142.40.202
在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進行連接的。
在介紹這兩種方案時發現了很多可以擴展的知識點,也一并寫了出來,當你看這篇文章時就不用再一次進行查資料了。