MySQL 安全分為內部(文件系統級)與外部(網絡授權表)兩大維度。本文從數據目錄權限鎖定、日志文件保護、防範本地用戶竊取數據文件,到授權表結構、權限分類、連接驗證流程,構建完整的雙層防護指南。
GRANT、SET PASSWORD 明文密碼,grep 即可洩露。drwx------ 4 mysql mysql 4096 var/ # 數據目錄 700
drwx------ 2 mysql mysql 4096 var/mysql/ # 系統庫 700
-rw------- 1 mysql mysql 9148 var/mysql/user.frm
... 所有文件 600
修正命令:
chown -R mysql.mysql /usr/local/mysql/var
chmod -R go-rwx /usr/local/mysql/var
3.23.15+ 預設強制非 root 啟動。若 root 運行,LOAD DATA INFILE/SELECT ... INTO OUTFILE 將獲得 root 文件系統權限。雖有限制(不可覆蓋現有文件、僅讀全局可讀文件),但風險極大。
# 禁用 shell 歷史記錄密碼
rm .bash_history .mysql_history
ln -s /dev/null .bash_history
ln -s /dev/null .mysql_history
備份/登錄時勿在命令行帶密碼(-p 後留空,交互輸入)。
| 表 | 用途 | 範圍列 | 權限列 |
|---|---|---|---|
| user | 全局用戶與超級權限 | Host, User, Password | Select_priv...Shutdown_priv (17個) |
| db | 資料庫級權限 | Host, Db, User | Select_priv...Grant_priv (8個) |
| host | 輔助 db 限制主機訪問 | Host, Db | 同 db |
| tables_priv | 表級權限 | Host, Db, User, Table_name | Table_priv (SET) |
| columns_priv | 列級權限 | Host, Db, User, Table_name, Column_name | Column_priv (SET) |
tables_priv/columns_priv 於 3.22.11 引入,舊版升級需執行 mysql_fix_privileges_tables。
user 表 Host、User、Password → 失敗拒絕user → db → tables_priv → columns_priv 疊加權限,任一滿足即執行Host:主機名/IP/%/_/CIDRUser:空值=匿名,% 為字面值FILE/GRANT、定期 FLUSH PRIVILEGES。GRANT/REVOKE 版本(≥3.22.11),避免手動操作授權表風險。內外兼修,方能構建可信的 MySQL 安全基線。