一、系統層面安全
1. 資料目錄權限 (核心)
# 僅 mysql 用戶可讀寫
chown -R mysql:mysql /usr/local/mysql/var
chmod -R go-rwx /usr/local/mysql/var
# 確認結果
ls -l /usr/local/mysql/var/
# drwx------ mysql mysql ...
# -rw------- mysql mysql ... *.MYD *.MYI *.frm
- 舊版 (3.21/3.22) 預設 775/770 極度危險,必須手動收斂。
2. 禁止 Root 啟動 mysqld
# 正確啟動
mysqld_safe --user=mysql &
# 強制 root 啟動 (極度不建議)
mysqld_safe --user=root &
- Root 啟動導致
LOAD DATA INFILE/SELECT ... INTO OUTFILE 擁有 Root 權限,可讀寫系統敏感檔案。
3. 歷史指令防洩漏
# 避免密碼寫入 .bash_history/.mysql_history
mysql -u root -p # 互動式輸入密碼
mysqldump -u root -p db > backup.sql
# 徹底禁用歷史記錄
rm -f ~/.bash_history ~/.mysql_history
ln -s /dev/null ~/.bash_history
ln -s /dev/null ~/.mysql_history
4. 啟動參數安全強化
| 參數 | 作用 | 建議 |
| --skip-networking | 禁用 TCP/IP,僅本地 Socket | 單機應用**強烈推薦** |
| --skip-show-database | 隱藏 SHOW DATABASES | 啟用 |
| --chroot=/path | 限制檔案存取於 chroot 目錄 | 需配合 tmpdir/socket 路徑 |
| --log-slow-queries[=file] | 記錄慢查詢 | 啟用,配合 long_query_time |
二、網路與授權安全
1. 初始 user 表清理
-- 刪除匿名用戶
DELETE FROM mysql.user WHERE User='';
-- 移除 Host='%' 的 root
DELETE FROM mysql.user WHERE Host='%' AND User='root';
-- 設定 root 強密碼
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('StrongPass!23');
FLUSH PRIVILEGES;
2. 授權表機制 (五表聯動)
user:全域權限 (超級用戶),嚴禁授予應用帳號。
db:資料庫級權限,主力授權層。
host:輔助 db 控制主機存取 (不受 GRANT 影響)。
tables_priv:資料表級權限 (SET 型態)。
columns_priv:欄位級權限 (SET 型態)。
3. GRANT/REVOKE 最佳實踐
-- 應用帳號:最小權限
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app'@'10.0.1.%' IDENTIFIED BY 'Pass!23';
-- 唯讀報表帳號
GRANT SELECT ON app_db.* TO 'report'@'10.0.2.%' IDENTIFIED BY 'Pass!23';
-- 撤銷
REVOKE INSERT ON app_db.* FROM 'app'@'10.0.1.%';
-- 刪除用戶
DROP USER 'app'@'10.0.1.%';
三、應用層防注入編程規範
| 語言/框架 | 核心防禦 | 關鍵 API |
| 通用 Web | 單引號/雙引號測試、長度檢查、最小權限連線 | - |
| PHP | 預處理語句、關閉 magic_quotes | PDO::prepare(), mysqli_prepare() |
| Java JDBC | PreparedStatement | conn.prepareStatement() |
| Perl DBI | quote() / placeholders | $dbh->quote(), $sth->execute(@params) |
| C API | mysql_stmt_prepare() | MYSQL_STMT |
鐵律:永遠不要相信使用者輸入,數值欄位也要用參數化 (WHERE id=?),拼接 SQL 絕對禁止。
四、進階技巧
- 忘記 Root 密碼:
mysqld_safe --skip-grant-tables & → 更新密碼 → 重啟。
- 慢查詢分析:
--log-slow-queries + mysqldumpslow / pt-query-digest。
- 審計:MariaDB Audit Plugin / MySQL Enterprise Audit 記錄所有 DDL/DML/登入。
- 上一篇文章: Linux 異構網路下 MySQL 備份策略:本地 mysqldump、DVD 刻錄離線歸檔與自動化腳本設計
- 下一篇文章: MySQL 入門快速上手:Windows 安裝、服務啟動、Root 密碼設定與基礎連線測試
Copyright ©
程式碼之家 All Rights Reserved