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

MySQL mysqld 安全啟動選項詳解:--secure、--skip-grant-tables、--skip-name-resolve、--skip-networking

     編輯:MySQL 資料庫相關知識

前言

`mysld` (MySQL Server 守護進程) 提供多個安全相關啟動選項,控制存取驗證、網路暴露面、主機名解析行為。正確配置這些選項是資料庫安全基線的核心組成部分。

四大安全選項深度解析

1. --secure (或 --secure-auth) — 強化認證與主機驗證

功能:

  • 啟用後,伺服器會對客戶端連線的 IP 進行**雙向 DNS 解析驗證**:先解析 IP → 主機名,再解析主機名 → IP,確認一致才允許連線
  • 防止 **DNS 欺騙/主機名偽裝** 攻擊
  • 隱含啟用 --secure-auth:拒絕使用舊版 (pre-4.1) 雜湊認證的客戶端連線

適用場景**:對外服務、不信任網路環境

副作用**:連線建立延遲增加 (DNS 查詢);若 DNS 不穩定可能導致合法連線失敗

建議**:生產環境啟用,並確保 DNS 基礎設施高可用;或改用 --skip-name-resolve 避免 DNS 依賴

2. --skip-grant-tables — 完全繞過權限系統 (極度危險!)

功能**:

  • 啟動時**不載入授權表** (mysql.user, db, tables_priv 等)
  • **所有連線擁有完整超級權限**,可存取任意資料庫、執行任意操作
  • 主要用途:**忘記 root 密碼時的緊急重置**

風險**:任何能連線埠的人都能完全控制資料庫

緩解措施 (若必須使用)**:

mysqld --skip-grant-tables --skip-networking --socket=/tmp/mysql_recovery.sock
# --skip-networking:禁止 TCP/IP 連線,僅允許本機 Unix socket
# --socket:指定非標準 socket 路徑,降低被發現機率

使用後必須**:正常重啟 mysqld (不帶此選項)、執行 FLUSH PRIVILEGES、驗證權限正常

3. --skip-name-resolve — 禁用主機名解析,僅允許 IP/localhost

功能**:

  • 完全跳過 DNS 正反向解析
  • mysql.user 表的 Host 欄**只能填 IP 位址、IP 範圍 (CIDR, 8.0+)、localhost**
  • 主機名 (如 app-server.example.com) 將無法匹配

優點**:

  • 消除 DNS 依賴與延遲
  • 防止 DNS 相關攻擊
  • 連線建立更快、更確定

遷移注意**:啟用前必須將所有現有帳號的 Host 值從主機名改為對應 IP

UPDATE mysql.user SET Host = '192.168.1.%' WHERE Host = 'app-server.example.com';
FLUSH PRIVILEGES;

4. --skip-networking — 完全禁用 TCP/IP 網路連線

功能**:

  • mysqld **不監聽任何 TCP 埠** (預設 3306)
  • **僅接受 Unix Domain Socket (Linux/Unix) 或 Named Pipe/Shared Memory (Windows) 連線**
  • 遠端客戶端 (含同機器的 127.0.0.1) **完全無法連線**

適用場景**:

  • 資料庫與應用**同一主機**、透過 Socket 通訊
  • 單機嵌入式應用
  • 安全強化:縮減攻擊面至零網路暴露

不相容**:

  • 使用 MIT-pthreads 的舊系統 (不支援 Unix Socket)
  • 任何需遠端存取的架構 (應用分離、複寫、備份工具、監控代理)

組合使用策略與最佳實務

部署架構推薦選項組合說明
標準雙機/叢集 (應用+DB 分離)--secure (預設) + 正確配置 bind-address + 防火牆 + SSL依賴 DNS 或 --skip-name-resolve + IP 白名單
同機應用 (單機部署)--skip-networking + Unix Socket零網路暴露、最高安全、最低延遲
雲端託管 (RDS/Cloud SQL)由雲廠商管理,通常 --skip-name-resolve + VPC 安全群組無法直接控制啟動參數
緊急密碼重置--skip-grant-tables --skip-networking --socket=/tmp/recovery.sock最小暴露窗口,用畢即重啟
高安全合規環境--skip-name-resolve --skip-networking (同機) 或 --skip-name-resolve + bind-address=內網IP + SSL消除 DNS 攻擊面、強制 IP 白名單

配置檔寫法

# /etc/my.cnf 或 /etc/mysql/my.cnf [mysqld] 區段
[mysqld]
# 安全基線
skip-name-resolve
# skip-networking  # 僅同機部署啟用
bind-address = 192.168.1.100  # 內網 IP,非 0.0.0.0
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  # 8.0+ 強制 SSL

# 密碼策略 (8.0+ validate_password 元件)
validate_password.length = 12
validate_password.policy = MEDIUM

驗證生效狀態

-- 檢查網路監聽
SHOW VARIABLES LIKE 'skip_networking';  -- ON/OFF
SHOW VARIABLES LIKE 'skip_name_resolve'; -- ON/OFF
SHOW VARIABLES LIKE 'secure_auth';       -- ON/OFF

-- 檢查連線方式
SHOW PROCESSLIST;  -- Host 欄顯示 IP 或 localhost

-- 測試 DNS 解析行為
-- 啟用 skip-name-resolve 後,主機名帳號應無法連線

總結

四大選項各有明確用途:**--secure** 強化認證、**--skip-grant-tables** 僅限緊急救援、**--skip-name-resolve** 消除 DNS 依賴、**--skip-networking** 徹底隔離網路。生產環境建議:**預設啟用 --secure + --skip-name-resolve + bind-address 內網 IP + SSL/TLS + 防火牆**,同機部署可加 **--skip-networking**。定期審核 mysql.user 確保 Host 欄符合策略。

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