MySQL 跨平台特性導致預設配置偏向兼容性而非安全性,管理員必須從系統內部(文件權限、啟動用戶、日志)與外部網絡(授權表、權限最小化)兩維度進行加固。本文以 MySQL 3.23.49 為基準,給出生產環境可直接執行的基線配置清單。
| 版本 | 數據目錄權限 | 風險 |
|---|---|---|
| 3.21.x | 775 | 所有本地用戶可讀 |
| 3.22.x | 770 | 同組用戶可讀寫 |
| 3.23.x | 700 | 僅啟動用戶可訪問 ✓ |
標準狀態(mysql 用戶運行):
drwx------ 4 mysql mysql 4096 var/
drwx------ 2 mysql mysql 4096 var/mysql/
-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,需顯式 ./safe_mysqld --user=root &。root 運行將導致 LOAD DATA INFILE/SELECT ... INTO OUTFILE 擁有 root 文件系統權限,極度危險。
GRANT、SET PASSWORD 明文密碼。mysqldump -uroot -ppass)會寫入 .bash_history。.mysql_history。徹底禁用歷史記錄:
rm .bash_history .mysql_history
ln -s /dev/null .bash_history
ln -s /dev/null .mysql_history
操作時使用 -p 留空交互輸入密碼。
| 平台 | 預設記錄 | 風險點 |
|---|---|---|
| Unix | root@localhost、root@hostname、匿名@localhost、匿名@hostname | root 空密碼、僅本機連接 |
| Windows | root@localhost、root@%、匿名@localhost、匿名@% | root 空密碼、% 允許任意主機、匿名@localhost 擁有全權限! |
-- 1. 修改 root 密碼(三種方式擇一)
mysqladmin -u root password 'StrongPass#2024'
-- 或
SET PASSWORD FOR root@localhost = PASSWORD('StrongPass#2024');
-- 或
UPDATE user SET Password=PASSWORD('StrongPass#2024') WHERE User='root'; FLUSH PRIVILEGES;
-- 2. 刪除匿名用戶
DELETE FROM user WHERE User=''; FLUSH PRIVILEGES;
-- 3. Windows 必須:刪除 Host='%' 記錄
DELETE FROM user WHERE Host='%'; FLUSH PRIVILEGES;
-- 4. 刪除測試庫權限(可選)
DELETE FROM db WHERE Db='test' OR Db LIKE 'test_%'; FLUSH PRIVILEGES;
17 個權限列(Select_priv...Alter_priv),均為 ENUM('N','Y') 預設 N。關鍵管理權限:File_priv、Grant_priv、Process_priv、Reload_priv、Shutdown_priv —— 僅限 DBA。
GRANT/REVOKE,避免手動操作授權表。SELECT/INSERT/UPDATE/DELETE。mysql 系統庫任何權限(等同全局 GRANT)。SELECT User, Host FROM user WHERE Grant_priv='Y';建立配置基線腳本,納入 CI/CD 與定期巡檢,確保 MySQL 始終處於加固狀態。