首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料庫管理員指南:用戶帳號與權限管理

     編輯:MySQL 資料庫相關知識

MySQL 權限系統概覽

MySQL 管理員應知曉如何設置用戶帳號,規定誰能連線、從哪裡連線、連線後能做什麼。MySQL 3.22.11 引入 GRANT 和 REVOKE 兩條語句簡化此工作。它們作為 MySQL 資料庫前端角色,提供不同於直接操作授權表的方法。GRANT 和 REVOKE 影響 4 個授權表:

  • user:能連線伺服器的用戶及其全域權限
  • db:資料庫級權限
  • tables_priv:表級權限
  • columns_priv:欄位級權限

第 5 個授權表 host 不受 GRANT/REVOKE 影響。對用戶發出 GRANT 時,在 user 表建立記錄;若指定全域權限也記錄在 user;資料庫、表、欄位級權限分別記錄在 db、tables_priv、columns_priv。用 GRANT/REVOKE 比直接修改授權表容易,但建議閱讀《MySQL 安全性指南》理解授權表運作機制。

1. 建立用戶並授權

GRANT 語法:

GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION

需填寫部分:

  • privileges:授予用戶的權限,分三組:
    • 資料庫/表/欄位級:ALTER、CREATE、DELETE、DROP、INDEX、INSERT、REFERENCES、SELECT、UPDATE
    • 管理權限:FILE、PROCESS、RELOAD、SHUTDOWN
    • 特殊:ALL(所有權限)、USAGE(無權限,僅建立用戶)
  • ON what:權限作用範圍。*.* 表示所有資料庫所有表;db_name.* 表示特定資料庫所有表;db_name.tbl_name 表示特定表;db_name.tbl_name(col_name) 表示特定欄位。
  • TO user:用戶格式為 user_name@host。MySQL 允許同一用戶名從不同主機連線並獨立賦予權限。主機可用主機名、IP、通配符 %(任意主機)、%.domain.com(特定網域)、192.168.128.%(IP 模式)、192.168.128.0/17(CIDR 表示法)。若用戶名含空格需加引號:"my friend"@host。
  • IDENTIFIED BY "password":可選。新用戶若無此子句則無密碼(不安全);現有用戶指定密碼會替換舊密碼。GRANT 會自動加密密碼,勿像 SET PASSWORD 那樣用 PASSWORD() 函數。
  • WITH GRANT OPTION:可選。包含則用戶可透過 GRANT 將權限授予其他用戶。

用戶名、密碼、資料庫名、表名在授權表中區分大小寫;主機名、欄位名不區分。

1.1 誰能連線、從哪裡連線

  • 限制單一主機:GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY "ruby"
  • 允許任意主機:GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"(% 為通配符,max@% 等同 max,最簡單但最不安全)
  • 限制特定網域:GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTIFIED BY "quartz"
  • 使用 IP 地址:GRANT ALL ON samp_db.* TO boris@192.168.128.3 IDENTIFIED BY "ruby"、GRANT ALL ON samp_db.* TO fred@192.168.128.% IDENTIFIED BY "quartz"、GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIED BY "ruby"

1.2 用戶應有何級別權限、適用於何處

  • 全域權限:最強大,適用於任何資料庫。建立超級用戶:GRANT ALL ON *.* TO ethel@localhost IDENTIFIED BY "coffee" WITH GRANT OPTION。出於安全,限制超級用戶連線主機。
  • 管理權限(FILE、PROCESS、RELOAD、SHUTDOWN)只能用 ON *.* 授予。可單獨授予,如建立只能執行 FLUSH 的用戶:GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass"。管理權限應吝嗇授予。
  • 資料庫級權限:GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIED BY "rock";建立唯讀用戶:GRANT SELECT ON samp_db.* TO ro_user@% IDENTIFIED BY "rock"。
  • 列舉多個權限:GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db.* TO bill@snake.net IDENTIFIED BY "rock"。
  • 表級與欄位級權限:GRANT SELECT ON samp_db.member TO bill@localhost IDENTIFIED BY "rock";GRANT UPDATE (expiration) ON samp_db.member TO bill@localhost(無需重複密碼)。多欄位用逗號分隔:GRANT UPDATE (street,city,state,zip) ON samp_db.* TO assistant@localhost。
  • 臨時資料庫技巧:若想讓用戶建立臨時表但不影響主資料庫,可建立單獨資料庫(如 tmp)授予所有權限:GRANT ALL ON tmp.* TO ""@mars.net(空用戶名匹配任意用戶)。用戶可用 tmp.tbl_name 形式引用。

1.3 是否允許管理權限

可授予資料庫擁有者控制資料庫存取權,指定 WITH GRANT OPTION。例如:GRANT ALL ON sales.* TO alicia@%.big.corp.com IDENTIFIED BY "applejuice" WITH GRANT OPTION。WITH GRANT OPTION 允許用戶將授權權利授予他人。注意:擁有 GRANT 權限的兩用戶可互相授權;若一用戶只有 SELECT,另一用戶有 GRANT+SELECT,後者更「強大」。

2. 撤銷權限並刪除用戶

REVOKE 語法類似 GRANT,但 TO 換成 FROM,無 IDENTIFIED BY 和 WITH GRANT OPTION:

REVOKE privileges (columns) ON what FROM user

user 部分必須匹配原 GRANT 中要撤銷的用戶;privileges 部分無需完全匹配,可部分撤銷。REVOKE 僅刪除權限,不刪除用戶。即使撤銷所有權限,user 表中記錄仍保留,用戶仍能連線。要完全刪除用戶,必須用 DELETE 明確從 user 表刪除記錄:

mysql -u root mysql
mysql> DELETE FROM user WHERE User="user_name" AND Host="host_name";
mysql> FLUSH PRIVILEGES;

DELETE 刪除用戶記錄,FLUSH 告知伺服器重載授權表(用 GRANT/REVOKE 時自動重載,直接修改授權表則不會)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved