datadir 繞過 SQL 權限。grant tables) 驗證用戶身分與權限。兩者缺一不可:若檔案權限鬆散,攻擊者可複製表檔案到自建 MySQL 實例竊取資料;若授權表配置錯誤,合法網路連線可越權存取。
mysql_install_db 獲得自有實例 root 權限。.MYD, .MYI, .frm) 到自有實例 test 資料庫目錄。SELECT * FROM test.stolen_table → **資料竊取成功**。cd /var/lib/mysql
# 1. 統一擁有者
chown -R mysql:mysql .
# 2. 移除 group/other 所有權限
chmod -R go-rwx .
# 或更精確
find . -type d -exec chmod 750 {} \;
find . -type f -exec chmod 640 {} \;
drwx------ mysql mysql mysql
drwx------ mysql mysql test
drwx------ mysql mysql db1
...
確保 **只有 mysql 使用者 (及 root) 可存取**,啟動服務時指定 --user=mysql。
SET PASSWORD 明文)。chown mysql:mysql、chmod 640,並放在非公開目錄。| 表名 | 用途 | 生效範圍 |
|---|---|---|
user | 全域帳號、密碼、超級權限 | 所有資料庫 |
db | 資料庫級權限 | 特定資料庫所有表 |
host | 輔助 db 做主機級控制 | 特定主機+資料庫 |
tables_priv | 表級權限 | 特定表所有欄位 |
columns_priv | 欄位級權限 | 特定表特定欄位 |
tables_priv、columns_priv 為 MySQL 3.22.11 引入,舊版升級需執行 mysql_fix_privilege_tables。
user 表 Host+User+Password。user (全域) → db (庫級) → host (主機輔助) → tables_priv (表級) → columns_priv (欄位級) 權限,**遇允許即通過,否則拒絕**。適用於舊版不支援 GRANT、或需批次腳本化管理:
-- 建立帳號
INSERT INTO user (Host, User, Password, Select_priv, Insert_priv)
VALUES ('10.0.1.%', 'app_user', PASSWORD('secr3t'), 'Y', 'Y');
FLUSH PRIVILEGES;
-- 資料庫級授權
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv)
VALUES ('10.0.1.%', 'erp', 'app_user', 'Y', 'Y');
FLUSH PRIVILEGES;
注意:直接修改後 **必須執行 FLUSH PRIVILEGES** 讓 Server 重載記憶體權限快取。
| 誤區 | 正確做法 |
|---|---|
| Root 允許遠程登入 | UPDATE user SET Host='localhost' WHERE User='root'; |
| 匿名帳號 ('') 存在 | DELETE FROM user WHERE User=''; |
測試資料庫 test 開放寫入 | REVOKE ALL ON test.* FROM '%'; 或 DROP DATABASE test; |
應用帳號擁有 FILE/SUPER | 僅授 SELECT/INSERT/UPDATE 於特定庫表 |
| 密碼未加密傳輸 | 啟用 SSL/TLS 或 SSH Tunnel |