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

MySQL 安全性指南(一):內部與外部安全雙重防護體系

     編輯:Oracle 資料庫相關知識

安全雙維度

  • 內部安全:文件系統層面,防止主機合法/竊取帳號直接讀寫數據目錄
  • 外部安全:網絡層面,通過授權表控制客戶端連接與操作權限

兩者缺一不可:若文件權限鬆散,網絡授權再嚴格也無濟於事。

一、內部安全:鎖定數據目錄

必須保護的內容

  1. 數據庫文件:對應表的 .MYD/.MYI/.frm,防止被複製竊取
  2. 日誌文件:通用日誌、更新日誌含敏感 SQL(如 GRANT、SET PASSWORD 明文密碼)

風險演示:鬆散權限如何導致數據竊取

  1. 攻擊者讀取數據目錄文件
  2. 自建 MySQL 實例(不同 port/socket/datadir)
  3. 執行 mysql_install_db 獲得 root 權限
  4. 將偷取的 .frm/.MYD/.MYI 複製到自建實例的 test 库
  5. 啟動服務,SELECT * FROM test.stolen_table 直接讀取

權限加固標準流程

# 1. 進入數據目錄
cd /var/lib/mysql   # DATADIR

# 2. 統一屬主為運行服務的用戶(需 root)
chown -R mysql:mysql .

# 3. 移除 group/other 所有權限
chmod -R go-rwx .

# 4. 驗證結果
ls -la
# 期望輸出:drwx------  mysql mysql  ...  database_name

關鍵原則:數據目錄及所有子目錄/文件僅對 mysql 用戶可讀寫執行(700),嚴禁 group/other 任何權限。

二、外部安全:授權表體系

五大授權表結構

表名作用範圍受 GRANT/REVOKE 影響
user全局(超級用戶)權限是
db庫級權限是
host主機級精細控制(配合 db)否
tables_priv表級權限是
columns_priv列級權限是

權限列分類

  • 範圍列:Host、User、Password、Db、Table_name、Column_name —— 決定權限「何時、對誰、對什麼對象」生效
  • 權限列:Select_priv、Insert_priv、File_priv、Grant_priv 等 —— 決定「具體能做什麼操作」

user 表特權欄位

僅存在於 user 表:File_priv、Process_priv、Reload_priv、Shutdown_priv。這些權限與特定庫/表無關,屬服務器級操作。

三、訪問控制決策流程

  1. 連接階段:匹配 user 表 → 失敗拒絕,成功進入階段二
  2. 查詢階段:依次檢查 user → db → tables_priv → columns_priv,權限以 OR 邏輯疊加
  3. 實際邏輯:user OR (db AND host) OR tables_priv OR columns_priv

服務啟動時將授權表載入記憶體,直接修改表不生效,需 FLUSH PRIVILEGES。

四、範圍列匹配細節

  • Host:主機名/IP/通配符 % _/CIDR(192.168.0.0/16),% = 所有主機
  • User:空值 = 匿名用戶,% 為字面值
  • Password:加密存儲,空 = 無需密碼,不支援通配符
  • 排序規則:具體值 > 通配符;Host 為主排序鍵,User 為次排序鍵

五、授權表風險防範清單

  1. 嚴禁 授予 mysql 庫任何權限(等同全局 GRANT)
  2. 極度謹慎 授予 FILE、SHUTDOWN、PROCESS、GRANT
  3. 最小權限原則:業務帳號僅在 db/tables_priv/columns_priv 獲取權限,user 表保留 root 等極少數管理員
  4. 定期審計:檢查匿名帳號(User='')、無密碼帳號、過度授權帳號
  5. 啟動參數:添加 --skip-show-database 限制 SHOW DATABASES 可見範圍

總結

MySQL 安全防線:文件系統 700 權限鎖死數據目錄 + 授權表最小權限分配 + 禁用高危全局權限 + 定期 FLUSH PRIVILEGES 同步記憶體。內外兼修,方能構建可信賴的數據庫環境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved