MySQL 帳號由三元組唯一識別:'user'@'host'。相同用戶名、不同 Host 視為不同帳號,權限獨立。
-- 同一用戶,不同來源不同密碼、不同權限
GRANT SELECT ON db1.* TO 'abc'@'server1' IDENTIFIED BY 'pass1';
GRANT SELECT ON db2.* TO 'abc'@'server2' IDENTIFIED BY 'pass2';
此設計允許同一用戶名在不同來源擁有完全隔離的權限與憑證,極大增強靈活性。
mysql.user 全域權限、mysql.db 資料庫級權限、tables_priv/columns_priv 表/欄級權限,判斷操作是否允許。| 權限 | 範圍 | 操作範例 |
|---|---|---|
| SELECT | 全域/庫/表/欄 | SELECT 查詢 |
| INSERT | 全域/庫/表/欄 | INSERT 新增 |
| UPDATE | 全域/庫/表/欄 | UPDATE 修改 |
| DELETE | 全域/庫/表/欄 | DELETE 刪除 |
| INDEX | 全域/庫/表 | CREATE/DROP INDEX |
| ALTER | 全域/庫/表 | ALTER TABLE |
| CREATE | 全域/庫/表 | CREATE TABLE/DATABASE |
| DROP | 全域/庫/表 | DROP TABLE/DATABASE |
| GRANT OPTION | 全域/庫/表 | GRANT/REVOKE 授權他人 |
| REFERENCES | 全域/庫/表/欄 | 建立外鍵約束 |
| CREATE VIEW | 全域/庫/表 | CREATE VIEW |
| SHOW VIEW | 全域/庫/表 | SHOW CREATE VIEW |
| TRIGGER | 全域/庫/表 | CREATE TRIGGER |
| LOCK TABLES | 全域/庫/表 | LOCK TABLES |
| 權限 | 操作範例 | 風險等級 |
|---|---|---|
| RELOAD | FLUSH TABLES/PRIVILEGES/LOGS | 高 |
| SHUTDOWN | mysqladmin shutdown | 極高 |
| PROCESS | SHOW PROCESSLIST, KILL | 高(可見敏感 SQL) |
| FILE | SELECT ... INTO OUTFILE, LOAD DATA INFILE | 極高(任意檔案讀寫) |
| SUPER | CHANGE MASTER, KILL 任何連線, SET GLOBAL, PURGE BINARY LOGS | 極高 |
| REPLICATION SLAVE | 讀取 Master Binlog | 中 |
| REPLICATION CLIENT | SHOW MASTER/SLAVE STATUS | 低 |
| CREATE USER | CREATE/DROP/RENAME USER | 高 |
mysql 系統資料庫的 MyISAM 表(user、db、tables_priv、columns_priv、procs_priv、proxies_priv)。SELECT * FROM mysql.user WHERE User='abc';GRANT/REVOKE 會自動同步更新授權表並快取到記憶體。FLUSH PRIVILEGES 強制重載快取(通常 GRANT 自動觸發)。-- 建立應用帳號:僅允許特定 IP、特定庫、CRUD 權限
CREATE USER 'app_user'@'192.168.1.100' IDENTIFIED BY 'Str0ngP@ss!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'192.168.1.100';
FLUSH PRIVILEGES;
-- 建立唯讀報表帳號
CREATE USER 'report_user'@'192.168.1.200' IDENTIFIED BY 'ReadOnly#2024';
GRANT SELECT ON myapp.* TO 'report_user'@'192.168.1.200';
FLUSH PRIVILEGES;
-- 移除危險預設帳號
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE Host='%';
FLUSH PRIVILEGES;
GRANT SELECT ON db1.* TO 'user'@'%'; 允許任意主機連線 → 極高風險。生產環境嚴禁 '%',改用具體 IP 或 CIDR('user'@'192.168.1.%')。