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, User | Select_priv...Grant_priv (17項) | 超級用戶權限,**嚴禁授予 user 表存取權** |
db | 資料庫 | Host, Db, User | Select_priv...Alter_priv (13項) | 適用該庫所有表 |
host | 主機+庫 | Host, Db | 同 db | 配合 db 使用,不受 GRANT/REVOKE 影響 |
tables_priv | 資料表 | Host, Db, User, Table_name | Table_priv (SET)、Column_priv | 適用該表所有欄位 |
columns_priv | 欄位 | Host, Db, User, Table_name, Column_name | Column_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、長度驗證、最小權限連線
四、實用安全技巧
| 技巧 | 啟動參數 / 設定 | 效果 |
| 忘記 root 密碼重置 | --skip-grant-tables | 跳過授權表,免密登入改密碼 |
| 隱藏資料庫列表 | --skip-show-database | 一般用戶無法 SHOW DATABASES |
| chroot 隔離檔案存取 | --chroot=/path | LOAD DATA INFILE/INTO OUTFILE 限制在 chroot 內 |
| 慢查詢日誌 | --log-slow-queries[=file] | 記錄超過 long_query_time 的查詢,供優化 |
| 關閉網路監聽 | --skip-networking | 僅允許 Unix Socket 連線,**極度推薦**單機部署 |
結語: 安全配置無終點,需納入例行稽核:權限審查、日誌分析、補丁更新、滲透測試。MySQL 提供完整工具鏈,關鍵在於「用起來、持續用」。
- 上一篇文章: MySQL 常見錯誤代碼對照表:1005 到 1235 完整中文解析
- 下一篇文章: 使用 Perl DBI 連接 MySQL 資料庫完整指南
Copyright ©
程式碼之家 All Rights Reserved