MySQL 作為多用戶、多線程 SQL 服務器,其安全模型建立在 認證(密碼/插件)+ 授權(權限表) 雙重機制上。本文系統梳理 6 種密碼修改方法、權限表結構、GRANT/REVOKE 精細控制、典型業務場景授權模板,助力構建最小權限原則的數據庫安全防線。
| 方法 | 適用場景 | 權限需求 | 需 FLUSH PRIVILEGES | 備註 |
|---|---|---|---|---|
| 1. phpMyAdmin / GUI 工具 | 圖形化運維 | root 或 SUPER | 否(工具自動處理) | 直觀,適合新手 |
| 2. mysqladmin | 命令行快速改密 | root 或該用戶自身 | 否 | mysqladmin -u root -pold newpass;無法清空密碼 |
| 3. INSERT INTO user | 腳本化創建用戶 | INSERT(mysql.user) + RELOAD | 是 | 需手動 PASSWORD() 加密 |
| 4. REPLACE INTO user | 冪等創建/更新用戶 | 同上 | 是 | 主鍵衝突時覆蓋 |
| 5. SET PASSWORD | 會話級修改自身/他人密碼 | UPDATE(mysql.user) 或 SUPER | 否(隱式生效) | SET PASSWORD FOR 'user'@'host' = 'newpass'; (8.0 不需 PASSWORD()) |
| 6. GRANT ... IDENTIFIED BY | 授權同時設置密碼 | GRANT OPTION | 否 | 最常用,無需 PASSWORD(),自動加密 |
PASSWORD() 返回 41 位十六進制散列caching_sha2_password 插件,PASSWORD() 函數已移除,直接使用明文密碼字符串,服務端自動散列ALTER USER 'user'@'host' IDENTIFIED BY 'newpass';mysql.user 表,作用於所有庫/表(如 SHUTDOWN, SUPER, FILE)mysql.db,作用於特定庫內所有對象mysql.tables_priv,作用於特定表mysql.columns_priv,作用於特定列權限生效順序:全局 → 庫 → 表 → 列,高層級授權會覆蓋低層級限制。
| 權限 | user 表列名 | 作用範圍 | 典型風險 |
|---|---|---|---|
| SELECT | Select_priv | 表/列 | 數據洩露 |
| INSERT | Insert_priv | 表/列 | 數據污染 |
| UPDATE | Update_priv | 表/列 | 數據篡改 |
| DELETE | Delete_priv | 表 | 數據丟失 |
| CREATE | Create_priv | 庫/表/索引 | 資源耗盡 |
| DROP | Drop_priv | 庫/表 | 結構破壞 |
| RELOAD | Reload_priv | 服務器管理 | 配置重載 |
| SHUTDOWN | Shutdown_priv | 服務器管理 | 拒絕服務 |
| PROCESS | Process_priv | 服務器管理 | 查看敏感 SQL |
| FILE | File_priv | 服務器文件 | 任意文件讀寫 |
| GRANT OPTION | Grant_priv | 庫/表 | 權限傳遞 |
| INDEX | Index_priv | 表 | 索引濫用 |
| ALTER | Alter_priv | 表 | 結構變更/繞過權限 |
| CREATE USER | Create_user_priv | 全局 | 賬號管理 |
| SUPER | Super_priv | 全局 | 最高權限,慎授 |
-- 寫入服務賬號
CREATE USER 'app_write'@'10.0.1.%' IDENTIFIED BY 'StrongPass!';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_write'@'10.0.1.%';
-- 只讀服務賬號
CREATE USER 'app_read'@'10.0.1.%' IDENTIFIED BY 'StrongPass!';
GRANT SELECT ON mydb.* TO 'app_read'@'10.0.1.%';
-- 開發:僅特定庫 DDL/DML,無 DROP/TRUNCATE
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER ON dev_db.* TO 'dev'@'10.0.2.%';
-- 運維:全局監控權限,無數據讀寫
GRANT PROCESS, REPLICATION CLIENT, SHOW DATABASES ON *.* TO 'ops'@'10.0.3.%';
GRANT SELECT ON db1.* TO 'etl'@'10.0.4.%';
GRANT SELECT ON db2.* TO 'etl'@'10.0.4.%';
-- 或使用通配符(謹慎)
GRANT SELECT ON `report_%`.* TO 'etl'@'10.0.4.%';
CREATE USER 'dba'@'10.0.0.10' IDENTIFIED BY 'VeryStrongPass!';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.0.10' WITH GRANT OPTION;
-- 生產環境建議拆分:DBA 日常不使用 SUPER,故障時臨時授予
SHOW GRANTS 審計'user'@'%',使用具體 IP/網段 'user'@'10.0.1.%'validate_password 插件強制複雜度、過期輪換CREATE ROLE 'app_read'; GRANT SELECT ON mydb.* TO 'app_read'; GRANT 'app_read' TO 'user1'@'%';REVOKE INSERT ON mydb.* FROM 'user'@'host'; 並 FLUSH PRIVILEGESaudit_log 插件記錄所有授權變更-- 創建業務庫
CREATE DATABASE XinXiKu CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 驗證用戶權限
SHOW GRANTS FOR 'app_write'@'10.0.1.%';
-- 客戶端測試
mysql -uapp_write -p -h db-host XinXiKu -e "SELECT 1;"
MySQL 安全防線的核心在於:強認證(複雜密碼/插件/SSL)+ 精授權(最小權限/網段限制/角色體系)+ 持續審計(日志/定期審計)。掌握 6 種改密方式的適用邊界,理解 4 層權限表的生效邏輯,善用 GRANT/REVOKE 而非直操系統表,即可構建經得起滲透測試的數據庫訪問控制體系。