萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 資料庫安全配置清單:安裝後必做的 9 項加固動作

預設安裝的風險

  • root 空密碼、匿名用戶、test 資料庫對所有人可寫、root 遠程登入開放、無連接數限制、本地文件讀取開放……
  • 一鍵執行 mysql_secure_installation 可完成大部分,但理解每項含義更利於合規審計。

九大加固動作標準化流程

1. 設定/修改 root 強密碼

# 命令列
mysqladmin -u root password 'StrongP@ssw0rd!2024'

# 或 SQL
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd!2024';
FLUSH PRIVILEGES;

2. 刪除匿名用戶與測試庫

DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

3. 重命名/禁用 root 遠程登入

-- 方案 A:改名(推薦)
RENAME USER 'root'@'localhost' TO 'dba_admin'@'localhost';
-- 方案 B:僅允許本地
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');
FLUSH PRIVILEGES;

4. 建立最小權限應用賬號

CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'10.0.%' IDENTIFIED BY 'AppUserStr0ngP@ss!';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON app_db.* TO 'app_user'@'10.0.%';
-- 嚴禁 GRANT ALL、FILE、SUPER、SHUTDOWN、PROCESS 等管理權限
FLUSH PRIVILEGES;

5. 禁用本地文件導入(防任意文件讀取)

[mysqld]
local_infile = 0
secure_file_priv = /var/lib/mysql-files/  # 僅允許此目錄 LOAD DATA/SELECT INTO OUTFILE

動態生效需重啟;驗證:SHOW VARIABLES LIKE 'local_infile'; 應為 OFF。

6. 禁用/限制網絡連接(按需)

[mysqld]
# 完全禁用 TCP/IP(僅本地 Unix Socket)
skip-networking

# 或綁定內網 IP
bind-address = 10.0.0.10

# 生產建議:bind-address=0.0.0.0 + 防火牆/安全組限制來源 IP

7. 限制用戶資源配額

ALTER USER 'app_user'@'10.0.%'
  WITH MAX_QUERIES_PER_HOUR 10000
       MAX_UPDATES_PER_HOUR 5000
       MAX_CONNECTIONS_PER_HOUR 2000
       MAX_USER_CONNECTIONS 50;

8. 啟用審計日志(企業版/插件)

# MariaDB / Percona / MySQL Enterprise
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_policy = 'ALL';
SET GLOBAL audit_log_format = 'JSON';

9. SSL/TLS 加密傳輸

[mysqld]
ssl_ca = /etc/mysql/ssl/ca.pem
ssl_cert = /etc/mysql/ssl/server-cert.pem
ssl_key = /etc/mysql/ssl/server-key.pem
require_secure_transport = ON

# 客戶端連接
mysql --ssl-mode=VERIFY_IDENTITY -h db-host -u user -p

快速修復與維運腳本

資料庫檢查修復

# 全庫檢查並修復
mysqlcheck -A --auto-repair -u root -p

# 單庫優化(重建索引、碎片整理)
mysqlcheck -o -r app_db -u root -p

配置模板選型(按記憶體)

模板 適用記憶體 核心參數特徵
my-small.cnf < 64 MB 極小緩衝,嵌入式/測試
my-medium.cnf 64-128 MB key_buffer=16M, sort_buffer=1M
my-large.cnf 512 MB innodb_buffer_pool=128M
my-huge.cnf 1-2 GB innodb_buffer_pool=512M
my-innodb-heavy-4G.cnf 4 GB+ innodb_buffer_pool=2G+, log_file=256M

生產環境請根據實際記憶體 **自行計算** innodb_buffer_pool_size = 物理記憶體 × 60-75%,而非直接套用模板。

合規審計檢查腳本

<?php
// audit_mysql_security.php
$pdo = new PDO('mysql:host=localhost', 'dba_admin', 'pwd');
$checks = [
  "SELECT User, Host FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1')" => "Root 遠程登入",
  "SELECT User, Host FROM mysql.user WHERE User=''" => "匿名用戶",
  "SHOW VARIABLES LIKE 'local_infile'" => "LOCAL INFILE 應為 OFF",
  "SHOW VARIABLES LIKE 'secure_file_priv'" => "secure_file_priv 應非空",
  "SELECT User, Host, MAX_USER_CONNECTIONS FROM mysql.user WHERE MAX_USER_CONNECTIONS = 0" => "無連接數限制用戶",
];
foreach ($checks as $sql => $desc) {
  $stmt = $pdo->query($sql);
  if ($stmt->rowCount() > 0) {
    echo "[FAIL] $desc\n";
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) print_r($r);
  } else {
    echo "[OK] $desc\n";
  }
}

總結

安全配置不是一次性動作,而是**持續流程**:安裝即加固 → 定期審計 → 版本升級同步修正 → 事件響應預案。將上述 9 項納入基線檢查清單,自動化巡檢,才能守住資料資產底線。

copyright © 萬盛學電腦網 all rights reserved