MySQL 安全配置需從「系統內部(文件權限、用戶權限、日志審計)」、「外部網絡(授權表、通信加密、訪問控制)」、「編程層(參數化、最小權限、輸入驗證)」、「運維竅門(密碼找回、chroot、慢查詢審計、跳過網絡)」四個維度纏深層防護。本文系統梳理並給出可落地清單。
MySQL 3.23+ 默認 datadir 權限 700(drwx------ mysql mysql),僅啟動用戶可讀寫。檢查並修正:
chown -R mysql:mysql /usr/local/mysql/var
chmod -R go-rwx /usr/local/mysql/var
若權限為 775/770,本地用戶可直接拷貝數據文件繞過權限系統。
MySQL 3.23.15+ 默認拒絕 root 啟動。若強制需 --user=root。root 啟動將導致 LOAD DATA INFILE/SELECT ... INTO OUTFILE 擁有 root 文件系統權限,極度危險。
~/.bash_history、~/.mysql_history
rm -f ~/.bash_history ~/.mysql_history
ln -s /dev/null ~/.bash_history
ln -s /dev/null ~/.mysql_history
--defaults-extra-file 指向 600 權限的 .my.cnf。| 參數 | 作用 |
|---|---|
--skip-show-database | 非 SUPER 權限用戶不可 SHOW DATABASES |
--chroot=/path | 限制 LOAD DATA INFILE/SELECT ... INTO OUTFILE 在 chroot 目錄下 |
--log-slow-queries=/path/slow.log | 記錄超過 long_query_time 的查詢,審計異常訪問 |
--skip-networking | 僅本地 Socket 連接,禁用 TCP/IP(單機應用) |
-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
-- 删除 root 远程访问
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
-- 设置 root 强密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPass123!';
FLUSH PRIVILEGES;
-- 应用读写账号
CREATE USER 'app_rw'@'10.0.0.%' IDENTIFIED BY 'AppPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `biz_db`.* TO 'app_rw'@'10.0.0.%';
-- 只读报表账号
CREATE USER 'app_ro'@'10.0.1.%' IDENTIFIED BY 'RoPass123!';
GRANT SELECT ON `biz_db`.* TO 'app_ro'@'10.0.1.%';
-- 禁止 GRANT OPTION、FILE、SHUTDOWN、PROCESS、SUPER
require_secure_transport=ON| 語言/框架 | 防注入核心 | 最小權限配置 |
|---|---|---|
| 通用 Web | 參數化查詢 / PreparedStatement | 應用賬號僅授業務庫 SELECT/INSERT/UPDATE/DELETE/EXECUTE |
| PHP | mysqli_prepare / PDO::prepare / mysql_escape_string | 同上 |
| Java JDBC | PreparedStatement(禁用 Statement 拼接) | 同上 |
| Python | cursor.execute(sql, params) / SQLAlchemy ORM | 同上 |
| Go | db.QueryContext(ctx, sql, args...) / sqlx | 同上 |
| .NET | SqlCommand.Parameters.AddWithValue / EF Core | 同上 |
額外檢查:數字字段**勿直接拼接**(WHERE id= + input),改用參數化;輸入長度、類型、格式雙端校驗。
mysqld_safe --skip-grant-tables --skip-networking & → 登錄改密 → 重啟--log-slow-queries + long_query_time=1 → 定期分析 pt-query-digestaudit_log 或開源 MariaDB Audit PluginSELECT User, Host FROM mysql.user WHERE User='root' AND Host!='localhost'; 應為空安全無絕對,唯有「最小權限、參數化查詢、文件權限收緊、通信加密、審計日志、定期演練」構建纏深層防禦體系。