共計 1807 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要介紹“MySQL 權限控制的簡單介紹”,在日常操作中,相信很多人在 MySQL 權限控制的簡單介紹問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL 權限控制的簡單介紹”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
背景:MySQL-5.7.11-GA
1.MySQL 權限控制的簡單介紹
2. 需求
3. 實現中需要解決的幾個問題
4. 初步方案的設計
5. 改進方案的設想
1.MySQL 權限控制的簡單介紹
MySQL 的權限控制,從范圍上,由大到小分為三個級別:MySQL 級,DB 級,對象級;
MySQL 級指的是對 MySQL 實例本身產生影響的操作,包括但不限于修改 MySQL 的參數,如 buffer_pool_size;關閉 / 啟動 MySQL 等等,比較明顯的特點在于 MySQL 級別的操作權限沒有指定具體的數據庫(同樣意味著對任何 MySQL 實例中的數據庫生效,類似于全局權限的意思),(特殊的情況:創建數據庫,雖然會指定數據庫名,但是這個數據庫本身不存在,所以也算是 MySQL 級的權限);
DB 級指的是針對已存在的具體數據庫的操作,包括修改數據庫的字符集,創建或者刪除具體的已存在的數據庫等,比較明顯的特點在于 DB 級的操作權限是限制在特定的數據庫中;
對象級的操作主要指影響的是某個數據庫內部的對象,例如表,索引,存儲過程等;
不同級別之間權限的相互影響:采用交集,即 MySQL 級 +DB 級 + 對象級;
可以得出 MySQL 權限設置有兩個特點,
DB 級和對象級的權限,在設置的時候就必須要指明具體的 DB 和對象,如果 DB 和對象未知,則只能靠 MySQL 級的去設置全局權限,針對現有 / 新創建的 DB 和對象生效;
如果在高級別設置了權限,則會取所有級別的權限的交集,比如設置了 create,insert on *.*(MySQL 級別),create on testdb.*(DB 級)中,MySQL 級(全局權限)禁止掉的 insert 不會生效,依然可以 insert 數據到 testdb 的表中;但是設置了 create,insert on testdb.*(DB 級)和 create on *.*(MySQL 級)時,用戶是可以在 testdb 進行 insert 操作的,意味著在高級別的權限上,設置的 –“沒有 insert 權限”并不會覆蓋低級別上單獨賦予的“insert 權限”。
如圖:
權限控制在 MySQL 中的實現:具體的權限設置存儲于 MySQL 系統庫的一些表里面,MySQL 級的設置存在于 user 表中,當一個 client 試圖連接 MySQL 實例的時候,會先檢查這個表中的權限(包括賬戶名,密碼,HOST 的驗證),通過之后,才能連接到 MySQL 實例。
其他級別的設置會保存在 db,tables_priv,column_priv 等表里面,具體信息可以在數據庫中查看。
2. 需求
希望能夠有一個“admin”角色,具備 root 的所有權限,除了修改 MySQL 的 global 設置和主從設置等;
3. 實現中需要解決的幾個問題
首先想到的辦法就是:grant all on *.* to admin@ % with grant option,然后 revoke super on *.* from admin@ %,不過問題來了,在這種設置下,admin 是可以直接 update mysql.user 表,然后手動添加 super 權限的;
而且如果要能創建新的 DB,且為新的用戶賦予新 DB 的各種權限的話,就需要至少是 Create+ 增刪改查的權限,且對象為全局(on *.*),那么同樣的,admin 一樣可以修改 mysql.user 表。
4. 初步方案的設計
使用 shell 腳本,在里面添加 sudo mysql -u -p - e 來完成創建新 DB,創建新用戶,授權等操作,然后禁止所使用的系統用戶對這個腳本的 cat,vim,vi 等文本操作權限;
這種方案的問題也不少:其他的用戶可以登錄 DB Server;腳本中保存的 root 密碼可能會被自身不熟悉的方式獲取;etc…
5. 改進方案的設想
如果有個 web 就好了,能夠屏蔽所有服務器端的細節和操作,在頁面上點點點就做完了_(:з」∠)_
到此,關于“MySQL 權限控制的簡單介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!