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

MySQL 數據庫安全配置全維度指南:系統內部、外部網絡、編程防注入、運維竅門

     編輯:MySQL 資料庫相關知識

MySQL 安全配置需從「系統內部(文件權限、用戶權限、日志審計)」、「外部網絡(授權表、通信加密、訪問控制)」、「編程層(參數化、最小權限、輸入驗證)」、「運維竅門(密碼找回、chroot、慢查詢審計、跳過網絡)」四個維度纏深層防護。本文系統梳理並給出可落地清單。

一、系統內部安全

1. 數據目錄權限(關鍵)

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,本地用戶可直接拷貝數據文件繞過權限系統。

2. 禁止 root 用戶啟動 mysqld

MySQL 3.23.15+ 默認拒絕 root 啟動。若強制需 --user=root。root 啟動將導致 LOAD DATA INFILE/SELECT ... INTO OUTFILE 擁有 root 文件系統權限,極度危險。

3. 歷史文件與日志洩露防範

  • 命令行帶密碼會寫入 ~/.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。
  • 4. 啟動參數加固

    參數作用
    --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(單機應用)

    二、外部網絡安全:授權表精細控制

    1. 初始 user 表風險清理

    
    -- 删除匿名用户
    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;

    2. GRANT/REVOKE 最小權限模板

    
    -- 应用读写账号
    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

    3. 通信加密

    • MySQL 5.7+ 默認支持 SSL,生成證書並配置 require_secure_transport=ON
    • 或部署 SSH 隧道 / stunnel / VPN 將 3306 端口不暴露公網

    三、編程層防注入與最小權限

    語言/框架防注入核心最小權限配置
    通用 Web參數化查詢 / PreparedStatement應用賬號僅授業務庫 SELECT/INSERT/UPDATE/DELETE/EXECUTE
    PHPmysqli_prepare / PDO::prepare / mysql_escape_string同上
    Java JDBCPreparedStatement(禁用 Statement 拼接)同上
    Pythoncursor.execute(sql, params) / SQLAlchemy ORM同上
    Godb.QueryContext(ctx, sql, args...) / sqlx同上
    .NETSqlCommand.Parameters.AddWithValue / EF Core同上

    額外檢查:數字字段**勿直接拼接**(WHERE id= + input),改用參數化;輸入長度、類型、格式雙端校驗。

    四、運維竅門

    1. 忘記 root 密碼:mysqld_safe --skip-grant-tables --skip-networking & → 登錄改密 → 重啟
    2. 慢查詢審計:--log-slow-queries + long_query_time=1 → 定期分析 pt-query-digest
    3. 審計插件:企業版 audit_log 或開源 MariaDB Audit Plugin
    4. 定期權限審計:SELECT User, Host FROM mysql.user WHERE User='root' AND Host!='localhost'; 應為空

    安全無絕對,唯有「最小權限、參數化查詢、文件權限收緊、通信加密、審計日志、定期演練」構建纏深層防禦體系。

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