詳解MySQL 用戶權限管理
前言:
不清楚各位同學對數據庫用戶權限管理是否瞭解,作為一名 DBA ,用戶權限管理是繞不開的一項工作內容。特別是生產庫,數據庫用戶權限更應該規范管理。本篇文章將會介紹下 MySQL 用戶權限管理相關內容。
1.用戶權限簡介
當我們創建過數據庫用戶後,還不能執行任何操作,需要為該用戶分配適當的訪問權限。
關於 MySQL 用戶權限簡單的理解就是數據庫隻允許用戶做你權利以內的事情,不可以越界。比如隻允許你執行 select 操作,那麼你就不能執行 update 操作。隻允許你從某個 IP 上連接 MySQL ,那麼你就不能從除那個 IP 以外的其他機器連接 MySQL 。
在 MySQL 中,用戶權限也是分級別的,可以授予的權限有如下幾組:
- 列級別,和表中的一個具體列相關。例如,可以使用 UPDATE 語句更新表 students 中 student_name 列的值的權限。
- 表級別,和一個具體表中的所有數據相關。例如,可以使用 SELECT 語句查詢表 students 的所有數據的權限。
- 數據庫級別,和一個具體的數據庫中的所有表相關。例如,可以在已有的數據庫 mytest 中創建新表的權限。
- 全局,和 MySQL 中所有的數據庫相關。例如,可以刪除已有的數據庫或者創建一個新的數據庫的權限。
權限信息存儲在 mysql 系統庫的 user、db、tables_priv、columns_priv、procs_priv 這幾個系統表中。
- user 表:存放用戶賬戶信息以及全局級別(所有數據庫)權限。
- db 表:存放數據庫級別的權限,決定瞭來自哪些主機的哪些用戶可以訪問此數據庫。
- tables_priv 表:存放表級別的權限,決定瞭來自哪些主機的哪些用戶可以訪問數據庫的這個表。
- columns_priv 表:存放列級別的權限,決定瞭來自哪些主機的哪些用戶可以訪問數據庫表的這個字段。
- procs_priv 表:存放存儲過程和函數級別的權限。
參考官方文檔,可授予的權限如下表所示:
看起來各種可授予的權限有很多,其實可以大致分為數據、結構、管理三類,大概可分類如下:
2.權限管理實戰
我們一般用 grant 語句為數據庫用戶賦權,建議大傢先用 create user 語句創建好用戶之後再單獨進行授權。下面通過示例來具體看下:
# 創建用戶 create user 'test_user'@'%' identified by 'xxxxxxxx'; # 全局權限 GRANT super,select on *.* to 'test_user'@'%'; # 庫權限 GRANT select,insert,update,delete,create,alter,execute on `testdb`.* to 'test_user'@'%'; # 表權限 GRANT select,insert on `testdb`.tb to 'test_user'@'%'; # 列權限 GRANT select (col1), insert (col1, col2) ON `testdb`.mytbl to 'test_user'@'%'; # GRANT命令說明: super,select 表示具體要授予的權限。 ON 用來指定權限針對哪些庫和表。 *.* 中前面的*號用來指定數據庫名,後面的*號用來指定表名。 TO 表示將權限賦予某個用戶。 'test_user'@'%' 表示test_user用戶,@後面接限制的主機,可以是IP、IP段、域名以及%,%表示任何地方。 # 刷新權限 flush privileges; # 查看某個用戶的權限 show grants for 'test_user'@'%'; # 回收權限 revoke delete on `testdb`.* from 'test_user'@'%';
權限管理是一件不容忽視的事,我們不能為瞭方便而給數據庫用戶很大的權限。特別是對於生產庫,更應該進行權限管控,建議程序用戶隻賦予增刪改查等基礎權限,個人用戶隻賦予查詢權限。
出於安全考慮,建議遵循以下幾個經驗原則:
- 隻授予能滿足需要的最小權限,防止用戶幹壞事。比如用戶隻是需要查詢,那就隻給 select 權限就可以瞭。
- 創建用戶的時候限制用戶的登錄主機,一般是限制成指定 IP 或者內網 IP 段。
- 給各個服務單獨創建數據庫用戶,單個用戶最好隻能操作單個庫。
- 及時記錄各數據庫用戶權限等信息,以免忘記。
- 若有外部系統調用,應配置隻讀用戶,並且權限要精確到表或視圖。
- 定期清理不需要的用戶,回收權限或者刪除用戶。
以上就是詳解MySQL 用戶權限管理的詳細內容,更多關於MySQL 用戶權限管理的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found