MySQL 預設配置為相容性犧牲安全。本文從檔案系統權限、啟動用戶、日誌洩露、授權表初始化、Root 強化、匿名用戶清理、網絡綁定、防火牆、應用層防注入、審計日誌七大維度,構建纵深防禦體系。
| 項目 | 風險 | 加固標準 |
|---|---|---|
| 資料目錄權限 | 本地用戶可打包竊取資料檔 | chown -R mysql:mysql /var/lib/mysql; chmod -R go-rwx /var/lib/mysql (700) |
| 啟動用戶 | root 啟動 → SQL 注入獲取 root 權限 | 專用 mysql 用戶啟動,--user=mysql,禁止 --user=root |
| 日誌洩露 | .bash_history/.mysql_history 記錄帶密碼指令 | 連線不帶 -ppass;ln -s /dev/null ~/.bash_history ~/.mysql_history |
安裝後 mysql.user 狀態:
立即執行:
-- 方法 1:mysqladmin
mysqladmin -u root password 'StrongP@ssw0rd'
-- 方法 2:SET PASSWORD
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('StrongP@ssw0rd');
SET PASSWORD FOR 'root'@'%' = PASSWORD('StrongP@ssw0rd');
FLUSH PRIVILEGES;
-- 方法 3:直接 UPDATE(不推薦新手)
UPDATE mysql.user SET Password=PASSWORD('StrongP@ssw0rd') WHERE User='root';
FLUSH PRIVILEGES;
刪除匿名用戶:DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;
bind-address=127.0.0.1 僅本地回環(無遠端需求時)iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 3306 -j ACCEPTrequire_secure_transport=ON,強制加密傳輸-- 應用帳號:僅業務庫增刪改查
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'10.0.0.%' IDENTIFIED BY 'pwd';
-- 備份帳號:僅 SELECT + LOCK TABLES + RELOAD
GRANT SELECT, LOCK TABLES, RELOAD ON *.* TO 'backup_user'@'10.0.0.10' IDENTIFIED BY 'pwd';
-- 監控帳號:僅 PROCESS, REPLICATION CLIENT
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor_user'@'10.0.0.10' IDENTIFIED BY 'pwd';
PreparedStatement / mysqli_stmt_prepare / PDO::preparelog_output=FILE安全是持續過程,而非一次性配置。定期審計、最小權限、加密傳輸、參數化查詢,構建資料資產鋼鐵防線。