前言:安全始於密碼管理,精準授權是防線核心
MySQL 採用「連線驗證 + 權限檢查」兩階段存取控制。本文系統梳理六種修改密碼方法、權限表結構、GRANT/REVOKE 精準授權、常見誤區與生產環境安全基線。
一、六大修改密碼方法對比
| 方法 | 適用場景 | 需 FLUSH PRIVILEGES | 需 PASSWORD() | 權限需求 |
| 1. phpMyAdmin / 圖形工具 | 視覺化操作、批量管理 | 否 (工具自動) | 否 (工具自動) | root 或 SUPER |
| 2. mysqladmin | 命令列、腳本自動化 | 否 | 否 | root 或當前用戶 |
| 3. INSERT INTO mysql.user | 建立新用戶兼設密碼 | 是 | 是 | INSERT(mysql.user) + RELOAD |
| 4. REPLACE INTO mysql.user | 覆蓋式建立/更新用戶 | 是 | 是 | 同上 |
| 5. SET PASSWORD | SQL 標準、應用程式內嵌 | 否 | 是 (5.7 前) | 當前用戶或 UPDATE(mysql.user) |
| 6. GRANT ... IDENTIFIED BY | 授權同時設密碼 (推薦) | 否 | 否 (自動加密) | GRANT OPTION |
實操範例
-- mysqladmin (舊密碼 → 新密碼)
mysqladmin -u root -p'oldpwd' password 'newpwd'
-- SET PASSWORD (5.7+ 無需 PASSWORD())
SET PASSWORD FOR 'user'@'host' = 'newpwd'; -- 8.0
SET PASSWORD FOR 'user'@'host' = PASSWORD('newpwd'); -- 5.7
-- GRANT 授權並設密碼 (最常用)
GRANT SELECT, INSERT ON db.* TO 'user'@'%' IDENTIFIED BY 'newpwd';
-- 修改現有用戶密碼 (8.0 推薦)
ALTER USER 'user'@'%' IDENTIFIED BY 'newpwd';
二、權限模型深度解析
四層權限體系 (自上而下繼承,具體覆蓋一般)
- 全域 (Global):
mysql.user 表,適用所有庫。如 SUPER、FILE、RELOAD、SHUTDOWN。
- 庫級 (Database):
mysql.db 表,特定庫所有表。如 SELECT、INSERT、CREATE、DROP。
- 表級 (Table):
mysql.tables_priv 表,特定表特定欄位。
- 欄位級 (Column):
mysql.columns_priv 表,極細粒度控制。
關鍵權限說明
| 權限 | 層級 | 用途 | 風險 |
| ALL PRIVILEGES | 除全域外任意 | 該層級所有權限 | 高 |
| SUPER | Global | KILL、CHANGE MASTER、PURGE BINLOG 等 | 極高 |
| FILE | Global | LOAD DATA INFILE、SELECT INTO OUTFILE | 高 (讀寫服務器檔案) |
| GRANT OPTION | 任意 | 將自己擁有的權限授予他人 | 高 |
| RELOAD | Global | FLUSH PRIVILEGES/LOGS/HOSTS 等 | 中 |
| PROCESS | Global | SHOW PROCESSLIST 看全庫查詢 | 中 |
三、精準授權實戰範例
-- 僅讀賬號 (報表/備份)
CREATE USER 'readonly'@'%' IDENTIFIED BY 'strong_pwd';
GRANT SELECT ON analytics.* TO 'readonly'@'%';
GRANT SELECT ON mysql.* TO 'readonly'@'%'; -- 監視需查 mysql 系統表
-- 應用寫入賬號 (最小權限)
CREATE USER 'app_write'@'10.0.1.%' IDENTIFIED BY 'strong_pwd';
GRANT SELECT, INSERT, UPDATE, DELETE ON business.* TO 'app_write'@'10.0.1.%';
-- 禁止 DROP、ALTER、CREATE、INDEX、GRANT
-- DBA 管理賬號
CREATE USER 'dba'@'10.0.0.10' IDENTIFIED BY 'strong_pwd';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.0.10' WITH GRANT OPTION;
四、常見誤區與避坑
- 用 '%' 通配 Host:極度危險,限制來源 IP 段 (如
'app'@'10.0.1.%')。
- 授予 FILE/SUPER/SHUTDOWN:除 DBA 外嚴禁。
- 密碼明文寫在腳本/配置檔:用
mysql_config_editor 加密存儲 (.mylogin.cnf) 或環境變數/密碼管理器。
- 忽略匿名用戶:
DROP USER ''@'localhost'; DROP USER ''@'%'; (預設安裝常有)。
- 未定期審計:
SELECT User, Host FROM mysql.user;、SHOW GRANTS FOR 'user'@'host'; 季度巡檢。
五、MySQL 8.0 新特性:角色 (Role) 與密碼策略
-- 建立角色
CREATE ROLE 'app_readonly', 'app_readwrite';
GRANT SELECT ON biz.* TO 'app_readonly';
GRANT SELECT, INSERT, UPDATE, DELETE ON biz.* TO 'app_readwrite';
-- 用戶授予角色
CREATE USER 'dev1'@'%' IDENTIFIED BY 'pwd';
GRANT 'app_readwrite' TO 'dev1'@'%';
SET DEFAULT ROLE 'app_readwrite' TO 'dev1'@'%'; -- 自動啟用
-- 密碼策略 (validate_password 元件)
INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.policy = STRONG; -- LOW/MEDIUM/STRONG
六、生產環境安全基線清單
- [ ] root 僅允許
localhost / 管理網段登入,強密碼 + caching_sha2_password。
- [ ] 刪除匿名用戶、測試庫 (
DROP DATABASE test;)。
- [ ] 啟用 SSL/TLS 傳輸加密 (
REQUIRE SSL 授權)。
- [ ] 審計日誌 (
audit_log 元件) 記錄所有 DDL/DML/登入。
- [ ] 定期輪換密碼 (90 天),
ALTER USER ... PASSWORD EXPIRE INTERVAL 90 DAY;。
- [ ] 備份加密、異地存儲、定期演練恢復。
- 上一篇文章: MySQL 預設 root 用戶消失/權限丟失緊急修復指南
- 下一篇文章: MySQL 5.0+ Prepared Statements (PREPARE/EXECUTE) 詳解:動態 SQL、防注入與存儲過程應用
Copyright ©
程式碼之家 All Rights Reserved