網路傳輸安全
- 跨不可信網路必須加密:SSH 隧道、SSL/TLS、VPN,禁止明文傳輸 3306 埠。
- 啟用 SSL:
require_secure_transport=ON 強制所有連線加密。
認證與授權
- 修改 root 密碼三步走:
mysql -u root → UPDATE mysql.user SET authentication_string=PASSWORD('new') WHERE User='root'; → FLUSH PRIVILEGES;
- 防範四大攻擊:竊聽、篡改、重放、拒絕服務。基於 ACL (授權表) + SSL 多層防護。
- 非 root 禁訪 mysql.user:該表存加密密碼,洩露即全庫淪陷。
- 使用 GRANT/REVOKE 管理權限:不用直操作授權表,避免語法錯誤與快取不一致。
- 禁用明文密碼:應用層存儲
SHA2(password, 256) 或 bcrypt,資料庫帳號密碼定期輪換。
- 拒絕弱密碼:啟用
validate_password,長度≥14、含大小寫數字特殊字符、字典檢查。
- 防火牆收斂 3306:僅允許應用伺服器 IP 存取,或繫結
bind-address=127.0.0.1。
- 輸入驗證防注入:參數化查詢、
mysql_real_escape_string、嚴格型別檢查、長度限制。
- 應用帳號最小權限:僅
SELECT/INSERT/UPDATE/DELETE 特定庫表,無 DROP/ALTER/GRANT。
- 各語言使用官方轉義:PHP
mysqli_real_escape_string、Java PreparedStatement、Python cursor.execute(%s)、Perl $dbh->quote()、C API mysql_real_escape_string()。
作業系統與檔案層面
- TCP 封包審計:
tcpdump -l -i eth0 -w - src or dst port 3306 | strings 檢測明文洩露。
- 以普通用戶啟動 mysqld:禁止 root 啟動,防提權。
- 禁用符號連結:
--skip-symbolic-links 防止繞過目錄限制。
- 資料目錄權限 700:
chown -R mysql:mysql /var/lib/mysql; chmod -R 700 /var/lib/mysql。
- 嚴控 PROCESS/SUPER/FILE 權限:僅 DBA 擁有,防查詢文本洩露、關閉服務、任意讀寫檔案。
- FILE 權限僅管理員:防
LOAD DATA INFILE '/etc/passwd' 讀取系統敏感檔。
- 不信任 DNS:授權表 Host 僅用 IP/CIDR,避免 DNS 劫持繞過限制。
- 限制單用戶連線數:
max_user_connections、GRANT ... WITH MAX_CONNECTIONS_PER_HOUR。
- GRANT 支援資源限制:
MAX_QUERIES_PER_HOUR, MAX_UPDATES_PER_HOUR, MAX_USER_CONNECTIONS。
啟動參數安全開關
- 關閉 LOCAL INFILE:
--local-infile=0 防客戶端任意讀本地檔。
- 慎用 --skip-grant-tables:僅緊急重置密碼時臨時啟用,用畢即移除並
FLUSH PRIVILEGES。
- 隱藏資料庫列表:
--skip-show-databases 非管理帳號不可 SHOW DATABASES。
緊急情況:Error 1045 密碼重置
1. mysqld --skip-grant-tables --skip-networking &
2. mysql -u root mysql
3. UPDATE user SET authentication_string=PASSWORD('newpass') WHERE User='root';
4. FLUSH PRIVILEGES;
5. 重啟正常服務
落地執行清單
[ ] 所有連線強制 TLS 1.2+
[ ] validate_password 強策略啟用
[ ] 應用帳號單庫 DML 權限
[ ] 防火牆僅放行應用 IP:3306
[ ] bind-address 內網 IP
[ ] 資料目錄 700 權限
[ ] 審計插件接入日誌平台
[ ] 月度 CVE 掃描修補
[ ] 季度權限複核
[ ] 年度滲透測試