首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 安全性指南 (一):內部與外部雙層防護架構完整建置

     編輯:MySQL 資料庫相關知識

核心觀念:雙層防護

  • 內部安全性:作業系統檔案系統層面,防止本機帳號直接讀寫 datadir 繞過 SQL 權限。
  • 外部安全性:網路連線層面,透過授權表 (grant tables) 驗證用戶身分與權限。

兩者缺一不可:若檔案權限鬆散,攻擊者可複製表檔案到自建 MySQL 實例竊取資料;若授權表配置錯誤,合法網路連線可越權存取。

一、 內部安全性:鎖定資料目錄

風險示範

  1. 攻擊者在同主機建立自有 MySQL 實例 (不同 port/socket/datadir)。
  2. 執行 mysql_install_db 獲得自有實例 root 權限。
  3. 複製目標表檔案 (.MYD, .MYI, .frm) 到自有實例 test 資料庫目錄。
  4. 啟動自有實例,SELECT * FROM test.stolen_table → **資料竊取成功**。

修正檔案權限 (以 mysql 用戶運行為例)

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。

日誌檔同樣需保護

  • General Log、Slow Log、Binary Log 含敏感 SQL (含 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。

權限驗證邏輯

  1. 連線階段:檢查 user 表 Host+User+Password。
  2. 請求階段:依序合併 user (全域) → db (庫級) → host (主機輔助) → tables_priv (表級) → columns_priv (欄位級) 權限,**遇允許即通過,否則拒絕**。

範圍欄位 vs 權限欄位

  • 範圍欄位:決定「何時生效」 (Host, User, Db, Table_name, Column_name)。
  • 權限欄位:決定「授予什麼權限」 (Select_priv, Insert_priv, Grant_priv 等)。

三、 直接操作授權表 (不透過 GRANT/REVOKE)

適用於舊版不支援 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved