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

MySQL 資料庫安全配置大全:從系統內部到外部網路、編程防禦與實用技巧

     編輯:MySQL 資料庫相關知識

MySQL 企業級安全配置完整指南:內部、外部、編程、技巧四大面向

一、系統內部安全

1. 資料目錄權限(核心)

  • MySQL 3.23+ 預設 datadir 權限 700(僅 mysql 用戶可讀寫)
  • 檢查指令:
    ls -l /usr/local/mysql/var → 應為 drwx------ mysql mysql
  • 修正指令:
    chown -R mysql:mysql /usr/local/mysql/var
    chmod -R go-rwx /usr/local/mysql/var

2. 禁止 root 執行 mysqld

  • 3.23.15+ 預設拒絕 root 啟動,強制 --user=mysql
  • 若必須用 root:./mysqld_safe --user=root &(極不建議)
  • 原因:root 執行時 LOAD DATA INFILE/SELECT ... INTO OUTFILE 擁有 root 檔案權限

3. 歷史檔案洩密防護

  • 命令列帶密碼會寫入 ~/.bash_history、~/.mysql_history
  • **正確做法:** mysql -u root -p 回車後再輸入密碼
  • 徹底禁用歷史記錄:
    rm ~/.bash_history ~/.mysql_history
    ln -s /dev/null ~/.bash_history
    ln -s /dev/null ~/.mysql_history

二、外部網路安全(授權表管理)

1. 初始 user 表風險

  • Unix:僅 localhost 可連,但 root 空密碼
  • Windows:含 %(任意主機)且 root 空密碼、匿名帳號擁有全權限

2. 必執行清理動作

-- 1. 設定 root 密碼(三種方式擇一)
mysqladmin -u root password 'strong_pwd'
-- 或
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('strong_pwd');
-- 或
UPDATE user SET Password=PASSWORD('strong_pwd') WHERE User='root'; FLUSH PRIVILEGES;

-- 2. 刪除匿名帳號
DELETE FROM user WHERE User='';

-- 3. 刪除遠端 root / 通配符帳號 (Windows 必做)
DELETE FROM user WHERE Host='%';

-- 4. 重載權限
FLUSH PRIVILEGES;

3. 五張授權表結構與運作

表層級範圍欄位權限欄位備註
user全域Host, UserSelect_priv...Grant_priv (17項)超級用戶權限,**嚴禁授予 user 表存取權**
db資料庫Host, Db, UserSelect_priv...Alter_priv (13項)適用該庫所有表
host主機+庫Host, Db同 db配合 db 使用,不受 GRANT/REVOKE 影響
tables_priv資料表Host, Db, User, Table_nameTable_priv (SET)、Column_priv適用該表所有欄位
columns_priv欄位Host, Db, User, Table_name, Column_nameColumn_priv (SET)最細粒度

4. Host/User 匹配規則

  • '192.168.1.1', 'test' → test 僅能從該 IP 連線
  • '%', 'test' → test 可從任意主機連線(危險)
  • '192.168.1.%', 'test' → C 類網段
  • '192.168.1.0/255.255.255.0', 'test' → CIDR 表示法

5. GRANT/REVOKE 實戰範例

-- 建立本地超級用戶
GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' IDENTIFIED BY 'pwd' WITH GRANT OPTION;

-- 建立特定網段唯讀用戶
GRANT SELECT ON db1.* TO 'readonly'@'192.168.1.0/255.255.255.0' IDENTIFIED BY 'pwd';

-- 撤銷權限(不刪除用戶)
REVOKE ALL ON db1.* FROM 'readonly'@'192.168.1.0/255.255.255.0';
DELETE FROM user WHERE User='readonly'; FLUSH PRIVILEGES;

三、編程防禦:防 SQL Injection 鐵律

  • 永遠不信任用戶輸入
  • 數值欄位也用引號:WHERE id='234'(MySQL 自動轉型並移除非數字)
  • 各語言必用參數化/轉義:
    • PHP: mysqli_real_escape_string() / PDO::prepare()
    • C API: mysql_real_escape_string()
    • MySQL++: escape()/quote()
    • Perl DBI: $dbh->quote()
    • Java JDBC: PreparedStatement
  • Web 通用檢查:單雙引號測試、URL 參數 %22/%23/%27、長度驗證、最小權限連線

四、實用安全技巧

結語: 安全配置無終點,需納入例行稽核:權限審查、日誌分析、補丁更新、滲透測試。MySQL 提供完整工具鏈,關鍵在於「用起來、持續用」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技巧啟動參數 / 設定效果
忘記 root 密碼重置--skip-grant-tables跳過授權表,免密登入改密碼
隱藏資料庫列表--skip-show-database一般用戶無法 SHOW DATABASES
chroot 隔離檔案存取--chroot=/pathLOAD DATA INFILE/INTO OUTFILE 限制在 chroot 內
慢查詢日誌--log-slow-queries[=file]記錄超過 long_query_time 的查詢,供優化
關閉網路監聽--skip-networking僅允許 Unix Socket 連線,**極度推薦**單機部署